Qu'est-ce qu'un Design by Contract®?
Design by Contract® est une méthode utilisée pour développer un logiciel qui repose sur l'établissement de paramètres d'interface bien définis, ou contrats, pour toutes les parties d'un programme. Bien que Design by Contract® puisse être considéré comme un style de développement conceptuel implémenté par la documentation ou la modélisation, il est plus généralement utilisé pour faire référence à un mécanisme natif ou tiers dans certains langages de programmation qui nécessite réellement le codage implicite des contrats au sein un programme. Le but de l'utilisation de Design by Contract® est qu'un programme soit développé et, à terme, codé de manière beaucoup plus complète afin d'éliminer les erreurs les plus triviales, tandis que l'application des contrats par la langue de support facilite la détection et la capture des erreurs résiduelles. Un programme qui utilise des contrats pour des fonctions et des classes peut avoir une conception plus modulaire dans laquelle des classes individuelles peuvent être facilement réutilisées dans d’autres programmes en raison de la définition claire de leurs contrats.
La philosophie de programmation Design by Contract® repose sur l'idée de contrats commerciaux réels. Dans ce modèle, chaque méthode et classe d'un programme orienté objet définit un contrat par lequel toute autre méthode ou tout objet interagissant avec elle doit respecter. Chaque classe peut également avoir un contrat, appelé invariant de classe, qu'elle doit suivre en interne pour s'assurer que les contrats externes ne compromettent pas sa capacité à fonctionner.
Les deux parties d’un contrat qui sont les plus importantes lors de la conception et de la codification sont les conditions préalables et les conditions postérieures. Ces deux parties du modèle Design by Contract® définissent l'état du programme avant l'appel d'une méthode et l'état du programme une fois l'exécution de la méthode terminée. D'autres parties d'un contrat peuvent varier en fonction de la mise en œuvre, mais peuvent inclure des références croisées vers d'autres modules, des conditions de synchronisation et des exigences d'ordre d'exécution.
En développant des contrats pour chaque classe et méthode, l’interaction des différentes parties d’un programme peut facilement être cartographiée et prédite. L’application des contrats, par le biais d’assertions ou d’autres mécanismes, garantit également que le programme ne tentera pas de s’exécuter en cas de violation des contrats, car toute sortie produite dans cet État serait techniquement non valide. Lorsqu'il est mis en œuvre en tant que fonctionnalité en langue maternelle, Design by Contract® peut aider à garantir qu'un produit final fonctionnera comme prévu avec peu de chance d'erreurs imprévues.
Certaines des complications associées à l'utilisation de la philosophie Design by Contract® incluent des temps de conception plus longs et un développement plus granulaire d'un système avant le début du codage, ce qui peut parfois être difficile avec un projet de grande envergure. Plus concrètement, le mécanisme de validation de contrat utilisé dans un langage de programmation prenant en charge de manière native les contrats peut ralentir l'exécution du programme. Une mauvaise compréhension de la méthodologie Design by Contract® peut conduire à un programme qui utilise des contrats pour effectuer une vérification d'erreur de base, pouvant conduire à une application sujette à des collisions soudaines après la publication.