T&v Vertrag

Sind Verträge nur ein besserer Ersatz für die klassische Assertion() und sollten sie zusammen verwendet werden? Welche Verträge sind wirklich in einfachen Begriffen für eine Software-Entwicklung gesetzt ? Würde die Verwendung von Verträgen einen Overhead bei der Ausführung bedeuten? Werden wir zulassen, dass sie auf Release-Code deaktivieren? In Vorkonditionsverträgen können weiterhin Ausnahmen verwendet werden, da weiteres Verhalten nach Vertragsausfall nicht garantiert ist. Der Teil nach Bedingungen kann die Art und Weise ändern, wie Sie Mitexception behandeln, da Sie bei Verträgen sicherstellen müssen, dass das Auslösen einer Ausnahme Ihre Post-Bedingungen nicht bricht. Dies bedeutet in der Regel, dass Ihr Code eine Ausnahme sicher sein muss, ob dies eine starke Ausnahmegarantie oder eine Grundgarantie bedeutet, hängt jedoch von Ihren Bedingungen ab. Ich las über Verträge in Gedanken über C++17 von B. Stroustrup und half eine kleine Präsentation, die über sie sprach, aber ich bin nicht sicher, ob ich sie wirklich verstanden habe. Ein Konditionsvertrag des Indexierungsoperators einer Vector-Klasse könnte geschrieben werden: T& operator[](size_t i) [[erwartet: i `size()]]; Ähnlich könnte ein Post-Bedingungsvertrag auf einem Konstruktor einer ArrayView-Klasse wie: ArrayView(const vector& v) [[ensures: data() == v.data()]] ausgedrückt werden. Es ist jedoch ein kritisches Entwurfskriterium, dass Verträge in eingebetteten Systemen oder anderen ressourcenbeschränkten Systemen verwendet werden können, die keine Ausnahmen bieten können. Natürlich können Verträge, genau wie behaupten, einen Laufzeit-Overhead enthalten. Der Unterschied besteht jedoch darin, dass der Compiler, da Verträge als Teil der Deklaration der Funktion gesetzt werden können, bessere Optimierungen durchführen kann, z. B. die Bedingungen am Standort des Aufrufers auswerten oder sogar zum Zeitpunkt der Kompilierung auswerten kann.

Abschnitt 1.5 des dokuments, das am Anfang dieses Beitrags erwähnt wird, spricht über die Möglichkeiten, Verträge abhängig von Ihrer Buildkonfiguration abzuschalten, genau wie einfache alte Behauptungen. Einige Anwendungsfälle (wie ich annehmen kann, während ich nicht einmal in der Nähe der Entwicklung eines Vertragsentwurfs bin) Dies hilft, Code auf der Implementierungsseite zu bereinigen, denn bei Verträgen können wir davon ausgehen, dass, sobald die Ausführung innerhalb Ihrer Funktion gegangen ist, Ihre Argumente in einem gültigen Zustand sind (was Sie von ihnen erwarten).