Dépendances entre modules : choisir qui dépend de qui
Une dépendance détermine quels modules devront changer ensemble. Un exemple de facturation pour choisir son sens, isoler les détails et éviter les cycles.
Article
Un module perd son autonomie quand ses règles et ses données se dispersent. Voici les signes à examiner et les moyens de garder des frontières compréhensibles.
Une petite modification du panier demande maintenant de changer trois modules. Pour comprendre une règle, il faut suivre des appels dans toute l'application. Ce sont des signes que les responsabilités se sont dispersées. Examiner quelques situations concrètes permet de corriger le découpage avant que chaque évolution devienne difficile.
Le « client » de l'inscription possède des identifiants de connexion. Celui de la facturation possède une adresse et des informations de paiement. Le mot est identique, mais les responsabilités diffèrent.
Cette différence n'est pas un défaut en soi : elle peut justifier des modèles distincts. Le problème apparaît lorsqu'une classe commune tente de répondre à tous les usages et change pour des raisons sans rapport entre elles.
Définissez alors ce que chaque module entend par ce terme. Des noms plus précis ou des contrats limités peuvent éviter de partager tout le modèle.
Le panier importe les classes internes des commandes, tandis que les commandes importent celles du panier. Ce cycle rend plus difficile la compréhension et le test séparé de chaque partie.
Avant d'ajouter un nouvel appel, demandez quelle responsabilité crée ce besoin. Plusieurs réponses sont possibles :
Un événement ne supprime pas magiquement la dépendance métier. Il change la manière de la porter et peut ajouter un délai. Le choix doit simplifier le parcours, pas seulement faire disparaître une flèche du diagramme.
Un module « Panier » conserve des lignes, mais d'autres modules calculent ses remises et modifient directement ses quantités. Chaque consommateur doit alors connaître les mêmes règles, avec le risque de les appliquer différemment.
Ce qui compte est d'identifier le responsable de la décision. Le regroupement des règles peut passer par des objets métier ou par des fonctions dédiées. Un style de programmation fonctionnel ou une séparation entre données et traitements ne constitue pas, à lui seul, un défaut d'architecture.
Si une opération demande sans cesse tous les objets internes d'un voisin, examinez la frontière. Un contrat plus adapté peut suffire ; parfois, déplacer la responsabilité et ses données est plus simple.
Un module qui gère à la fois les stocks, les factures et les notifications peut devenir difficile à modifier. Pour le vérifier, regardez les changements récents : concernent-ils un même besoin ou plusieurs sujets indépendants ?
La taille du code donne un indice, mais ne tranche pas seule. Un module volumineux peut rester cohérent ; un petit module peut concentrer des dépendances problématiques.
Un composant utilisé partout mérite aussi un examen. Une bibliothèque stable peut remplir ce rôle correctement. Un module métier qui change souvent et oblige tous ses consommateurs à suivre devient plus préoccupant.
Le core domain du DDD désigne ce qui apporte une valeur distinctive à l'activité. Il n'est pas défini par le nombre de dépendances qui pointent vers lui. Un dossier nommé « core » peut, lui, ne contenir que des utilitaires.
Ces noms ne permettent donc pas de décider si un partage est pertinent. Examinez les responsabilités, leur stabilité et les changements qu'elles imposent aux autres.
Le langage, les modules de compilation et la visibilité des types peuvent limiter les imports autorisés. Des tests d'architecture, comme ceux proposés par ArchUnit, peuvent détecter les cycles et les accès à des classes internes.
Ces contrôles complètent la revue de conception. Ils vérifient une règle explicite, mais ne peuvent pas décider seuls si la frontière métier est bien placée.
Pour un module donné, définissez ses points d'entrée, ses données et les dépendances permises. Puis vérifiez une modification réelle : peut-elle rester locale ? Cette observation donne un critère plus utile qu'un nombre idéal de modules.
Le monolithe modulaire facilite ces ajustements en conservant un déploiement commun. Il permet de faire évoluer les frontières avant d'envisager une séparation en services.
Explorer
Choisis dans l’index d’après les étiquettes de cet article — les plus proches d’abord, hors de sa série. Rien n’est écrit à la main : un article publié demain avec les mêmes étiquettes y prendra place.
Une dépendance détermine quels modules devront changer ensemble. Un exemple de facturation pour choisir son sens, isoler les détails et éviter les cycles.
Appel direct, observation, médiateur ou contrat partagé : comment relier deux modules, choisir la responsabilité de chacun et repérer les dépendances en boucle.
Laisser un commentaire
Votre commentaire sera relu avant d'être publié.