Was ist der beste Weg, um eine Viele-zu-Viele-Beziehung zu modellieren?
sagen wir haben zwei Klassen, Team und Player
Ich möchte Methoden wie
aufrufenplayerX.getTeamList()
, um die Liste aller Teams zu erhalten, in denen er / sie sich befindet teamY.getPlayerList()
, um die Liste aller Player s im Team (oder eine andere Möglichkeit, dies effektiv zu tun)
Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun, aber sie fühlen sich einfach nicht gut an. Kannst du dir irgendwelche guten Wege vorstellen, vielleicht einen Design-Patten?
Beziehung zwischen Spielern und Teams bilden Bipartite Graph . Erwartete Kommentare (und Downvotes?)! Ich bin OOD noob.
%Vor%Es lohnt sich, das API-Feeling von der tatsächlichen Implementierung zu unterscheiden.
Obwohl es für beide Klassen Sinn macht, eine solche Sammlung verfügbar zu machen (z. B. get * List ()), müssen sie die Instanz der Sammlung nicht unbedingt halten.
Ich schlage vor, dass Sie eine League
-Klasse oder etwas Ähnliches erstellen, das eine Art eines privaten Spieler-Team-Mappings-Wörterbuchs enthält. Ergänzungen zu diesen Sammlungen durch die Team / Player-Instanz sollten interne Methoden in der League
-Instanz aufrufen, um die Zuordnungen zu aktualisieren. Auf diese Weise halten Sie Updates atomar (wie Andrey vorgeschlagen) und fehlerfrei.
Die Antwort von Will ist richtig. Um jedoch mit der Synchronisierung zu beginnen, würde ich wahrscheinlich mit ObservableCollection beginnen. Eine Seite der Beziehung muss der "Master" sein, der Adds / Removes auf der anderen Seite verfolgt und sich um die Synchronisierung kümmert.
Beachten Sie jedoch, dass, wenn ein Objekt Ereignisse auf der anderen Seite abonniert, dies eine starke Referenz ist, die die Garbage Collection verhindert. Höchstwahrscheinlich werden sie gleichzeitig den Spielraum verlassen, so dass dies kein Problem ist, aber es ist etwas, dessen man sich bewusst sein muss.
Teilen Sie die Viele-zu-Viele-Beziehung in zwei Eins-zu-Viele-Beziehungen auf. Macht alles viel einfacher.
Was Ihr beschreibt, ist der "natürliche" Weg für OO. Ihre XXX.getXXXList () ist die Schnittstelle zu Ihren Klassen. Und für eine begrenzte Anzahl von Klassen wäre das der richtige Weg.
Beachten Sie, dass es 1000 Klassen gibt, die miteinander verbunden werden können. Dann kann es interessant sein, dass ein ManyToManyManager ein Objekt ablegt, ein anderes Objekt zu den verwandten Objekten eines Objekts hinzufügt und die Liste aller Objekte abruft, die mit einem anderen Objekt verknüpft sind. Das wäre eine Art von Delegation vs. Implementierung.
Shure, wenn Sie Ihre Viele-zu-Viele an eine andere Instanz delegieren, spiegelt Ihr Objektmodell diese Viele-zu-Viele-Beziehung nicht mehr wider.
Tags und Links design-patterns oop