Afférent
Si quelque chose utilise un tas de choses différentes (nombre élevé de couplages afférents), il pourrait être susceptible de se casser si l'une de ces choses change.
Instabilité = 1
Efférent
Si quelque chose est utilisé par un tas de choses différentes (nombre élevé de couplages efférents), il pourrait être enclin à casser beaucoup de choses s'il change.
Instabilité = 0
Stabilité
La définition de Martin de la «stabilité» est un mélange exotique entre «difficile à changer» et «ayant peu de raisons de changer». Pourtant, sa métrique d'instabilité ne décrit que "la difficulté du changement". Les «raisons de changer» auront beaucoup plus à voir avec des facteurs qui ne peuvent pas être facilement calculés, comme la conception appropriée de vos interfaces, à un niveau d'abstraction approprié, et la compréhension plus claire des exigences de l'utilisateur.
Donc, un couplage efférent élevé avec un couplage afférent faible donne de la stabilité (comme dans quelque chose de difficile à changer car il cassera un tas de trucs), l'inverse génère une instabilité (comme dans quelque chose de facile à changer car il ne cassera pas un tas de choses) .
Un grand nombre de couplages afférents pourrait être un indicateur que votre conception manque de concentration - elle utilise tout un tas de choses différentes, donc il lui manque peut-être une responsabilité claire et singulière.
Un grand nombre de couplages efférents pourraient initialement être interprétés comme une très bonne chose, car cela indique que votre conception est largement (ré) utilisée. Pourtant, ce serait mauvais si vous êtes tenté de changer souvent le design de manière à tout casser. Ainsi, avec un grand nombre de couplages efférents, il est nécessaire que ces boîtiers aient "peu ou pas de raisons de changer". Les dessins doivent être stables dans le sens idéal de ne pas avoir de raisons de changer, car ils seront également très difficiles à changer.
Principe d'abstractions stables
Des concepts comme l'inversion de dépendance (qui appelle naturellement l'injection de dépendance) et SAP (principe d'abstractions stables) suggèrent tous que les dépendances se dirigent vers les abstractions. Et il y a une raison simple pour considérer la "stabilité" dans le contexte d'avoir "peu de raisons de changer". Une interface abstraite ne mentionne aucun détail concret, elle se concentre uniquement sur "ce qu'il faut faire" au lieu de "ce que sont les choses", et a donc moins de raisons de changer. Le port graphique accéléré de nos cartes mères (interface abstraite) a moins de raisons de subir une modification de conception que le GPU qui s'y branche (un détail concret).
Réutilisation vs réutilisation
Une sorte de métrique personnelle, si je peux en suggérer une qui entre quelque peu en collision avec celle de Martin, est cette notion que j'aime pousser à ce que les bibliothèques les plus réutilisables devraient chercher à réutiliser au minimum d'autres codes. Cela pousse l'instabilité vers un 0 difficile. C'est pour des raisons pratiques d'avoir des raisons minimales de changer, mais aussi pour promouvoir la bibliothèque la plus facile à déployer. Une bibliothèque polyvalente et largement utilisée qui dépend d'une douzaine de bibliothèques différentes a de nombreuses raisons de changer, ainsi qu'une distribution groupée maladroitement qui peut être difficile à déployer. La différence ici est que les "raisons de changer" dans mon cas s'étendent même à l'implémentation, car elles proviennent d'une vue orientée bibliothèque qui cherche à publier des versions stables de la bibliothèque. Martin pourrait ignorer la mise en œuvre en tant que partie très distincte,
Du point de vue de la distribution, l'implémentation et l'interface se confondent pour produire des dépendances utilisateur à une bibliothèque stable ou instable. Du point de vue de l'interface, seule l'interface est utilisée et les détails d'implémentation associés sont complètement séparés.