Bei einem solchen Entwurf sind mehrere Aspekte zu berücksichtigen:
- die strukturellen Abhängigkeiten
- das Eigentumsverhältnis (dh Zusammensetzung im Vergleich zu einer anderen Art von Assoziation)
- die Navigation braucht
Strukturabhängigkeit zwischen Klassen:
Wenn Sie Komponentenklassen wiederverwenden möchten, sollten Sie unnötige Abhängigkeiten und solche geschlossenen kreisförmigen Strukturen vermeiden.
Trotzdem sind manchmal zwei Klassen konzeptionell stark miteinander verbunden. In diesem Fall ist die Vermeidung von Abhängigkeiten keine echte Option. Beispiel: Ein Baum und seine Blätter oder allgemeiner ein Verbundwerkstoff und seine Bestandteile .
Eigentum an Objekten:
Besitzt ein Objekt das andere? Oder anders gesagt: Wenn ein Objekt zerstört wird, soll auch das andere zerstört werden?
Dieses Thema wurde von Snowman eingehend behandelt, daher werde ich es hier nicht ansprechen.
Navigationsbedarf zwischen Objekten:
Ein letztes Problem ist das Navigationsbedürfnis. Nehmen wir mein Lieblingsbeispiel, das zusammengesetzte Designmuster der Gang of Four .
Gamma & al. Erwähnen Sie explizit die mögliche Notwendigkeit eines expliziten übergeordneten Verweises: "Das Beibehalten des Verweises von untergeordneten Komponenten auf deren übergeordnete Komponente kann das Durchlaufen und Verwalten einer zusammengesetzten Struktur vereinfachen. " kann die Operationen auf exponentielle Weise erheblich verlangsamen. Eine direkte Referenz, auch zirkuläre, kann die Manipulation Ihrer Verbundwerkstoffe erheblich erleichtern.
Ein Beispiel könnte ein grafisches Modell eines elektronischen Systems sein. Eine zusammengesetzte Struktur könnte die elektronischen Karten, Schaltkreise, Elemente darstellen. Zum Anzeigen und Bearbeiten des Modells benötigen Sie einige geometrische Proxys in einer GUI-Ansicht. Es ist dann sicherlich viel einfacher, vom vom Benutzer ausgewählten GUI-Element zur Komponente zu navigieren, um herauszufinden, welches das übergeordnete Element und mit welchem das verwandte Bruder- / Schwesterelement ist, als eine Suche von oben nach unten zu starten.
Natürlich müssen Sie, wie Gamma & al betont hat, die Invarienten der Kreisbeziehung sicherstellen. Dies kann schwierig sein, wie die SO-Frage, auf die Sie sich beziehen, gezeigt hat. Aber es ist perfekt handhabbar und sicher.
Fazit
Das Navigationsbedürfnis darf nicht unterschätzt werden. Nicht umsonst hat UML dies in der Modellierungsnotation explizit angesprochen. Und ja, es gibt eine durchaus gültige Situation, in der Zirkelverweise benötigt werden.
Der einzige Punkt ist, dass Menschen manchmal dazu neigen, zu schnell in eine solche Richtung zu gehen. Es lohnt sich also, alle drei Aspekte zu berücksichtigen, bevor Sie sich entscheiden, ob Sie es wollen oder nicht.