Message-Passing zwischen Objekten - Wie kommt man zum Zielobjekt verweisen?
-
01-07-2019 - |
Frage
Die einfachste Aufgabe in einer objektorientierten Umgebung wird auf einem Objekt eine Methode ausgeführt wird. Um dies zu tun, müssen Sie das Objekt einen Verweis auf den Sie die Methode aufgerufen wird. Ist der richtige Weg, diese Referenz zu etablieren, das Objekt als Parameter an den Konstruktor (oder initializer-Methode) des anrufenden Objekt zu übergeben?
Wenn das Objekt foo
in Objekt bar
ruft, ist es richtig zu sagen (in Pseudo-Code):
bar = new barClass()
foo = new fooClass(bar)
Was passiert, wenn Sie Nachrichten müssen hin und her zu übergeben? Benötigen Sie eine Methode für das Zielobjekt Registrierung?
foo = new fooClass()
bar = new barClass()
foo.register(bar)
bar.register(foo)
Gibt es ein Muster, das diese Adressen?
Lösung
Generell Dependency Injection ist der Weg zu gehen. Wenn Sie sprechen nur über zwei Objekte in Verbindung stehen dann eine Instanz von einem in als Paramter auf den anderen übergeben, wie in Ihrem ersten Beispiel. gewährleistet die Referenz im Konstruktor ist immer gültig. Andernfalls würden Sie Register testen, um sicherzustellen, hatte genannt. Auch müssen Sie sicher, dass calling registriert mehr machen, als wenn keine negativen Auswirkungen haben.
Was ist, wenn Sie ein Controlling-Objekt wollen, auf die anderen Objekte für Ereignisse registrieren. Es wäre dann geeignet sein, ein Register-Methode zu verwenden (was zu einem Delegierten hinzufügen können).
Siehe Observer-Muster
Andere Tipps
Injektion Dependency Frameworks wie Frühling und
Nun, je nach dem Grad des Messaging, könnten Sie einen Messaging-Dienst implementieren. Objekte hören für Nachrichten oder als Message auf einige MessageProvider registrieren. Sie am Ende mit zyklischen Abhängigkeiten, wenn zwei Objekte Referenzen zueinander haben, die ich in den meisten Fällen schlecht in Betracht ziehen würde.
Eine der Objekttypen könnte eine Fabrik für die andere sein. Wenn Foo kackt eine neue Bar, hat die Verbindung bereits gemacht:
foo = new Foo();
bar = Foo.Poop();
function Foo::Poop()
{
bar = new Bar(this);
myChildren.Add(bar);
return bar;
}
bar.SayHiToParent();
foo.SayHiToChildren();
ich denke, dass es hängt stark ab, was die genaue Beziehung zwischen den beiden Objekten.