Afferent
Wenn etwas eine Reihe verschiedener Dinge verwendet (hohe Anzahl afferenter Kopplungen), kann es leicht brechen, wenn sich eines dieser Dinge ändert.
Instabilität = 1
Efferent
Wenn etwas von einer Reihe verschiedener Dinge verwendet wird (hohe Anzahl von efferenten Kopplungen), kann es dazu neigen, viele Dinge zu zerbrechen, wenn es sich ändert.
Instabilität = 0
Stabilität
Martins Definition von "Stabilität" ist eine exotische Mischung zwischen "schwer zu ändern" und "nur wenige Gründe zu ändern". Seine Instabilitätsmetrik beschreibt jedoch nur "Schwierigkeit der Veränderung". "Gründe für Änderungen" haben viel mehr mit Faktoren zu tun, die nicht einfach zu berechnen sind, z. B. das angemessene Entwerfen Ihrer Schnittstellen auf einer angemessenen Abstraktionsebene und ein klareres Verständnis der Anforderungen des Benutzers im Voraus.
Eine hochefferente Kopplung mit einer niedrigen afferenten Kopplung führt zu Stabilität (wie bei etwas, das schwer zu ändern ist, da es ein paar Dinge zerbricht), das Gegenteil führt zu Instabilität (wie bei etwas, das leicht zu ändern ist, da es ein paar Dinge nicht bricht). .
Eine große Anzahl afferenter Kopplungen könnte ein Indikator dafür sein, dass Ihr Design nicht fokussiert ist - es verwendet eine ganze Reihe verschiedener Dinge, sodass es möglicherweise an einer klaren, einzigartigen Verantwortung mangelt.
Eine große Anzahl von efferenten Kupplungen könnte zunächst als eine wirklich gute Sache interpretiert werden, da dies darauf hinweist, dass Ihr Design weit verbreitet (wieder) verwendet wird. Das wäre jedoch schlecht, wenn Sie versucht wären, das Design häufig so zu ändern, dass alles kaputt geht. Mit einer großen Anzahl von efferenten Kupplungen kommt daher die Notwendigkeit, dass solche Pakete "wenige oder keine Gründe für eine Änderung" haben. Die Designs sollten im idealen Sinne stabil sein, da sie keine Gründe für Änderungen haben, da sie ebenfalls sehr schwer zu ändern sind.
Prinzip der stabilen Abstraktionen
Konzepte wie die Abhängigkeitsinversion (die natürlich eine Abhängigkeitsinjektion erfordert) und SAP (Prinzip der stabilen Abstraktion) legen nahe, dass Abhängigkeiten in Richtung Abstraktionen fließen. Und es gibt einen einfachen Grund, warum, wenn man die "Stabilität" im Zusammenhang mit "wenigen Gründen zur Änderung" betrachtet. Eine abstrakte Schnittstelle erwähnt keine konkreten Details, sie konzentriert sich nur auf "was zu tun ist" anstatt auf "was Dinge sind" und hat daher weniger Gründe, sich zu ändern. Der beschleunigte Grafikport auf unseren Motherboards (abstrakte Benutzeroberfläche) hat weniger Gründe für eine Designänderung als die GPU, die daran angeschlossen wird (ein konkretes Detail).
Wiederverwendbarkeit vs. Wiederverwendung
Eine persönliche Art von Metrik, wenn ich eine vorschlagen kann, die etwas mit Martins kollidiert, ist diese Vorstellung, die ich gerne vorantreibe, dass die wiederverwendbarsten Bibliotheken versuchen sollten, anderen Code minimal wiederzuverwenden. Dies führt dazu, dass die Instabilität auf eine harte 0 steigt. Dies geschieht aus praktischen Gründen, um minimale Gründe für Änderungen zu haben, aber auch, um die am einfachsten zu implementierende Bibliothek zu fördern. Eine universell einsetzbare, weit verbreitete Bibliothek, die von einem Dutzend verschiedener Bibliotheken abhängt, hat viele Gründe für Änderungen sowie eine umständlich gebündelte Distribution, deren Bereitstellung schwierig sein kann. Der Unterschied besteht darin, dass sich "Gründe für Änderungen" in meinem Fall sogar auf die Implementierung erstrecken, da sie aus einer bibliotheksorientierten Sicht stammen, die stabile Versionen der Bibliothek veröffentlichen möchte. Martin könnte die Implementierung als einen sehr separaten Teil abwerten,
Aus Sicht der Verteilung verschwimmen Implementierung und Schnittstelle, um Benutzerabhängigkeiten zu einer stabilen oder instabilen Bibliothek zu erhalten. Aus Sicht der Schnittstelle wird nur die Schnittstelle verwendet und die zugehörigen Implementierungsdetails sind vollständig getrennt.