Muster eines einfachen erbteilungsvertrages

Die Möglichkeit, die Zuweisung x := Leere für x eines beliebigen Referenztyps zu akzeptieren (siehe “Grundlegende Operationen” ) ist eine Folge der Type Conformance-Regel, da Void vom Typ NONE ist, der durch Konstruktion (“Die globale Vererbungsstruktur” ) allen Typen entspricht. Der Entwurfs-für-Vertrag-Ansatz wird häufig als Komponententest betrachtet, da er in der Nähe des Codes der zu testenden Anwendung liegt. Außerdem gibt es viele Diskussionen über Test-Driven-Development (TDD) vs Design-by-Contract (DbC). Tatsächlich werden beide Techniken verwendet, um die Spezifikation der Anwendung zu verbessern. TDD ist jedoch Sache des Entwicklungsteams, um Testfälle vor der Codeproduktion zu analysieren, während DbC allgemeiner im Umfang ist, obwohl es auch vom Entwicklungsteam verwendet werden kann. Konkret ordnet TDD eine Assertion (true oder false) den erwarteten Werten zu, die von einem Aufruf oder einer Aktion zurückgegeben werden. In DbC können Sie jedoch komplexere Prädikate verwenden, um anspruchsvollere Eigenschaften mithilfe einer Sprache auf höherer Ebene zu beschreiben. Die drei Ansätze haben unterschiedliche Möglichkeiten, die gleiche technische Schwierigkeit zu bewältigen: Wie kann sichergestellt werden, dass der Logikvertrag keine Zustandsvariablen überschreibt, die im Proxy für die Erweiterbarkeit verwendet werden. Diese Beobachtungen schlagen Möglichkeiten vor, aus einem Klassentext eine Version zu erstellen, die funktional und assertionsmäßig äquivalent ist, aber keine Vererbungsabhängigkeit hat.

Dies wird als Flat Form der Klasse bezeichnet. Es ist ein Klassentext, der keine Vererbungsklausel hat und alle Features der Klasse enthält, sofort (in der Klasse selbst deklariert) sowie vererbt. Bei den geerbten Features muss die flache Form selbstverständlich alle Feature-Anpassungsmechanismen berücksichtigen: Umbenennung (jedes Feature muss unter seinem endgültigen Namen erscheinen), Neudefinition, Wirkung, Unwirkung und Änderung des Exportstatus. Für neu deklarierte Features sind andere Klauseln mit den Vorbedingungen der Vorläufer erforderlich oder werden dann mit den Postbedingungen der Vorläufer ergänzt. Bei Invarianten sind alle Ahnenklauseln verkettet. Infolgedessen ergibt die flache Form einen Blick auf die Klasse, ihre Merkmale und ihre Behauptungen, die genau der Sicht der Kunden und (mit Ausnahme von polymorphen Verwendungen) Erben entsprechen. Explizite Verträge sind in jedem Fall von Vorteil, wenn sie bereits vorhanden sind – z. B. bei der nachfolgenden Erstellung von Komponententests für vorhandene Software (siehe auch Kapitel 15, Abschnitt 15.1) – und wenn es darum geht, Schnittstellen für externe Entwicklungsteams zu definieren und zu dokumentieren. Wenn wir auch eine entsprechende DBC-Erweiterung verwenden, können wir die Anzahl der Komponententests reduzieren, die von denen geschrieben werden müssen, die den Vertrag an anderer Stelle überprüft haben. Schnittstellen ähneln abstrakten Verträgen, sind jedoch auf das beschränkt, was das ABI des Vertrags darstellen kann. Mit anderen Worten, Sie könnten ein ABI in eine Schnittstelle konvertieren, oder umgekehrt, und es würden keine Informationen verloren gehen.

Nach den Solidity-Dokumenten haben sie einige zusätzliche Einschränkungen. Zum Beispiel: Erinnern Sie sich an den berüchtigten Parity Wallet Multisig Hack, bei dem 150.000 ETH gestohlen wurden? Während des Angriffs wurde ein Fehler im Parity Multisig Wallet Contract ausgenutzt und hochkarätige Geldbörsen wurden von ihrem Geld entleert. Die einzige Versöhnung, die getan werden konnte, war zu versuchen, schneller als der Hacker zu sein und die gleiche Verwundbarkeit auszunutzen, um die verbleibenden Brieftaschen zu hacken, um die ETH nach dem Angriff an ihre rechtmäßigen Besitzer weiterzuverteilen. Dieser Begriff kann erweitert werden, um den Typ durch mehrere Ebenen der Abgelegenheit zu deklarieren, so dass Muster wie die folgenden gültig sein können: Das Problem ist, Subunternehmer ehrlich zu halten.