Design by Contract (kurz DBC , englisch für Entwurf according Vertrag ) oder Programmierung durch Vertrag (, Vertragsbasierte Programmierung ‚) ist ein Konzept aus dem Bereich der Softwareentwicklung . Ziel ist das reibungslose Zusammenspiel einzelner Programme, die statische Definition hinausgehen. Entwickelt und eingeführt wurde von Bertrand Meyer mit der Entwicklung der Eiffel Programmersprache .
Grundprinzip
Die Reibungslose Zusammenspiel, wo Programmmodule Wird Durch eine „Vertrag“ erreicht, wo beispielsweise bei der verwendung Einer Methode einzuhalten ist. Dieser besteht aus
- Vorbedingungen (englische Vorbedingung ), auch die Zusicherungen, wer den Aufrufer einzuhalten hat
- Nachbedingungen (englische Nachbedingung ), auch de Zusicherungen, die der Aufgerufene irgendwann wird, sowie den
- Invarianten (englische Klasseninvarianten ), quasi dem Gesundheitszustand einer Klasse.
Der Vertrag Kann dich auf sterben gesamt verfügbare Informationen Beziehen, auch auf Variablen- und Parameter Inhalt ebenso Wie auf Objektzustände Dezember betroffenen objekt oder Anderen zugreifbarer Objekte. Soferne sich der Aufrufende ein Vorbedingungen und Invarianten HALT can keine Fehler auftreten und sterben Methode liefert garantiert keine Unerwartete ergebnisse.
Eine abgeschwächte Form von Verträgen wird in typisierten Sprachen vorbereitet, die die Typisierung der Ein- und Ausgabeparameter erreicht. Der Typ erklärt dabei Wertebereiche fest, die als Vor- und Nachbedingungen interpretiert werden können. Ein Typsystem ist kein Mitglied von Lage, Zusammenhänge Mehrerer Parameter oder Zusammenhänge zwischen Ein- und Ausgabewerten zu erfassen. Es Stellt DAHER Gegenüber Design by Eine abgeschwächte Deutlich Formular Vertrag , wo Absicherung dar, greift jedoch in der Dafür Regel BEREITS zur Übersetzungszeit, während sterben in Vertrag getroffenen Zusicherungen erst bei verletzung zur Laufzeit greifen.
Durch die Definition von Klasseninvarianten, Vor- und Nachbedingung kann ein Modul durch ein beliebiges und verändertes Exemplar ersetzt werden. Dafür müssen jedoch Auch verwöhnte Bezeichner und syntaktische Details wie Vor- und Nachbedingungen wurden gegeben.
Invarianten
Invarianten sin logien, die alle Instanzen einer Klasse für den gemeinsamen Object Lens Cycle belogen haben. Sie können in der Form von Klasseninvarianten auf lernen , der das Privateigentum der Klassen besitzt. Sie kennen die Implementierungsvarianten . Wenn Eine Überprüfung von Invarianten in entsprechendem System Jeweils nur vor und nach Einem Methoden-Aufruf ERFOLG Kann, Darf invariant Innerhalb von Methoden Durchaus tempore Verletzt Werden. Sie stellen insofern implizite Vor- und Nachdrücke jedes Methoden-Aufrufs dar. Eine Alternative zu diesem Ansatz Bestünde darin, Iliche Variablenzugriffe Methoden der MetaprogrammierungIn der Zwischenzeit ist die Invarianten zu verbieten. Dieser Ansatz wird in gängigen Realisierungen von Design durch Vertrag angeboten.
Vor- und Nachbedingungen
Jedem Unterprogramm wurden Vorbedingungen ( Vorbedingungen ) und Nachbedingungen ( Nachbedingungen ) zuordordnet. Die Vorbedingungen legen fest, unter bestimmten Umständen das Unterprogramm aufrufbar sein soll. Darf ein Unterprogramm zum Lesen aus einer Datei und dann aufgerufen werden, wenn die Datei vorher erfolgreich geöffnet wurde. Die Nachbedingungen leeren die Bedingungen, der Nachtablauf des Unterprogramufrufs ist gegeben.
Vor- und Nachbedingungen Werden als Boolesche Ausdrücke formuliert. Ist Eine Vorbedingung nicht Erfüllt (d H. Ihre Auswertung Ergibt. Falsch , auch „nicht zutreffend“) Liegt ein Fehler im aufrufenden – Code vor: Dort Hätte Dafür gesorgt Werden Müssen, sterben Dass Vorbedingung Erfüllt ist. Ist Eine Nachbedingung nicht Erfüllt, Liegt ein Fehler im Unter Programm selbst vor: Das Unter Programm hätte Dafür Trauer Müssen sterben Dass Nachbedingung Erfüllt ist.
Vor- und Nachbedingung das Bild DAHER Eine Art Vertrag (englisch Vertrag ): WENN die aufrufende – Code Vorbedingung Erfüllt sterben, Dann ist das Unter Programm verpflichtet, stirbt Nachbedingung zu erfüllen.
Unterklasse image und Vertrge
Liskov’sches Substitutionsprinzip
Wendet man das liskovsche Substitutionsprinzip auf Vor- und Nachbedingungen an, erhält man folgende Aussage:
- Sind vor dem Aufruf einer Metode der Unterklasse der Vorbedingungen der Oberklasse erfüllt, so müssen sie die Methode der Nachbedingungen der Oberklasse erfüllen.
Stirbt Bedeutende that Eine Methode Wacholder Unter Klasse bei der Gestaltung ihrer Vor- und Nachbedingungen nicht frei ist: Sie Muss minde Freund der Durch Vor- und Nachbedingungen formuliert „Vertrag“ erfüllen sterben. Das heißt, sie sterben Darf nicht Vorbedingungen verschärfen (sie Darf vom aufrufenden-Code nicht mehr verlangen als in der Oberklasse verlangt), und sie Darf Nachbedingungen nicht aufweichen (sie minde Muss Freundes so viel Garantie Schulter Wie die Oberklasse) sterben.
Zusammenfassung der Vertragsbedingungen von Subklassen
Unterklassen müssen bei Design by Contract folgenden Regeln der Oberklassen bevolgen:
- Gleiche oder stärkeere Invariante
- same oder schwächere Vorbedingungen (bezüglich der Methoden )
- same oder stärkere Nachbedingungen (bezüglich der Methoden)
Formale Lektüre der Beziehung von Super- und Subklasse von Vor- und Nachbedingungen wie folgt ausdrücken:
Vorbedingung super → Vorbedingung sub Nachbedingung sub → Nachbedingung super
Überprüfung der Vertragsbedingungen von Subklassen
Die erfüllung der im vorigen absatz beschriebenen logistic chen Implikationen lassen sich algorithmisch nur sehr Aufwand opinions ( Erfüllbarkeitsproblem ). Man greift DAHER bei current Realisierungen Auf einen Trick zurück:
- Diese Vorbedingungen waren disjunktiv (mein logisches Wort ODER) verknüpft. Dadurch weiß man, dass Vorbedingung der Oberklasse nur abgeschwächt, aber nicht verschärft werden kann.
- Diese Nachbedingungen wurden konjunktival (logisches UND) verwendet. Hier ist es möglich, dass sich die Nachbedingung verschiebt, aber nicht abgeschwächt.
- Invarianten waren ebenfalls konjunktival betroffen.
Grenzen des Verfahrens
Design by Contract Kann nur auf Softwareeigenschaften Angewandte Werden, sterben sie Auch als Vor- und Nachbedingung formulieren lassen. Bedingungen wie „vor Routine A Muss Routine B aufgerufen Worden sein“ lassen sich über Statusvariablen abbilden. Das Bedeutende Einerseits erhöhten Aufwand für sterben Programmierung der Klasse, andererseits can Verwender Darauf verzichten, ein derart ausgerüstetes Objekt dauerhaft unter ihrer Kontrolle zu halten, Sondern es can eine andere Die Leistung von weiterreichen und hinterher auf ETWA Statusänderungen reagieren. Ähnlich can bedingungen wie „Routine A ruft in IHREM Verlauf immer Auch Routine B auf“ (gerade im Bereich objektorientierten wichtig) über Nachbedingungen und Modulinvarianten gefasst Werden.
Stützt sich Eine invariant auf Hilfsobjekte, Kann sterben invariant Durch Aliasing Zerstört Werden. Werden invariant addition to Beginn Jeder Unterroutine geprüft, Kann Zerstörung sterben , wo invariant Zwar verlässlich diagnostiziert Werden, Bevor das Programm Wacholder Sölch Invariantenverletzung Fehlentscheidungen trifft aufgrund, doch erhalten , wo Programmierer Keinen Hinweis Darauf, wo der Alias Erzeugt Wurde und bei Welcher Modifikation Dezember Hilfsobjekts invariant sterben tatsächlich Zerstört Wurde.
Werden sterben semantika Eines Unter Programm Vollständig in Vorbedingungen, Nachbedingungen, und Modulinvarianten gefasst, erhält Mann Eines funktionale Spezifikation des Unter – Programm, in der die eigentlich Unter Programm prinzipiell Auch aus den Zusicherungen Generiert Werden Könne. Sekundärgeneratoren zum Schweißen der Compilertechniken für funktionale Programmierreparaturen ; insofern ein Zeigt bis zur Perfektion Getriebe vorgehen nach Design by Contract EINEN SCHRITT zur nächstabstrakteren Programmiermethodik abhängt.
Sprachunterstützung
Einige Weniger verbreitete Programmiersprachen Wie D und Eiffel unterstützen Design by Contract zumindest Teilweise nativen, Auch Ada seit Ada 2012. Das .NET Framework Enthält ab Version 4.0 Eine Klassenbibliothek (vor Allem im Namensraum System.Diagnostics.Contracts
), sterben Auch als – Code Verträge bezeichnet Wird, zur Implementierung von Design durch Vertrag. [1] Das Bean Validation Konzept bietet in Java Same möglichkeit, daruber Hinaus ist es seit der JavaBean Validation 1.1 Möglich, Vor- und Nachbedingungen direkt in Methodenheadern Profilierung mittels Annotations umzusetzen. [2] [3] Dies zu einem schönen OValoder Java Modeling Language (Kurz JML) [4] in Java Möglich. Andere Implementierungen Wie beispielsweise GContracts [5] für stark Benutzt APIs für Compiler-Erweiterung um entsprechende Sprachelemente hinzuzufügen.
Siehe auch
- Prinzipien objektorientierten Designs – weitere Prinzipien objektorientierten Designs
Weblinks
- Design by Contract als Seminarmitteilung (PDF; 184 KB)
- Design nach Auftrag im Eiffel-Tutorial (englisch)
Einzelnachweise
- Hochspringen↑ msdn.microsoft.com
- Hochspringen↑ Parametereinschränkungen mittels Java Bean Validation 1.1
- Hochspringen↑ Rückgabewerte mit Java Bean Validation 1.1
- Hochspringen↑ http://www.eecs.ucf.edu/~leavens/JML//index.shtml Abgerufen am 6. Februar 2015
- Hochspringen↑ github.de