Zum Wortlaut des Prinzips
In der ursprünglichen Fassung bezieht Martin das Prinzip wieder auf Packages:Wie auch für die anderen Package-Prinzipien ersetzt Martin später Package durch Component:"The classes in a package should be closed together against the same kinds of changes. A change that affects a package affects all the classes in that package.“ [Granularity1996]
Der Wortlaut ist in der Fassung von 2002 fast identisch geblieben und wurde nur durch die Forderung "and no other components" ergänzt, wodurch nochmals hervorgehoben wird, dass es insbesondere darum geht, die Auswirkungen künftiger Änderungen lokal einzuschränken."The classes in a component should be closed together against the same kinds of changes. A change that affects a component affects all the classes in that component and no other components.“ [Martin2002], Hervorhebung durch mich
Ich werde im weiteren Verlauf dieses Artikels wieder allgemein von "physischen Einheiten" sprechen, um überladene Begriffe wie Package oder Component zu vermeiden, siehe hierzu auch meine frühere Erläuterung.
Warum alle?
Beide Formulierungen von Robert C. Martin enthalten, wenn man sie wörtlich nimmt, eine etwas merkwürdig anmutende Forderung: Warum sollte es wünschenswert oder notwendigerweise so sein, dass bei Änderung irgendeines Details einer physischen Einheit alle Elemente der physischen Einheit zu ändern sind.Dies scheint weder wünschenswert noch immer der Fall zu sein, da die Modularisierung auf der Ebene der Typen doch hoffentlich in der Lage ist, bestimmte Änderungen vor anderen Typen zu verbergen. Freilich sind unerwünschte Seiteneffekte auch auf Typ-Ebene möglich, aber in einigen Fällen (z. B. bei der Modifikation privater Member) sollte doch einige Sicherheit bestehen, dass die Änderung lokal beschränkt ist und nicht alle anderen Elemente der Einheit betrifft.
Warum Closure?
Ein anderes Problem des Martin'schen Wortlauts ist die Formulierung "closed together against the same kinds of changes". Hier wird (wie ja auch bereits durch den Namen des Prinzips) eine gewisse wörtliche Anlehnung an das Open-Closed Prinzip versucht, die in diesem Kontext eher verwirrend ist.Während das Open-Closed Prinzip eigentlich verlangt, dass Software-Einheiten offen für Erweiterungen, aber geschlossen für Änderungen sein sollen, spricht der Martin'sche Wortlaut im zweiten Satz doch explizit von "gemeinsamen Änderungen" (und eben nicht von gemeinsamen Erweiterungen).
Das könnte so interpretiert werden, dass das Common-Closure Prinzip gerade in solchen Fällen relevant wird, wenn das Open-Closed Prinzip nicht eingehalten werden kann. Dann aber ist die ganze namentliche Anlehnung an das Open-Closed Prinzip, die sich ja auch im Namen Common-Closure Prinzip ausdrückt, eher unangebracht.
Alternativer Wortlaut
Während ich den Namen des Prinzips nicht ändern kann, da er sich nun einmal so etabliert hat, bevorzuge ich für den Wortlaut daher eine prägnantere und weniger fragwürdige Version des Prinzips, die sich an folgende Formulierung von Kirk Knoernschild anlehnt:"Classes that change together, belong together" [Knoernschild2002]Da hier überhaupt nicht mehr von der Ebene die Rede ist (together innerhalb welcher Gruppierung?), auf die sich das Prinzip bezieht, schlage ich die folgende Version vor:
Typen, von denen zu erwarten ist, dass sie gemeinsam geändert werden müssen, sollten in derselben physischen Einheit zusammengefasst werden.
Katalogeintrag
Name, Kurzform | Common-Closure Prinzip |
Synonyme |
Common
Closure Principle,
CCP |
Beschreibung |
Typen,
von denen zu erwarten ist, dass sie gemeinsam geändert werden
müssen, sollten in derselben physischen Einheit zusammengefasst
werden.
|
Erläuterung |
Wie
bereits das Single-Responsibility Prinzip basiert auch das
Common-Closure Prinzip auf Änderungserwartungen. Darin liegt
zugleich seine Stärke und seine Schwäche. Stärke, weil das
Prinzip ein praktisch anwendbares Kohäsionskriterium liefert.
Schwäche, weil Änderungserwartungen oftmals nur schwache und
fehlbare Einschätzungen sind. Knoernschild schreibt:
Der Nutzen der Zusammenfassung potentiell gemeinsam veränderlicher Klassen zu einer physischen Einheit besteht darin, Kopplungen auf der Ebene der physischen Einheiten zu vermeiden. Mit diesen Kopplungen würde in jedem Fall eine Komplexitätserhöhung einhergehen, da die Kopplungen auf Klassenebene ohnehin existieren, somit also diejenigen auf der Ebene physischer Einheiten zusätzlich entstünden. |
Beispiel(e) |
|
Historie |
|
Art des Prinzips |
|
Grad der formalen Spezifikation | Gering auf Grund des starken Anteils außerhalb der Software liegender Eigenschaften (Änderungserwartungen). |
Vorteile |
|
Nachteile |
|
Übergeordnete Prinzipien | Lokalitätsprinzip |
Abgleitete Prinzipien | - |
Qualitätsmerkmale |
Änderbarkeit
(+), Wartbarkeit (+), Überprüfbarkeit (+),
Wiederverwendbarkeit
(+)
|
Quellen
[Granularity1996] – Granularity, Robert C. Martin, in: IEEE Software. Dezember 1996, S. 4, siehe http://www.objectmentor.com/resources/articles/granularity.pdf[Knoernschild2002] - Java Design: Objects, UML, and Process, Kirk Knoernschild (2002)
[Martin 2002] – Agile Software Development. Principles, Patterns, and Practices, Robert C. Martin (2002)