2009-05-27 11 views
5

Supongamos que Object1 necesita información de Object2. Diré que está en una propiedad de Object2, pero la información podría ser fácilmente el valor de retorno de una función de Object2. Cuando miro el código de los demás, veo que a veces tendrán un método en Object1 que acceda directamente a la propiedad. En otras ocasiones, veo que las personas pasan Object2 como un parámetro en un método, y luego acceden a la propiedad desde Object2 pasado.OOP Novato: Acceso a los campos directamente frente a pasar objetos como parámetros

Estos escenarios me parecen casi iguales. El acceso directo a la propiedad parece más simple. Como novato, ¿en qué crees que debería pensar al decidir cómo Object1 debería obtener información de Object2? (Cuando iba a querer tener un parámetro de objeto en lugar de acceder directamente a la propiedad?)

Gracias - Al C.

+0

Un ejemplo real sería útil. –

Respuesta

9

Uno de los problemas con el paso de Object2 a Object1 es que se crea una dependencia entre Object2 y Object1. La única forma en que Object1 puede obtener los datos que necesita es tener una referencia a Object2.

Ahora, a veces quieres eso, pero la mayoría de las veces no. Por lo tanto, es mejor que simplemente transfiera el valor que necesita como parámetro al método, en lugar de pasar la instancia de Object2.

1

Todo trata de si Object1 sabe o no sobre Object2. En OOP, parte del buen diseño es que los objetos almacenen la menor información posible que les permita comportarse adecuadamente. Entonces, el problema básicamente se reduce a: ¿necesita Object1 saber sobre la existencia de Object2 (es decir, ¿necesita una instancia de Object2 para existir) o puede ser con sobre la existencia de una instancia de Object2? Por lo general, en OOP, desea inclinarse más hacia el último que el anterior.

Sin embargo, dicho esto, en una situación en la que Object1 puede operar en los datos que viene de Object2, la mejor manera sería probablemente para tener Object1 tiene un método que opera sobre los datos tipo de la propiedad en Object2; de esta forma, desacopla Object1 y Object2, en el sentido de que Object1 no tiene una dependencia en Object2 para proporcionar una propiedad determinada de una manera determinada; el código de llamada puede conectar los dos.

+0

Estoy un poco confundido acerca de cómo Object1 se podría contar acerca de Object2 sin conocer la existencia de Object2. –

+0

@AlC: piensa en la inyección de dependencia. –

1

Sí, lo que dice Randolpho es cierto.

Recuerde, con OOP tiene el objetivo de crear identidades separadas que puedan funcionar como un todo en el sistema. Cuando comienzas a crear objetos que dependen mucho el uno del otro, no solo aumentas tus posibilidades de errores, sino también la posibilidad de que tu programa ya no funcione.

Ahora su ejemplo es menor, pero imagínese que 5, 10, 100 objetos se llaman unos a otros a través de parámetros, eso es un trabajo desagradable.

3

Si el método solo necesita el valor de una propiedad de Object2, sería mejor pasar ese valor de propiedad directamente. Si el método necesita acceso a muchas propiedades u otras características de Object2, sería apropiado pasar una referencia a Object2.

Existen excepciones: si necesita proteger la firma del método (es decir, es público) y prevé el uso adicional de Object2 dentro del método en el futuro, puede ser apropiado pasar la referencia del objeto.

Las respuestas anteriores también son válidas: debe considerar el acoplamiento de Object1 y Object 2 cuando tome esta decisión.

1

Eche un vistazo a Encapsulation en la wikipedia.

La encapsulación [..] protege la integridad del componente, al impedir que los usuarios establezcan los datos internos del componente en un estado no válido o incoherente.

2

Por lo general, el objetivo es minimizar el acoplamiento entre los objetos.

Usemos un ejemplo simple donde tengo tres objetos; un AppController, que contiene una referencia a un DataController y MainWindowController. Debe pasar DataController.Data al MainWindowController, para que pueda visualizar los valores en una tabla en la ventana principal. Puede pasar DataController a MainWindowController como un parámetro de método o hacer que DataController sea una variable de instancia en MainWindowController. Para minimizar el acoplamiento, la manera más limpia es que AppController pase datos directamente a MainWindowController, por lo que no necesita saber nada sobre DataController.

Cuestiones relacionadas