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?

Foi útil?

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).

Observer Pattern

Outras dicas

Dependência estruturas de injeção, como Primavera e Guice fornecer uma solução para as dependências cíclicas em Java usando proxies que pode resolver o receptor de uma mensagem a primeira vez que é necessário. Este não é um padrão de OO geralmente aplicáveis, no entanto.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top