Was ist ein Design by Contract®?
Design by Contract® ist eine Methode zur Entwicklung von Software, bei der für alle Teile eines Programms genau definierte Schnittstellenparameter oder Verträge festgelegt werden. Obwohl Design by Contract® als konzeptioneller Entwicklungsstil angesehen werden kann, der durch Dokumentation oder Modellierung implementiert wird, wird er in einigen Programmiersprachen häufiger verwendet, um auf einen systemeigenen Mechanismus oder einen Mechanismus eines Drittanbieters zu verweisen, für den die implizite Kodierung der Verträge tatsächlich erforderlich ist ein Programm. Das Ziel bei der Verwendung von Design by Contract® besteht darin, ein Programm zu entwickeln und letztendlich in einer viel vollständigeren Weise zu codieren, bei der mehr triviale Fehler beseitigt werden. Durch die Durchsetzung der Verträge durch die unterstützende Sprache können alle verbleibenden Fehler leicht gefunden und erfasst werden. Ein Programm, das Verträge für Funktionen und Klassen verwendet, kann modularer aufgebaut sein, sodass einzelne Klassen aufgrund der klaren Definition ihrer Verträge problemlos in anderen Programmen wiederverwendet werden können.
Die Grundlage für die Design by Contract®-Programmierphilosophie ist die Idee realer Geschäftsverträge. In diesem Modell definiert jede Methode und Klasse in einem objektorientierten Programm einen Vertrag, nach dem sich jede andere Methode oder jedes andere Objekt, das mit ihr interagiert, richten muss. Jede Klasse kann auch einen Vertrag haben, der als Klasseninvariante bezeichnet wird und intern befolgt werden muss, um sicherzustellen, dass externe Verträge ihre Funktionsfähigkeit nicht beeinträchtigen.
Die beiden Vertragsteile, die bei der Gestaltung und Kodierung am wichtigsten sind, sind die Voraussetzungen und die Nachbedingungen. Diese beiden Teile des Design by Contract®-Modells definieren den Status des Programms, bevor eine Methode aufgerufen wird, und den Status des Programms, nachdem die Methode ausgeführt wurde. Andere Teile eines Vertrags können je nach Implementierung variieren, können jedoch Querverweise auf andere Module, Synchronisationsbedingungen und Anforderungen an die Ausführungsreihenfolge enthalten.
Durch die Entwicklung von Verträgen für jede Klasse und Methode kann die Interaktion der verschiedenen Teile eines Programms leicht abgebildet und vorhergesagt werden. Die Durchsetzung der Verträge, entweder durch die Verwendung von Behauptungen oder anderen Mechanismen, stellt auch sicher, dass das Programm nicht versucht, eine Ausführung durchzuführen, wenn eine Vertragsverletzung vorliegt, da jegliche in diesem Zustand erzeugte Ausgabe sowieso technisch ungültig wäre. Bei der Implementierung als Muttersprachenfunktion kann Design by Contract® sicherstellen, dass ein Endprodukt erwartungsgemäß funktioniert und keine unvorhergesehenen Fehler auftreten.
Zu den Komplikationen, die mit der Anwendung der Design by Contract®-Philosophie verbunden sind, gehören längere Entwurfszeiten und eine genauere Entwicklung eines Systems vor dem Beginn der Codierung, was bei großen Projekten manchmal schwierig sein kann. Praktischer kann der in einer Programmiersprache, die Verträge nativ unterstützt, verwendete Mechanismus zur Vertragsvalidierung die Programmausführung verlangsamen. Ein schlechtes Verständnis der Design by Contract®-Methodik kann dazu führen, dass ein Programm Verträge verwendet, um grundlegende Fehlerprüfungen durchzuführen. Dies kann zu einer Anwendung führen, die nach der Veröffentlichung zu plötzlichen Abstürzen neigt.