Frage

Stellen Sie sich vor, diese Beziehungen:

  • 1 A hat viele B
  • 1 B viele Cs hat ...

Im Gegenteil:

  • C hat 1 B
  • B 1A
  • Mit dem Transitivität, C hat 1 A

Um diese Beziehung in DB-Modell, die wir haben:

TableA
a_id

TableB
b_id
a_id (fk to TableA)

TableC
c_id
b_id (fk to TableB)

Um diese Beziehung in OO-Modell haben wir:

objA
objB
objC

Und ... - objB hat Bezug auf objA - ObjC hat Verweis auf objB

Wenn ObjC hat ein Verfahren, das ein Verfahren zur objA aufrufen muss, was werden Sie tun?

Option 1.

b.getA().runMethodX()

Viele ppl Ich weiß, würde dies tun, aber ich habe auch gelernt, dass dies nicht gut ist, weil getA () kein Verhalten von B in einem reinen OO Sinn ist. Dabei ist wie prozeduralen Programmierung zu tun. Stimme nicht zu Stimme /?

Option 2.

Let ObjC hat einen direkten Bezug auf objA und objB durch Konstruktor Injektion / Setter

Ist das eine gute Idee? aber dann objB dass ObjC Bezug muss auch hat Bezug auf objA. Ist das okay? Oder solange es nicht ein Fall von zyklischen Objektreferenzen ist, ist es akzeptabel?

Option 3.

Bewegen Sie die Methode in Frage zu objA, und übergibt ObjC in durch Parameter.

Ich bin mir nicht sicher, ob dies als Option betrachtet. Ich denke, es wird nicht jeden Fall in Arbeit. Lassen Sie das Verfahren in ObjC reduziert Minimum entblößen, die nur auf ihren Zuständen arbeiten, und lassen Sie objA tun, was objA vor tun muss, oder nach.

Option 4. (Delegation)

hinzufügen runMethodXinA () nach B, ruft

a.runMethodX()

C Anrufe

b.runMethodXinA()

habe ich versucht, diese Methode vor, aber B wird sehr wahrscheinlich so viele Methoden wie A am Ende mit, und bin mit nicht mehr als 1 Verfahren sowohl in der B und A verletzt DRY?

Was sind Ihre obwohl? Alle anderen Optionen? Bemerkungen? Vorschläge?

War es hilfreich?

Lösung

Option 2 ist eine ziemlich gefährliche Vervielfältigung von Informationen, zusätzlich zu was auch immer Fragen aus der Form des Referenzgraphen kommen kann abhängig von Ihrer Umgebung.

Option 3 könnte Sinn machen, wenn das Verfahren in einem gewissen Sinne auf der Art der objA, als eine Art Doppel-Ausgabe abhängig ist.

Option 1 geht gegen das Gesetz von Demeter, aber es klingt wie es die am wenigsten intrusive Option ist.

Sie können auch eine Weiterleitungsmethode auf objB zu berücksichtigen, um den Anruf zu objA geht.

Andere Tipps

aus der Liste der Möglichkeiten, die Auswahl ist die Option 4, wie es der Gesetz von Demeter

  • Option 1 verstößt gegen das Gesetz von Demeter
  • Option 2 stellt redundante Referenzen und verstößt gegen das Gesetz von Demeter indirekt
  • Option 3 verunreinigt Objekt A mit Wissen des Objekt C, die wohl auch das Gesetz des Demeter (in umgekehrter Richtung) gegen

Das läßt die Option 4

Es kann eine Option 5, sein, aber das sprengt den Rahmen der ursprünglichen Frage; -)

Ich denke, die Frage ist, welche Art von Modell für Sie gehen. Wenn Sie ein relationales Modell gehst, wo Sie die gesamte Struktur im Voraus wissen, und es wird sich nicht ändern, die Option 1 ist akzeptabel. Das heißt, die Daten / Methoden in A in einem bestimmten Organisationsmuster für C erforderlich.

Option 2 kann wie eine gute Idee zu sein scheint. aber Sie sparend im Wesentlichen zwei Referenzen auf dasselbe Objekt. Nun, wenn B zu einem anderen A abgebildet wird, hat B C zu benachrichtigen, seine Referenz als auch zu ändern. Nicht gut.

Option 4 scheint der richtige Weg für einen wirklich OO Ansatz zu gehen, aber. Der Punkt ist, dass A seine Struktur ändern kann und nur B anpassen müssen - die sofortige Kind. C nicht weiß, und kümmert sich nicht darum, wie A implementiert ist, es ist genug, dass A existiert einfach und B weiß, was damit zu tun.

Haben Sie eigentlich die Rückseite Zeiger von C müssen A nach B, oder haben Sie sie nur so, dass Sie A von C zugreifen kann? Vielleicht sollte eine Verantwortung für B und C zu schaffen und ihre Beziehung zu verwalten. In diesem Szenario kann A selbst in C einsetzen, wenn es C erzeugt (ex. C könnte einen Konstruktor hat, die A nimmt).

Sie können auch die Funktion auf A, die C Bedürfnisse isolieren und eine Schnittstelle für sie erstellen. Die Schnittstelle (anstelle von A) wird in C auf dem Bau übergeben werden. Das wird entkoppeln C von A.

Nein. 1 oder No. 4 abhängig von den Umständen. In meiner spanabhebende Software haben wir viele Fälle, in denen wir die Eltern / Herkunft eines Objekts wissen müssen. Zum Beispiel haben wir einen Weg-Sammlung auf einem Fitting und jeder Pfad hat eine Fitting-Eigenschaft, die Armatur zurückgibt, die sie erstellt haben.

Allerdings, wenn ein Objekt verbunden es einfach ist, weil es hilft, das ursprüngliche Objekt erfüllt seinen Zweck (wie Mathematik-Unterstützung) dann Delegation wahrscheinlich der bessere Ansatz ist.

Wenn das angeschlossene Objekt ändert das ursprüngliche Objekt dann sind Sie wahrscheinlich besser mit den Besucher-Mustern.

Der einzige Nachteil ist, dass in den meisten OOP müssen Sie doppelt verknüpfte Objekte vorsichtig sein. Die Garbage Collection wird oft auf Objekte fehlschlagen, die Eltern-Kind-Links miteinander verbunden haben. Und es ist ein häufiger Fehler, zu vergessen, Eltern-Kind-Link zu bereinigen.

Mit OOPs, die Ereignisse Unterstützung Erstellen und Konsumieren Sie dieses Problem umgehen können. Durch die Verwendung von Proxies. Die Eltern werden von Hand dem Kind ein Proxy-Objekt anstelle von selbst. Wenn das Kind die Eltern braucht, wird es einen Verweis aus dem Proxy-Objekt zu bekommen. Das Proxy-Objekt wiederum erhöhen als Ereignis, das die Mutter verursacht selbst zurückzukehren. Es gibt keine harten Links so das Problem des Programmierers oder Garbage Collector nicht Aufräumen gemildert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top