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.

Structure 1 : A connaît B
Structure 1 — A connaît B : A est le cas d'usage, B la capacité appelée.

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.

Structure 2 : B connaît A
Structure 2 — B connaît A : B est le véritable initiateur.

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.

Structure 3 : C connaît A et B
Structure 3 — C connaît A et B : un médiateur orchestre, A et B s'ignorent.

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.

Structure 4 : A et B connaissent C
Structure 4 — A et B connaissent C : ils dépendent d'un contrat partagé.

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.

Cycle direct : A connaît B et B connaît A
Cycle direct — A et B se connaissent mutuellement : aucun n'évolue ni ne se déploie seul.
Cycle indirect : A connaît B, B connaît C, C connaît A
Cycle indirect — la boucle se referme par un tiers ; chaque flèche, isolée, semble innocente.

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.