Etwas bleibt in meiner Programmierung angezeigt, und es ist, dass zwei Dinge aus einem bestimmten Blickwinkel gleich sind, aber unterschiedlich von anderen. Stellen Sie sich vor, Sie erstellen eine Grafik von Bahnhöfen, die mit Zügen verbunden sind, dann sind die Klassen Vertex und RailStation manchmal gleich, andere nicht.Korrekte OO-Modellierung von Korrespondenzen
Also, stellen Sie sich vor, ich habe eine Grafik, die sehr stark Bahnhöfe und Züge darstellt. Dann übergebe ich dieses Diagramm an ein anderes Objekt, das einige Scheitelpunkte löscht, und dann möchte ich, dass die entsprechenden Bahnhöfe weg sind.
Ich möchte nicht Bahnhöfe "Eigenschaften" von Vertices machen, sie sind nicht. Außerdem ist das Problem symmetrisch: Wenn ich eine Bahnstation lösche, möchte ich, dass die entsprechende Ecke weg ist. Was ist die richtige OO-Art zu modellieren oder Korrespondenzen. Ich bin bereit, einige zusätzliche Meilen zu gehen, indem ich einige Support-Methoden oder Klassen schreibe, wenn am Ende die Gesamtnutzung einfach und leicht ist.
Ich verwende derzeit die Smalltalk-Programmiersprache, aber die Frage ist nicht wirklich Smalltalk-spezifisch, denke ich. Ich erwähne es nur, weil Sie in Smalltalk coole Tricks wie das Untersuchen des Call-Stacks durchführen können, was in diesem Zusammenhang hilfreich sein kann.
Aktualisieren: Nun, RailStations sind keine Vertices! Sind sie?
Ok, lassen Sie uns echten Code betrachten, wie in den Antworten gefordert. Lassen Sie mich eine Person mit Kindern modellieren. Das ist die einfachste Sache, oder? Kinder sollten auch ihre Eltern kennen, also haben wir einen doppelt verbundenen Baum. Um das Auflösen von Eltern von Kindern zu erleichtern, modelliere ich die Beziehung zwischen Eltern und Kind als eine Beziehung mit den Eigenschaften Eltern und Kind.
So konnte ich Eltern >> removeChild implementieren: vielleicht wie diese
removeChild: aChild
(parent relationshipWith: aChild) disband.
So ein Elternteil eine Sammlung von Beziehungen hat, nicht von Kindern. Aber jede Beziehung entspricht einem Kind. Jetzt möchte ich solche Dinge tun:
parent children removeAllSuchThat: [:e | e age < 12]
, die die Beziehung und das Kind entfernen sollte.
Hier entsprechen Beziehungen und Kinder in gewissem Sinne. Also, was mache ich jetzt? Versteh mich nicht falsch, ich bin mir vollkommen bewusst, dass ich das Problem lösen könnte, ohne Beziehungsklassen einzuführen. Aber tatsächlich teilen Eltern und Kinder tatsächlich eine Beziehung, also warum nicht das modellieren und sie benutzen, um zu helfen, doppelte Verbindungen weniger zwingend zu lösen?
Ich muss Ihre Frage kommentieren: RailStations sind keine Vertices? In Ihrer Frage gibt es nichts, was impliziert, dass Vertices und RailStations unterschiedliche Entitäten auf OO-Art sind. Der einzige Unterschied ist, dass Vertices nur eine visuelle Darstellung von RailStations darstellen. Ist das richtig? – zidane