Wat is een Design by Contract®?
Design by Contract® is een methode die wordt gebruikt om software te ontwikkelen die afhankelijk is van het opstellen van goed gedefinieerde interfaceparameters of contracten voor alle delen van een programma. Hoewel Design by Contract® kan worden gezien als een conceptuele ontwikkelingsstijl die wordt geïmplementeerd door middel van documentatie of modellering, wordt het op grotere schaal gebruikt om te verwijzen naar een native of extern mechanisme in sommige programmeertalen waarvoor de impliciete codering van de contracten binnen de programmeertaal vereist is een programma. Het doel van het gebruik van Design by Contract® is dat een programma zal worden ontwikkeld en uiteindelijk op een veel completere manier wordt gecodeerd waardoor meer triviale fouten worden verwijderd, terwijl handhaving van de contracten door de ondersteunende taal ervoor zorgt dat eventuele resterende fouten gemakkelijk kunnen worden gevonden en vastgelegd. Een programma dat contracten gebruikt voor functies en klassen kan een meer modulair ontwerp hebben waarin individuele klassen gemakkelijk kunnen worden hergebruikt in andere programma's vanwege de duidelijke definitie van hun contracten.
De basis voor de programmeerfilosofie van Design by Contract® is het idee van zakelijke contracten in de echte wereld. In dit model definieert elke methode en klasse in een objectgeoriënteerd programma een contract waaraan elke andere methode of elk object dat ermee in wisselwerking staat moet voldoen. Elke klasse kan ook een contract hebben, een klasse-invariant genaamd, dat intern moet worden gevolgd om te waarborgen dat externe contracten het vermogen om te functioneren niet in gevaar brengen.
De twee delen van een contract die het belangrijkst zijn tijdens het ontwerp en de codering zijn de randvoorwaarden en de randvoorwaarden. Deze twee delen van het Design by Contract®-model definiëren de status van het programma voordat een methode wordt aangeroepen en de status van het programma nadat de methode is uitgevoerd. Andere delen van een contract kunnen per implementatie verschillen, maar kunnen kruisverwijzingen naar andere modules, synchronisatievoorwaarden en vereisten voor de uitvoering omvatten.
Door contracten voor elke klasse en methode te ontwikkelen, kan de interactie van de verschillende delen van een programma eenvoudig in kaart worden gebracht en worden voorspeld. De handhaving van de contracten, hetzij door het gebruik van beweringen of andere mechanismen, zorgt er ook voor dat het programma niet zal proberen uit te voeren als er een schending van contracten is, omdat elke output die in die staat wordt geproduceerd technisch gezien toch ongeldig zou zijn. Indien geïmplementeerd als een functie in de moedertaal, kan Design by Contract® helpen ervoor te zorgen dat een eindproduct werkt zoals verwacht met weinig kans op onvoorziene fouten.
Enkele van de complicaties die gepaard gaan met het gebruik van de Design by Contract®-filosofie zijn langere ontwerptijden en een meer gedetailleerde ontwikkeling van een systeem voordat de codering begint, wat soms moeilijk kan zijn met een groot project. Meer praktisch kan het contractvalidatiemechanisme dat wordt gebruikt in een programmeertaal die native contracten ondersteunt, de uitvoering van het programma vertragen. Een slecht begrip van de Design by Contract®-methodiek kan leiden tot een programma dat contracten gebruikt om elementaire foutcontroles uit te voeren, wat mogelijk kan leiden tot een toepassing die na de release vatbaar is voor plotse crashes.