Question

La tâche la plus élémentaire dans un environnement orienté objet consiste à exécuter une méthode sur un objet. Pour ce faire, vous devez avoir une référence à l'objet sur lequel vous appelez la méthode. Est-ce le bon moyen d'établir cette référence pour passer l'objet en tant que paramètre au constructeur (ou à la méthode d'initialisation) de l'objet appelant?

Si l'objet foo appelle l'objet bar , est-il correct de dire (en pseudo-code):

bar = new barClass()
foo = new fooClass(bar)

Que se passe-t-il si vous devez faire passer des messages dans les deux sens? Avez-vous besoin d’une méthode pour enregistrer l’objet cible?

foo = new fooClass()
bar = new barClass()

foo.register(bar)
bar.register(foo)

Existe-t-il un modèle qui règle ce problème?

Était-ce utile?

La solution

Généralement, l’injection de dépendance est la voie à suivre. Si vous ne parlez que de deux objets en communication, passez une instance de l'un comme paramètre à l'autre, comme dans votre premier exemple. En passant par le constructeur, assurez-vous que la référence est toujours valide. Sinon, vous devrez tester pour vous assurer que le registre a bien été appelé. De plus, vous devez vous assurer que les appels enregistrés plus d’une fois n’auraient pas d’effets indésirables.

Que faire si vous voulez un objet de contrôle auquel d’autres objets s’enregistrent pour les événements. Il conviendrait alors d’utiliser une méthode de registre (qui peut s’ajouter à un délégué).

Voir Modèle Observer

Autres conseils

Les infrastructures d'injection de dépendances telles que Spring et Guice fournit une solution aux dépendances cycliques en Java en utilisant des proxies capables de résoudre le destinataire d'un message dès que nécessaire. Ce n'est pas un modèle OO généralement applicable, cependant.

Eh bien, en fonction du niveau de messagerie, vous pouvez implémenter un service de messagerie. Les objets écoutent les messages ou s'enregistrent en tant que MessageListener sur un MessageProvider.

Vous vous retrouvez avec des dépendances cycliques si deux objets ont des références l'un à l'autre, ce que je considérerais comme mauvais dans la plupart des cas.

L'un de vos types d'objet pourrait être une fabrique pour l'autre. Lorsque Foo sort une nouvelle barre, la connexion est déjà établie:

foo = new Foo();
bar = Foo.Poop();

function Foo::Poop()
{
    bar = new Bar(this);
    myChildren.Add(bar);
    return bar;
}

bar.SayHiToParent();
foo.SayHiToChildren();

Je pense que cela dépend fortement de la relation exacte qui existe entre les deux objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top