Montag, 16. Juni 2014

Das Common-Reuse Prinzip

Das Common-Reuse Prinzip (CRP) ist das zweite in [Granularity1996] beschriebene Prinzip, das Martin später (in [Martin2002]) als Principle of Component Cohesion einordnet. Das Prinzip soll also dabei helfen zu entscheiden, welche Typen in eine physische Einheit aufgenommen werden sollten. Ich werde im Folgenden wieder durchgehend den Begriff der physischen Einheit verwenden, um andere überladene Begriffe wie "Package" oder "Komponente" zu vermeiden, siehe hierzu auch meine frühere Erläuterung. Zudem werden ich bezüglich der Elemente einer physischen Einheit nicht wie Martin von Klassen, sondern allgemein von Typen sprechen, um damit zu verdeutlichen, dass auch andere Typkonstrukte wie Interfaces, Traits oder Aufzählungstypen gemeint sind.
Die Typen einer physischen Einheit sollten gemeinsam wiederverwendet werden. Wenn man einen Typ einer physischen Einheit wiederverwendet, sollte man alle Typen der physischen Einheit wiederverwenden. (Anglehnt an [Granularity1996]).
Mindestens zwei Fragen sollten in diesem Zusammenhang geklärt werden:
  • Inwiefern unterscheidet sich das Prinzip vom strukturellen Kohäsionsbegriff?
  • Warum fordert das Prinzip, dass alle Typen wiederverwendet werden sollten?

Der strukturelle Kohäsions-Begriff

Kohäsion wird häufig formal in einer Weise definiert, die auf die Intensität der intramodularen Zusammenarbeit abzielt. Je intensiver die Teile eines Moduls zusammenarbeiten, desto enger ist offenbar ihr Zusammenhang, desto stärker ist ihre Kohäsion zu interpretieren. Diese struktuelle Form der Kohäsion kann festgestellt werden, indem die Einheit für sich genommen betrachtet wird, ohne ihre Nutzer zu kennen.
Die gelb dargestellte physische Einheit enthält vier Typen, die eng zusammenarbeiten. In einem solchen Fall wäre es unstrittig, dass eine hohe strukturelle Kohäsion der Einheit vorliegt. Typische Kohäsionsmetriken würden einen hohen Kohäsionswert ausweisen. Allerdings spielt Wiederverwendung hier noch keine Rolle.

CRP = strukturelle Kohäsion?

Einige Erläuterungen von Martin deuten darauf hin, dass er eigentlich nur die strukturelle Kohäsion im Sinn hat:
"Im allgemeinen arbeiten wiederverwendbare Klassen mit anderen Klassen zusammen, die Teil der wiederverwendbaren Abstraktion sind. (...) In einer solchen Komponente erwarten wir Klassen, die untereinander viele Abhängigkeiten aufweisen." [Martin2002]
Wenn man das CRP streng in diesem Sinne interpretiert, hilft die Tatsache der gemeinsamen Wiederverwendung lediglich dabei, physische Einheiten aufzuspüren, die im strukturellen Sinne kohäsiv sind. Die gemeinsame Wiederverwendung ist dann kein zusätzliches Kohäsionskriterium, sondern lediglich ein Hilfsmittel. In diesem Sinne wäre das CRP allerdings kaum mehr wert als das Prinzip der hohen Kohäsion auf der Ebene physischer Einheiten.

Kohäsion durch gemeinsame Wiederverwendung 

Die Frage besteht nun darin, ob Wiederverwendung als autonomes Kohäsionskriterium verwendet werden kann.
Betrachtet man hier die Intensität der Zusammenarbeit innerhalb des Moduls, so erscheint die Kohäsion eher schwach. Typische Kohäsionsmetriken, die nur die Zahl der Abhängigkeiten innerhalb der Einheit messen, würden für diese Einheit einen geringen Kohäsionswert ausweisen.

Die nutzende Einheit verwendet jedoch drei der vier Typen direkt und das vierte indirekt, somit also alle Typen der physischen Einheit. Der Wortlaut des CRP besagt, dass genau diese gemeinsame Wiederverwendung aller Typen der Einheit ein starkes Argument dafür ist, die Typen auch tatsächlich zu einer physischen Einheit zusammenzufassen. Kämen weitere Nutzer hinzu, die ebenfalls alle Typen der Einheit nutzen, würde das Argument umso stärker. Die gemeinsame Wiederverwendung zeigt in diesem Sinne, dass die Teile eng zusammenhängen, obwohl sie nicht eng zusammenarbeiten. Obwohl keine strukturelle Kohäsion vorliegt, kann die Einheit doch als kohäsiv betrachtet werden.

Unklare Situationen

Nun ist die obige Situation gewissermaßen ein Idealfall, da es zum einen nur eine einzige nutzende Einheit gibt und da zum anderen diese auch tatsächlich alle Typen der genutzten Einheit direkt oder indirekt verwendet. Die folgende Situation ist nicht mehr so klar:
Die obere nutzende Einheit verwendet drei von sechs Typen der benutzten Einheit. Die untere verwendet insgesamt vier Typen der benutzten Einheit (drei direkt und einen indirekt). Zudem gibt es ein Typ, der von beiden Nutzern gemeinsam wiederverwendet wird. Es wäre nun denkbar, diese Situation wie folgt aufzuteilen, um wieder mit dem CRP konform zu sein, das ja die Wiederverwendung aller Typen der Einheit fordert:
Für den Augenblick wäre das aus der Sicht des CRP gewissermaßen der ideale Zuschnitt. Sollte aber auch nur eine einzige nutzende Abhängigkeit hinzukommen oder ein weiterer Nutzer eine andere Teilmenge verwenden, müsste auch der Zuschnitt der Einheiten wieder angepasst werden. Das kann sicherlich nicht gewünscht sein. Bei Einheiten, die häufig in Teilmengen ihrer Typen wiederverwendet werden, wäre es zudem unmöglich, einen passenden Zuschnitt zu wählen, da die Schnittmengen der verschiedenen Nutzer nicht wie im obigen Beispiel disjunkt wären.

Tatsächlich hat die Nutzungsweise zahlreicher Bibliotheken genau dieses Muster der Wiederverwendung. Bibliotheken stellen oftmals eine Sammlung von Diensten zur Verfügung, die sich um ein Thema gruppieren, ohne selbst unmittelbar eng zusammenzuarbeiten. Einzelne Nutzer der Bibliothek verwenden jeweils unterschiedliche Teilmengen dieser Dienste, die nicht disjunkt sind. Welche Dienste genau von einem Nutzer verwendet werden und welche Nutzer die Bibliothek verwenden, ist oftmals eher volatil. Es erscheint daher als sinnvoll, die thematisch zusammenhängenden Dienste auch in einer gemeinsamen Einheit zur Verfügung zu stellen, da
  • aus der Sicht des Nutzers die Abhängigkeit zur physischen Einheit konstant bleibt, auch wenn sich seine Nutzungsweise der Typen der Einheit ändert
  • aus der Sicht der physischen Einheit der Zuschnitt nicht mit jeder geänderten Benutzung ihrer Typen angepasst werden muss.

Eine weniger absolute Fassung des Prinzips

In der absoluten Form des Prinzips, die Martin präsentiert, ist das CRP also entweder nur als Hilfsmittel zur Aufspürung hoher struktureller Kohäsion zu interpretieren, oder es ist nur auf wenige Idealfälle anwendbar, in denen tatsächlich die Nutzungsverhältnisse klar sind und auch alle Typen der physischen Einheit von jedem Nutzer verwendet werden. Ein erweiterter Kohäsionsbegriff in dem Sinne, dass Teile einer Einheit über den Umweg der Wiederverwendung eng zusammenhängen, obwohl sie nicht eng zusammenarbeiten, drückt sich in Martins Wortwahl nicht aus, obwohl der Name des Prinzips dies nahelegen würde und das Beispiel vieler Bibliotheken auch zeigt, dass hierin ein Funken Wahrheit liegt. 

Ich werde daher in einem folgenden Blogartikel eine andere Fassung des Prinzips vorschlagen, die dieser erweiterten Bedeutung Rechnung trägt (siehe Updated Common-Reuse Prinzip). Der vorliegende Artikel beschränkt sich auf das CRP im Rahmen der ursprünglichen Wortwahl, lediglich unter Verwendung des Begriffs der "physischen Einheit".

Katalogeintrag

Name, Kurzform Common Reuse Prinzip
Synonyme
Prinzip der gemeinsamen Wiederverwendung,
Common Reuse Principle,
CRP
Beschreibung Die Typen einer physischen Einheit sollten gemeinsam wiederverwendet werden. Wenn man einen Typ einer physischen Einheit wiederverwendet, sollte man alle Typen der physischen Einheit wiederverwenden. (Anglehnt an [Granularity1996]).
Erläuterung
Die obigen Ausführungen haben bereits dargelegt, dass das CRP in folgender Weise dabei behilflich sein kann zu entscheiden, welche Typen in eine physische Einheit aufgenommen werden sollten:
  1. Die gemeinsame Wiederverwendung verschiedener Typen kann dabei helfen, eine strukturelle Kohäsion dieser Typen aufzuspüren.
  2. Auch wenn keine strukturelle Kohäsion dieser Typen vorliegt, d. h. wenn die Typen nicht untereinander eng zusammenarbeiten, so kann die gemeinsame Wiederverwendung aller Typen als Kohäsion interpretiert werden.
Einige Ausführungen Martins („In einer solchen Komponente erwarten wir Klassen, die untereinander viele Abhängigkeiten aufweisen.“ [Martin2002]) deuten darauf hin, dass er das Prinzip im Sinne von 1. versteht. Es stellt dann nur ein zusätzliches Hilfsmittel zum Prinzip der hohen Kohäsion dar.

Die Interpretation im Sinne von 2. wird dadurch gestützt, dass Martin davon ausgeht, dass ein Nutzer der physischen Einheit in jedem Fall neu geprüft werden muss, wenn es irgendwelche Änderungen der physischen Einheit gab – auch dann, wenn diese nur Typen betreffen, die der Nutzer gar nicht verwendet. Er schreibt:
Wenn ein Package veröffentlicht wird, das nur Änderungen enthält, die mich nicht interessieren, werde ich nicht glücklich darüber sein, meine Anwendung neu überprüfen zu müssen. (…) Daher möchte ich, wenn ich von einem Package abhänge, von allen Klassen des Packages abhängen.“ [Granularity1996]
Beispiel(e) Siehe oben.
Historie
  • Die erste Formulierung des Prinzips erfolgte in der C++-Artikelserie [Granularity1996].
  • In [Martin2002] spricht Martin nicht mehr von „packages“ und „package cohesion“, sondern von „components“ und „component cohesion“.
Art des Prinzips
  • Grundlegende Einteilung: Produkt.
  • Technologiebezug: Spezifisch (Objektorientierung).
  • Entwurfsgüte: Strukturprinzip.
  • Handlungsbezug: Erleichterung von Wiederverwendung, Build, Verteilung und Überprüfung.
  • Kognitionsbezug: Komplexitätsreduktion.
(Siehe Kategorisierung der Prinzipien.)
Grad der formalen Spezifikation
  • Innerhalb eines Systems, in dem alle Wiederverwender bekannt sind: hoch.
  • Wird die physische Einheit an eine unbekannte Menge von Wiederverwendern veröffentlicht: gering. In diesem Fall kann der Zuschnitt der Einheit nicht aus der konkreten Art der Wiederverwendung abgeleitet werden.
Vorteile
(1) Hilfsprinzip für das Prinzip der hohen Kohäsion auf der Ebene physischer Einheiten.

(2) Deutet einen erweiterten Kohäsionsbegriff durch Berücksichtigung der Art der Wiederverwendung an.
Nachteile
a) Als Hilfsprinzip im Sinne von (1) führt das CRP allerdings keinerlei neue Bedeutung gegenüber dem Prinzip der hohen Kohäsion ein.

b) Der erweiterte Kohäsionsbegriff im Sinne von (2) umfasst nur die Idealsituation der Verwendung aller Typen einer Einheit. Dies schränkt die Anwendung des Prinzips auf wenige Ausnahmefälle ein.

c) Die Mehrdeutigkeit des Prinzips erschwert im Einzelfall die Diskussion.
Übergeordnete Prinzipien Prinzip der hohen Kohäsion
Abgleitete Prinzipien -
Qualitätsmerkmale Wiederverwendbarkeit (+), Wartbarkeit (+), Änderbarkeit (+)

Quellen

[Granularity1996] Granularity, Robert C. Martin, in: IEEE Software. Dezember 1996, S. 4, siehe http://www.objectmentor.com/resources/articles/granularity.pdf

[Martin 2002] – Agile Software Development. Principles, Patterns, and Practices, Robert C. Martin (2002)