Paso de mensajes entre objetos: ¿cómo hacer referencia al objeto de destino?
-
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?
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).
Otros consejos
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.