Passagem de mensagens entre objetos - Como referenciar o objeto de destino?
-
01-07-2019 - |
Pergunta
A tarefa mais básica em um ambiente orientado a objeto é a execução de um método em um objeto. Para fazer isso, você tem que ter uma referência para o objeto no qual você está chamando o método. É a maneira correta para estabelecer esta referência para passar o objeto como um parâmetro para o construtor (ou initializer método) do objeto chamando?
Se as chamadas objeto foo
em objeto bar
, é correto dizer (em pseudo-código):
bar = new barClass()
foo = new fooClass(bar)
O que acontece se você precisa passar mensagens e para trás? Você precisa de um método para registrar o objeto de destino?
foo = new fooClass()
bar = new barClass()
foo.register(bar)
bar.register(foo)
Existe um padrão que aborda esse?
Solução
Geralmente injeção de dependência é o caminho a percorrer. Se você está falando apenas de dois objetos comunicando em seguida, passar uma instância de um em como um parâmetro para o outro, como em seu primeiro exemplo. Passando no construtor garantir a referência é sempre válido. Caso contrário, você teria que teste para garantir registo tinha sido chamado. Além disso você precisa ter certeza de vocação registar mais de uma vez não teria efeitos adversos.
E se você quer um objeto de controle, para que outros objetos se registrar para eventos. Seria, então, adequado para usar um método Register (que pode adicionar a um delegado).
Outras dicas
Bem, dependendo do nível de mensagens, você pode implementar um serviço de mensagens. Objetos ouvir as mensagens, ou se registrar como um MessageListener em algum MessageProvider.
Você acaba com dependências cíclicas se dois objetos têm referências a outro, o que eu considero ruim na maioria dos casos.
Um de seus tipos de objeto poderia ser uma fábrica para o outro. Quando Foo poops um novo bar, a conexão já foi feita:
foo = new Foo();
bar = Foo.Poop();
function Foo::Poop()
{
bar = new Bar(this);
myChildren.Add(bar);
return bar;
}
bar.SayHiToParent();
foo.SayHiToChildren();
Eu acho que é altamente depende do que a relação exata entre os dois objetos.