www.wikidata.de-de.nina.az
contract ist eine Weiterleitung auf diesen Artikel Zum Kontrakt englisch contract in der Kanzleisprache siehe Kontrakt Design by contract kurz DbC englisch fur Entwurf gemass Vertrag oder Programming by Contract Vertragsbasierte Programmierung ist ein Konzept aus dem Bereich der Softwareentwicklung Ziel ist das reibungslose Zusammenspiel einzelner Programmmodule durch die Definition formaler Vertrage zur Verwendung von Schnittstellen die uber deren statische Definition hinausgehen Entwickelt und eingefuhrt wurde es von Bertrand Meyer mit der Entwicklung der Programmiersprache Eiffel Inhaltsverzeichnis 1 Grundprinzip 2 Invarianten 3 Vor und Nachbedingungen 4 Subklassenbildung und Vertrage 4 1 Liskov sches Substitutionsprinzip 4 2 Zusammenfassung der Vertragsbedingungen von Subklassen 4 3 Uberprufung der Vertragsbedingungen von Subklassen 5 Grenzen des Verfahrens 6 Sprachunterstutzung 7 Siehe auch 8 Weblinks 9 EinzelnachweiseGrundprinzip BearbeitenDas reibungslose Zusammenspiel der Programmmodule wird durch einen Vertrag erreicht der beispielsweise bei der Verwendung einer Methode einzuhalten ist Dieser besteht aus Vorbedingungen englisch precondition also den Zusicherungen die der Aufrufer einzuhalten hat Nachbedingungen englisch postcondition also den Zusicherungen die der Aufgerufene einhalten wird sowie den Invarianten englisch class invariants uber alle Instanzen einer Klasse hinweg geltende Grundannahmen Der Vertrag kann sich auf die gesamte verfugbare Information beziehen also auf Variablen und Parameter Inhalte ebenso wie auf Objektzustande des betroffenen Objekts oder anderer zugreifbarer Objekte Sofern sich der Aufrufende an Vorbedingungen und Invarianten halt konnen keine Fehler auftreten und die Methode liefert garantiert keine unerwarteten Ergebnisse Eine abgeschwachte Form von Vertragen wird in typisierten Sprachen bereits durch die Typisierung der Ein und Ausgabeparameter erreicht Der Typ legt dabei Wertebereiche fest die als Vor und Nachbedingungen interpretiert werden konnen Ein Typsystem ist jedoch nicht in der Lage Zusammenhange mehrerer Parameter oder Zusammenhange zwischen Ein und Ausgabewerten zu erfassen Es stellt daher gegenuber Design by contract eine deutlich abgeschwachte Form der Absicherung dar greift dafur jedoch in der Regel bereits zur Ubersetzungszeit wahrend die in Vertragen getroffenen Zusicherungen erst bei Verletzung zur Laufzeit greifen Durch die Definition von Klasseninvarianten Vor und Nachbedingung kann ein Modul durch ein beliebiges anderes ausgetauscht werden wenn dieses denselben Vertrag erfullt Hierzu mussen jedoch ggf auch verwendete Bezeichner und syntaktische Details als Vor und Nachbedingungen aufgefasst werden Invarianten BearbeitenInvarianten sind logische Aussagen die fur alle Instanzen einer Klasse uber den gesamten Objektlebenszyklus hinweg gelten Sie treten meist in Form von Klasseninvarianten auf die auch auf private Eigenschaften der betroffenen Klasse zugreifen durfen Man spricht daher auch von Implementationsinvarianten Da eine Uberprufung von Invarianten in aktuellen Systemen jeweils nur vor und nach einem Methoden Aufruf erfolgen kann durfen Invarianten innerhalb von Methoden durchaus temporar verletzt werden Sie stellen insofern implizite Vor und Nachbedingungen jedes Methoden Aufrufs dar Eine Alternative zu diesem Ansatz bestunde darin jegliche Variablenzugriffe mittels Methoden der Metaprogrammierung abzufangen und somit auch temporare Verletzungen der Invarianten zu verbieten Dieser Ansatz wird in gangigen Realisierungen von Design by contract bislang jedoch nicht verfolgt Vor und Nachbedingungen BearbeitenJedem Unterprogramm werden Vorbedingungen preconditions und Nachbedingungen postconditions zugeordnet Die Vorbedingungen legen fest unter welchen Umstanden das Unterprogramm aufrufbar sein soll Beispielsweise darf ein Unterprogramm zum Lesen aus einer Datei nur dann aufgerufen werden wenn die Datei vorher erfolgreich geoffnet wurde Die Nachbedingungen legen die Bedingungen fest die nach Abschluss des Unterprogrammaufrufs gegeben sein mussen Vor und Nachbedingungen werden als boolesche Ausdrucke formuliert Ist eine Vorbedingung nicht erfullt d h ihre Auswertung ergibt false also nicht zutreffend liegt ein Fehler im aufrufenden Code vor Dort hatte dafur gesorgt werden mussen dass die Vorbedingung erfullt ist Ist eine Nachbedingung nicht erfullt liegt ein Fehler im Unterprogramm selbst vor Das Unterprogramm hatte dafur sorgen mussen dass die Nachbedingung erfullt ist Vor und Nachbedingung bilden daher eine Art Vertrag englisch contract Wenn der aufrufende Code die Vorbedingung erfullt dann ist das Unterprogramm verpflichtet die Nachbedingung zu erfullen Subklassenbildung und Vertrage BearbeitenLiskov sches Substitutionsprinzip Bearbeiten Wendet man das liskovsche Substitutionsprinzip auf Vor und Nachbedingungen an erhalt man die folgende Aussage Sind vor dem Aufruf einer Methode der Unterklasse die Vorbedingungen der Oberklasse erfullt so muss die Methode die Nachbedingungen der Oberklasse erfullen Dies bedeutet dass eine Methode einer Unterklasse bei der Gestaltung ihrer Vor und Nachbedingungen nicht frei ist Sie muss mindestens den durch die Vor und Nachbedingungen formulierten Vertrag erfullen Das heisst sie darf die Vorbedingungen nicht verscharfen sie darf vom aufrufenden Code nicht mehr verlangen als in der Oberklasse verlangt und sie darf die Nachbedingungen nicht aufweichen sie muss mindestens so viel garantieren wie die Oberklasse Zusammenfassung der Vertragsbedingungen von Subklassen Bearbeiten Unterklassen mussen bei Design by Contract folgende Regeln bezuglich der Oberklassen befolgen gleiche oder starkere Invariante gleiche oder schwachere Vorbedingungen bezuglich der Methoden gleiche oder starkere Nachbedingungen bezuglich der Methoden Formal lasst sich die Beziehung von Super und Subklasse hinsichtlich der Vor und Nachbedingungen wie folgt ausdrucken Vorbedingungsuper Vorbedingungsub Nachbedingungsub Nachbedingungsuper Uberprufung der Vertragsbedingungen von Subklassen Bearbeiten Die Erfullung der im vorigen Absatz beschriebenen logischen Implikationen lassen sich algorithmisch nur sehr aufwandig uberprufen Erfullbarkeitsproblem Man greift daher bei aktuellen Realisierungen auf einen Trick zuruck Die Vorbedingungen werden disjunktiv mit logischem ODER verknupft Dadurch kann die Vorbedingung der Oberklasse nur abgeschwacht aber nicht verscharft werden Die Nachbedingungen werden konjunktiv logisches UND verknupft Hierdurch kann die Nachbedingung nur verscharft aber nicht abgeschwacht werden Invarianten werden ebenfalls konjunktiv verknupft Grenzen des Verfahrens BearbeitenDesign By Contract kann nur auf Softwareeigenschaften angewandt werden die sich auch als Vor und Nachbedingung formulieren lassen Bedingungen wie vor Routine A muss Routine B aufgerufen worden sein lassen sich uber Statusvariablen abbilden Das bedeutet einerseits erhohten Aufwand fur die Programmierung der Klasse andererseits konnen Verwender darauf verzichten ein derart ausgerustetes Objekt permanent unter ihrer Kontrolle zu halten sondern konnen es an andere Funktionen weiterreichen und hinterher auf etwaige Statusanderungen reagieren Ahnlich konnen Bedingungen wie Routine A ruft in ihrem Verlauf immer auch Routine B auf gerade im objektorientierten Bereich wichtig uber Nachbedingungen und Modulinvarianten gefasst werden Stutzt sich eine Invariante auf Hilfsobjekte kann die Invariante durch Aliasing zerstort werden Werden Invarianten zusatzlich zu Beginn jeder Unterroutine gepruft kann die Zerstorung der Invariante zwar verlasslich diagnostiziert werden bevor das Programm aufgrund einer solchen Invariantenverletzung Fehlentscheidungen trifft doch erhalt der Programmierer keinen Hinweis darauf wo der Alias erzeugt wurde und bei welcher Modifikation des Hilfsobjekts die Invariante tatsachlich zerstort wurde Wird die Semantik eines Unterprogramms vollstandig in Vorbedingungen Nachbedingungen und Modulinvarianten gefasst erhalt man eine funktionale Spezifikation des Unterprogramms aus der das eigentliche Unterprogramm prinzipiell mittels der Zusicherungen generiert werden konnte Derartige Generatoren lassen sich aus den Compilertechniken fur funktionale Programmiersprachen erstellen insofern zeigt ein bis zur Perfektion getriebenes Vorgehen nach Design By Contract einen Schritt zur nachstabstrakteren Programmiermethodik an Sprachunterstutzung BearbeitenEinige weniger verbreitete Programmiersprachen wie D und Eiffel unterstutzen Design by Contract zumindest teilweise nativ auch Ada seit Ada 2012 Das NET Framework enthalt ab Version 4 0 eine Klassenbibliothek vor allem im Namensraum System Diagnostics Contracts die auch als Code Contracts bezeichnet wird zur Implementierung von Design by Contract 1 Das Bean Validation Konzept bietet in Java dieselbe Moglichkeit daruber hinaus ist es seit der Java Bean Validation 1 1 moglich Vor und Nachbedingungen direkt in Methodenheadern mittels Annotations umzusetzen 2 3 Dies war zuvor schon uber das Framework OVal oder die Java Modelling Language kurz JML 4 in Java moglich Andere Implementierungen wie beispielsweise GContracts 5 fur Groovy benutzten APIs fur Compiler Erweiterungen um entsprechende Sprachelemente hinzuzufugen Siehe auch BearbeitenPrinzipien objektorientierten Designs weitere Prinzipien objektorientierten DesignsWeblinks BearbeitenDesign by Contract als Seminarbericht PDF 184 kB gruntz ch Design by Contract In Eiffel Tutorial englisch Einzelnachweise Bearbeiten msdn microsoft com Parameter constraints mittels Java Bean Validation 1 1 Return value constraints mittels Java Bean Validation 1 1 eecs ucf edu Abgerufen am 6 Februar 2015 github comVPrinzipien objektorientierten DesignsSOLID Prinzipien Single Responsibility Open Closed Liskovsches Substitutionsprinzip Interface Segregation Dependency InversionWeitere Prinzipien Gesetz von Demeter Design by Contract Datenkapselung Linguistic Modular Units Self Documentation Uniform Access Single Choice Persistence Closure Command Query SeparationPackaging Prinzipien Reuse Release Equivalence Common Closure Common Reuse Acyclic Dependencies Stable Dependencies Stable Abstractions Abgerufen von https de wikipedia org w index php title Design by Contract amp oldid 223398703