Article
Quatre façons d'orienter une dépendance — et leurs pièges
Entre deux modules, quatre façons seulement d'orienter une dépendance — A→B, B→A, médiateur, contrat partagé — et le piège de couplage propre à chacune.
On a tranché : entre A et B, l'un doit connaître l'autre. Reste à choisir comment. Il n'existe que quatre structures possibles, et chacune a son piège — sa façon de laisser le couplage se faufiler quand on l'emploie sans la choisir.
Dans l'article précédent, on s'est convaincu d'une chose : la question « qui connaît qui » se tranche avant d'écrire la connexion, jamais après. L'éventail des réponses est réduit : entre deux éléments A et B qui doivent échanger, il n'y a que quatre façons d'orienter la flèche. Les voici, chacune avec son usage et le piège qui la guette — un piège qui n'est jamais une structure de plus, mais cette structure-là employée sans avoir été choisie.
Les quatre structures
A connaît B. La forme la plus courante, souvent employée sans être choisie. A est le cas d'usage, B la capacité qu'il appelle : A sait s'adresser à B, B ignore A. C'est le bon sens quand A est le plus haut-niveau, le plus métier, et B un service plus stable et plus général. Le piège est le réflexe : poser cette flèche sans vérifier que B est bien le plus stable des deux. Sinon, on a câblé proprement une dépendance à l'envers — celle qui fait remonter chaque détail volatil jusqu'au cœur.
B connaît A. L'inverse, et il n'a rien d'anormal : il s'impose quand B est le véritable initiateur — quand c'est lui qui observe A, réagit à ses changements ou le pilote. Le piège est l'inversion cosmétique : retourner la flèche « pour faire propre », ajouter une interface, assainir le diagramme, alors que la responsabilité n'a pas bougé. Le sens suit qui porte la relation, pas l'esthétique du schéma.
C connaît A et B. Ni A ni B ne doit connaître l'autre : on intercale un tiers C qui les connaît tous les deux et orchestre l'échange. A et B restent mutuellement ignorants, chacun ne dépendant que de C. Utile pour découpler deux pairs sans raison de se lier directement. Le piège a un nom : le médiateur universel. On ajoute à C un cas, puis un autre, et de proche en proche il connaît tout ; il devient le nœud par lequel tout passe. Un médiateur se justifie pour un échange ciblé, pas comme passage obligé : sinon le couplage n'a pas disparu, il s'est concentré en un point, le plus difficile à défaire.
A et B connaissent C. La plus subtile. A et B ne se connaissent toujours pas ; au lieu de dépendre d'un orchestrateur, ils dépendent d'un même contrat — un port, une interface, un schéma de message. La dépendance pointe vers l'abstraction partagée, jamais d'un pair vers l'autre : c'est le socle du découplage par interfaces. L'événementiel n'y relève qu'à une condition exigeante : que le schéma de l'événement soit un contrat à part, possédé par aucun des deux. Si B s'abonne à un événement défini à l'intérieur du module de A, ce n'est pas un C neutre qu'il connaît, c'est A — et l'on est retombé dans la structure 2. Le piège est le bus magique : si le contrat C n'est pas explicite, nommé, possédé, mais « le bus » ou « les events » sans propriétaire ni schéma, le couplage circule par un intermédiaire que personne ne tient.
Ces quatre structures partagent les deux règles vues précédemment : la connaissance se place du côté qui porte la responsabilité, et aucune combinaison ne doit refermer un cycle, y compris indirect. Le reste est application : nommer A et B, repérer laquelle des quatre on emploie, vérifier qu'on l'a choisie plutôt que subie.
Le piège transverse : le cycle
Un piège ne se loge dans aucune structure en particulier : il naît de leur combinaison. C'est le cycle, le plus coûteux. Sa version directe — A connaît B et B connaît A — se repère facilement. Sa version indirecte est plus discrète : quand la boucle se referme par un tiers — A connaît B, B connaît C, C connaît A — chaque flèche, prise seule, est légitime. Le cycle n'existe que dans le graphe complet, que personne ne dessine. Il s'installe par accumulation de flèches raisonnables, pas par décision.
La difficulté du cycle indirect tient à un détail qu'on néglige : un abonnement compte comme une flèche. « On passe par des événements, donc c'est découplé » : faux. Consommer un événement, c'est dépendre du contrat de l'émetteur ; cette dépendance figure dans le graphe au même titre qu'un appel. L'oublier, c'est dessiner une boucle sans la voir.
Le couplage ne disparaît pas, il se déguise
Côte à côte, ces pièges se ressemblent : la dépendance à l'envers, l'inversion cosmétique, le médiateur qui enfle, le bus anonyme, le cycle invisible — chacun rend le couplage invisible, en le faisant passer par un tiers, un événement, une façade, une convention tacite. Le couplage ne disparaît pas ; quand on croit l'avoir supprimé, on l'a le plus souvent déplacé là où personne ne le regarde. Et un couplage qu'on ne voit plus est le plus cher : on ne le défait pas, on bute dessus.
Le remède est unique, en deux gestes : rendre chaque dépendance explicite et nommée, puis dessiner le graphe entier et y chercher la boucle. La question « qui connaît qui », posée et redessinée régulièrement, est moins une règle de plus qu'une hygiène — peu coûteuse quand elle est régulière, très coûteuse quand on l'oublie.
Laisser un commentaire
Vous devez être connecté pour pouvoir laisser un commentaire.