codebase-design
Conception de la base de code
Concevoir des modules profonds : beaucoup de comportement derrière une petite interface, placée de manière nette, testable via cette interface. Utilisez ce langage et ces principes partout où le code est conçu ou restructuré. L'objectif est d'avoir un effet de levier pour les appelants, une localité pour les responsables et une testabilité pour tout le monde.
Glossaire
Utilisez ces termes exactement et ne leur substituez pas « composant », « service », « API » ou « limite ». Tout l’intérêt est de conserver un langage cohérent.
Module — tout élément possédant une interface et une implémentation. Le terme est volontairement indépendant de l’échelle : fonction, classe, package ou tranche couvrant plusieurs niveaux. À éviter : unité, composant, service.
Interface — tout ce qu’un appelant doit savoir pour utiliser correctement le module : la signature de type, mais aussi les invariants, les contraintes d’ordre, les modes d’erreur, la configuration requise et les caractéristiques de performance. À éviter : API, signature — ces termes sont trop étroits et ne désignent que la surface des types.
Implémentation — ce qui se trouve à l’intérieur d’un module, c’est-à-dire son corps de code. Ce terme se distingue d’adaptateur : un élément peut être un petit adaptateur doté d’une grande implémentation — par exemple un dépôt PostgreSQL — ou un grand adaptateur doté d’une petite implémentation — par exemple un substitut en mémoire. Utilisez « adaptateur » lorsque la couture est le sujet, et « implémentation » dans les autres cas.
Profondeur — effet de levier offert par l’interface : quantité de comportements qu’un appelant — ou un test — peut exercer par unité d’interface à apprendre. Un module est profond lorsqu’une petite interface masque beaucoup de comportements, et peu profond lorsque son interface est presque aussi complexe que son implémentation.
Couture (Michael Feathers) — emplacement où l’on peut modifier le comportement sans modifier le code à cet endroit ; c’est l’emplacement de l’interface d’un module. Le placement de la couture constitue une décision de conception distincte de ce qui se trouve derrière elle. À éviter : limite, déjà surchargé par la notion de contexte délimité en DDD.
Adaptateur — élément concret qui satisfait une interface au niveau d’une couture. Le mot décrit un rôle — l’emplacement occupé — et non une substance — ce qui se trouve à l’intérieur.