Passaggio di messaggi tra oggetti: come fare riferimento all'oggetto di destinazione?
-
01-07-2019 - |
Domanda
L'attività più elementare in un ambiente orientato agli oggetti è l'esecuzione di un metodo su un oggetto.Per fare ciò, devi avere un riferimento all'oggetto su cui stai invocando il metodo.Il modo corretto per stabilire questo riferimento è passare l'oggetto come parametro al costruttore (o al metodo inizializzatore) dell'oggetto chiamante?
Se oggetto foo
chiama in oggetto bar
, è corretto dire (in pseudo-codice):
bar = new barClass()
foo = new fooClass(bar)
Cosa succede se è necessario scambiare messaggi avanti e indietro?Hai bisogno di un metodo per registrare l'oggetto di destinazione?
foo = new fooClass()
bar = new barClass()
foo.register(bar)
bar.register(foo)
Esiste uno schema che risolve questo problema?
Soluzione
Generalmente l'iniezione di dipendenza è la strada da percorrere.Se stai solo parlando di due oggetti che comunicano, passa un'istanza di uno come parametro all'altro, come nel tuo primo esempio.Il passaggio nel costruttore garantisce che il riferimento sia sempre valido.Altrimenti dovresti testare per assicurarti che il registro sia stato chiamato.Inoltre dovresti assicurarti che chiamare il registro più di una volta non abbia effetti negativi.
Cosa succede se si desidera un oggetto di controllo, a cui altri oggetti si registrano per gli eventi.Sarebbe quindi opportuno utilizzare un metodo Register (che potrebbe aggiungere un delegato).
Vedere Modello dell'osservatore
Altri suggerimenti
Bene, a seconda del livello di messaggistica, potresti implementare un servizio di messaggistica.Gli oggetti ascoltano i messaggi o si registrano come MessageListener su alcuni MessageProvider.
Ti ritroverai con dipendenze cicliche se due oggetti hanno riferimenti tra loro, cosa che considererei negativa nella maggior parte dei casi.
Uno dei tuoi tipi di oggetto potrebbe essere una fabbrica per l'altro.Quando Foo crea una nuova barra, la connessione è già stata stabilita:
foo = new Foo();
bar = Foo.Poop();
function Foo::Poop()
{
bar = new Bar(this);
myChildren.Add(bar);
return bar;
}
bar.SayHiToParent();
foo.SayHiToChildren();
Penso che dipenda molto da quale sia l'esatta relazione tra i due oggetti.