Passaggio di messaggi tra oggetti: come fare riferimento all'oggetto di destinazione?

StackOverflow https://stackoverflow.com/questions/99684

  •  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?

È stato utile?

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

Framework di inserimento delle dipendenze come Primavera E Guice fornire una soluzione alle dipendenze cicliche in Java utilizzando proxy che possono risolvere il destinatario di un messaggio la prima volta che è richiesto.Tuttavia, questo non è un modello OO generalmente applicabile.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top