Paso de mensajes entre objetos: ¿cómo hacer referencia al objeto de destino?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

La tarea más básica en un entorno orientado a objetos es ejecutar un método en un objeto.Para hacer esto, debes tener una referencia al objeto sobre el cual estás invocando el método.¿La forma correcta de establecer esta referencia es pasar el objeto como parámetro al constructor (o método inicializador) del objeto que llama?

si objeto foo llama al objeto bar, ¿es correcto decir (en pseudocódigo):

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

¿Qué sucede si necesita pasar mensajes de un lado a otro?¿Necesita un método para registrar el objeto de destino?

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

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

¿Existe algún patrón que aborde esto?

¿Fue útil?

Solución

Generalmente la inyección de dependencia es el camino a seguir.Si solo estás hablando de dos objetos que se comunican, pasa una instancia de uno como parámetro al otro, como en el primer ejemplo.Pasar el constructor garantiza que la referencia sea siempre válida.De lo contrario, tendría que realizar una prueba para asegurarse de que se haya llamado al registro.También deberá asegurarse de que llamar al registro más de una vez no tenga efectos adversos.

¿Qué sucede si desea un objeto de control, en el que otros objetos se registran para eventos?Entonces sería adecuado utilizar un método de Registro (que puede agregarse a un delegado).

Ver Patrón de observador

Otros consejos

Marcos de inyección de dependencia como Primavera y Guice Proporcionar una solución a las dependencias cíclicas en Java mediante el uso de servidores proxy que pueden resolver el receptor de un mensaje la primera vez que se requiere.Sin embargo, este no es un patrón OO de aplicación general.

Bueno, dependiendo del nivel de mensajería, podrías implementar un servicio de mensajería.Los objetos escuchan mensajes o se registran como MessageListener en algún MessageProvider.

Terminas con dependencias cíclicas si dos objetos tienen referencias entre sí, lo que yo consideraría malo en la mayoría de los casos.

Uno de sus tipos de objetos podría ser una fábrica para el otro.Cuando Foo saca una nueva barra, la conexión ya se ha realizado:

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

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

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

Creo que depende en gran medida de cuál sea la relación exacta entre los dos objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top