Viele-zu-viele-Beziehung in oop

8

Was ist der beste Weg, um eine Viele-zu-Viele-Beziehung zu modellieren?

sagen wir haben zwei Klassen, Team und Player

  • Jeder gegebene Player kann sich in mehreren Team s
  • befinden
  • jedes Team kann so viele Player haben, wie sie möchten

Ich möchte Methoden wie

aufrufen
  • playerX.getTeamList() , um die Liste aller Teams zu erhalten, in denen er / sie sich befindet
  • teamY.getPlayerList() , um die Liste aller Player s im Team
  • zu erhalten

(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?

    
Manu 06.05.2010, 12:20
quelle

7 Antworten

7

Beziehung zwischen Spielern und Teams bilden Bipartite Graph . Erwartete Kommentare (und Downvotes?)! Ich bin OOD noob.

%Vor%     
Pratik Deoghare 06.05.2010 13:11
quelle
3
%Vor%

Absolut vernünftig.

    
Will 06.05.2010 12:30
quelle
2

ist in Ordnung, Player hat eine Sammlung von Team und Team hat eine Sammlung von Player . Sie müssen bei Add / Remove-Vorgängen auf die Integrität achten, da sie nicht "atomar" sind

    
Andrey 06.05.2010 12:24
quelle
2

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.

    
user286353 06.05.2010 12:37
quelle
1

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.

    
RationalGeek 06.05.2010 12:48
quelle
1

Teilen Sie die Viele-zu-Viele-Beziehung in zwei Eins-zu-Viele-Beziehungen auf. Macht alles viel einfacher.

    
Lotus Notes 06.05.2010 23:48
quelle
0

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.

    
PeterMmm 06.05.2010 12:41
quelle

Tags und Links