Mittwoch, 18. Juni 2014

Das Updated Common-Reuse Prinzip

In seinem Artikel "Aspect-Oriented Design Principles" [Wampler2007] stellt Dean Wampler einige modifizierte Varianten bekannter Prinzipien vor, bei denen er spezielle Eigenschaften der aspektorientierten Programmierung berücksichtigt. Dabei lehnt er sich namentlich z. T. stark an das originale Prinzip an, indem er dem etablierten Namen einfach ein "Updated" voranstellt:
Ich schließe mich an diese Form der Benennung von Prinzip-Varianten an und stelle in diesem Artikel eine Variante des Common-Reuse Prinzips (CRP) vor, das Updated Common-Reuse Prinzip (CRP').

Motivation

Im Rahmen der Diskussion des Common-Reuse Prinzips wurde deutlich, dass insbesondere die Forderung, dass alle Typen einer physischen Einheit wiederverwendet werden müssen, zu einer sehr eingeschränkten Anwendbarkeit des Prinzips führt. Die Problematik wird an der folgenden Situation deutlich:
Die physische Einheit rechts entspricht hier nicht der Forderung des CRP, da die einzelnen Nutzer jeweils nur eine Teilmenge der Einheit verwenden. Dies ließe sich durch einen feineren Zuschnitt wie folgt beheben:
Dieser Zuschnitt ist aktuell zwar konform mit dem CRP, eine Änderung der Nutzung würde aber sofort wieder einen anderen Zuschnitt erfordern. Häufig sind zudem die konkreten Nutzer und die genutzten Teilmengen der einzelnen Nutzer zur Zeit der Gestaltung der physischen Einheit noch gar nicht bekannt. In solchen Fällen erscheint der Wortlaut des CRP zu absolut.

Muster der Wiederverwendung

Das von Martin formulierte CRP beschreibt gewissermaßen ein ideales Muster der Wiederverwendung: Alle potentiellen Nutzer verwenden (direkt oder indirekt) alle Typen der physischen Einheit. Dieses Muster lässt sich wie folgt veranschaulichen:
Ein weiteres Muster, das häufig bei der Verwendung von Bibliotheken mit Utility-Charakter auftritt, sieht wie folgt aus:
Kennzeichen dieses Musters sind:
  • Es gibt zahlreiche, ggf. gar unbekannt viele Nutzer.
  • Diese Nutzer verwenden jeweils sehr unterschiedliche Teilmengen der physischen Einheit.
  • Diese Teilmengen sind nicht notwendigerweise disjunkt.
  • Keine der Teilmengen wird deutlich häufiger verwendet als irgend eine andere Teilmenge.
  • Die Elemente der physischen Einheit sind strukturell nur schwach kohäsiv.
Es wäre angemessen, dieses Muster als Utility Reuse Pattern zu bezeichnen, da es besonders häufig bei Bibliotheken vorkommt, die Hilfsdienste bei eher niederwertigen Verarbeitungsschritten (Zeichenketten, Datumswerte, Listenverarbeitung, Parser usw.) leisten. Offensichtlich verstößt diese Verwendungsform massiv gegen das CRP, da die meisten Nutzer nur relativ kleine Teilmengen der physischen Einheit verwenden. Zugleich bietet sich jedoch auch kein anderer kleinerer Zuschnitt der Einheit an, da es keine dominante Nutzungsteilmenge gibt, die als kleinere Einheit ihren Nutzern nur sehr wenige oder gar keine unbenutzten Typen anbieten würde. Eine solche Situation zeigt das folgende Muster:
Ähnlich wie beim Utility Reuse Pattern existieren hier zahlreiche Nutzer, die sehr unterschiedliche, nicht notwendigerweise disjunkte Teilmengen der physischen Einheit verwenden. Eine dieser Teilmengen (hier rötlich eingefärbt) ist jedoch dominant, d. h. sie wird besonders häufig wiederverwendet. In einer solchen Situation wäre es angebracht, die dominante Teilmenge in eine separate physische Einheit zu verlagern:
Die obere Einheit entspricht nun dem Utility Reuse Pattern. Die untere Einheit ist leider noch nicht konform mit dem CRP, da die zwei rechten Nutzer jeweils nur ein Element der Einheit wiederverwenden. Nichtsdestotrotz profitiert insbesondere derjenige Nutzer, der nur die nichtdominanten Teile der ursprünglichen Einheit nutzte, von dieser Aufteilung, da er nun von der umfangreichen dominanten Teilmenge abgekoppelt ist. Dieses Muster ließe sich als Dominant Subset Reuse Pattern bezeichnen.

Neuformulierung des Prinzips

Vorschlag für eine allgemeine Formulierung des Prinzips:
Fasst man verschiedene Typen mit dem Ziel der Wiederverwendung zu einer oder mehreren physischen Einheiten zusammen, so sollte die Granularität der physischen Einheiten so gewählt werden, dass jeder Nutzer so wenige unbenutzte Typen wie möglich über die physischen Einheiten referenziert.
Versuchen wir, diese Formulierung am Beispiel der obigen Umstrukturierung nachzuvollziehen. Wir zählen dabei aus der Sicht eines jeden Nutzers die Anzahl der unbenutzten Typen. 
In dieser Version summieren sich über alle Nutzer insgesamt 30 unbenutzte Typen. Vergleichen wir dies mit der Version nach Anwendung des Dominant Subset Reuse Patterns:
Hier verbleiben über alle Nutzer nur mehr noch elf unbenutzte Typen. Diese Reduktion überflüssiger Abhängigkeiten auf der Ebene der Typen geht mit dem Nachteil einher, dass insgesamt drei Nutzer nun zwei physische Einheiten einbinden müssen statt nur einer einzigen in der ursprünglichen Lösung. Diese Vermehrung der Abhängigkeiten auf der Ebene der physischen Einheiten erscheint jedoch ggü. der Reduktion der Abhängigkeiten auf der Ebene der Typen vernachlässigbar.

Die oben vorgeschlagenen Muster dienen dabei der schrittweisen Identifikation der korrekten Granularität, wobei immer im Sinn behalten werden muss, dass hier nur aus der Sicht der Wiederverwendung argumentiert wird. In der Realität werden sich diese Erwägungen mit anderen Kohäsionsbetrachtungen (z. B. struktureller Kohäsion und dem Common Closure Prinzip) überschneiden:
  1. Man beginnt gedanklich mit einer einzigen, maximal großen Einheit.
  2. Rekursive Anwendung des Dominant Subset Reuse Pattern: Lässt sich in den (tatsächlichen oder erwarteten) Nutzungsmustern der Einheit die Verwendung dominanter Teilmengen identifizieren, so werden die Teilmengen in separate Einheiten verlagert.
  3. Ist dies nach Beendigung der Rekursion unter 2. nicht (mehr) möglich, so verbleibt eine phyische Einheit, die dem Utility Reuse Pattern entspricht. 

Katalogeintrag

Name, Kurzform Updated Common Reuse Prinzip
Synonyme CRP'
Beschreibung Fasst man verschiedene Typen mit dem Ziel der Wiederverwendung zu einer oder mehreren physischen Einheiten zusammen, so sollte die Granularität der physischen Einheiten so gewählt werden, dass jeder Nutzer so wenige unbenutzte Typen wie möglich über die physischen Einheiten referenziert.
Erläuterung Siehe oben.
Beispiel(e) Siehe oben.
Historie
  • Ausgangspunkt ist das Common-Reuse Prinzip [Granularity1996].
  • Versuch einer nicht nur auf Idealfälle anwendbaren Neuformulierung des Prinzips im vorliegenden Artikel.
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. Die Zahl unbenutzter Typen ebenso wie dominante Teilmengen ließen sich mit entsprechenden Werkzeugen metrisch bestimmen.
  • Wird die physische Einheit an eine unbekannte Menge von Wiederverwendern veröffentlicht: gering. In diesem Fall ist das Prinzip nur als Heuristik unter Annahme von Nutzungshäufigkeiten und Nutzungsmustern zu verstehen.
Vorteile
  • Metrik-basierte Anwendbarkeit innerhalb bekannter Systemgrenzen.
  • Der Anwendungsbereich ist ggü. dem Common Reuse Prinzip breiter, da nicht nur die Idealsituation abgedeckt wird.
  • Die vorgeschlagene rekursive Anwendung des Dominant Subset Reuse Pattern liefert eine systematische Vorgehensweise zur Umsetzung des Prinzips.
Nachteil
  • Die Wechselwirkung mit anderen Kohäsionskriterien (außer Wiederverwendung) wird nicht betrachtet.
Übergeordnete Prinzipien Prinzip der hohen Kohäsion
Abgleitete Prinzipien Common-Reuse Prinzip
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

[Wampler2007] - Aspect-Oriented Design Principles, Dean Wampler (2007), siehe http://aosd.net/2007/program/industry/I6-AspectDesignPrinciples.pdf