[Php-objetos] Nueva entrega de ejercicio 1.

Juan Marcos malditared en hotmail.com
Lun Feb 16 19:03:25 ART 2009


De a poco se me aclara la visión, mas que nada entendiendo un poco más lo de Composición, pero tengo una astilla todavia que me jode un poco. A lo que yo me refería con el hecho de que se rompía el encapsulamiento de Vehículo es, por ejemplo, que si el constructor de Combustible en lugar de tener dos parámetros como en este ejemplo, tiene 3, y el new de Combustible lo hago dentro de Vehículo, tengo que pasar un parámetro más al Vehículo en el momento de la creación, lo que hace que tenga que modificar Vehículo por algo que cambié en Combustible. O si me las arreglo para pasar el valor de otra forma, de todas formas cuando llame al new de Combustible voy a tener que agregar el tercer parámetro dentro del constructor de Vehículo, lo que hace que se necesite un cambio en Vehículo. En cambio, si el new está afuera, esto no sucederia, ya que independientemente de cómo se cree el objeto, este se ingresaría y pasaría a ser un atributo de Vehículo de la misma forma que antes y Vehículo ni se enteraría.

Por otro lado lo que me comentabas en:
> ...
> $c2 = new Combustible("GNC", 50);
> $pickup1 = new Pickup($c2, 4, 20, 3000);
> $consumoPickup = $pickup1->calcularConsumo();
> print("Y su consumo es de: $$consumoPickup.");
> // Funciona como se espera.... pero
> $c2->setTipo("GNC2");
> $c2->setValor(75);
> $consumoPickup = $pickup1->calcularConsumo();
> print("Y su consumo es de: $$consumoPickup.");
> // devuelve otro valor.
> ...
> 	Cambia el resultado, con lo cual queda demostrado que tu implementación
> es una agregación, en lugar de una composición...

Es verdad que cambia el resultado, y si se hiciese algo como:
...
$nafta = $pickup1->getCombustible();
$consumoPickup = $pickup1->calcularConsumo();
$nafta->setValor(45);
$consumoPickup = $pickup1->calcularConsumo();
...
Esto también cambiaría, pero si hicieramos el getCombustible() de una forma que esto no pudiera suceder (por ejemplo, devolver los valores de forma que no se devuelva el objeto mismo), le quitaría todo propósito de utilizar un objeto para Combustible. En ambos códigos enunciados, para mi tiene más forma de una "metida de pata" en el uso de los mismos. A lo sumo podria hacer un $c2=null luego de crear el objeto $pickup1 para asegurarme de no hacer macana.


Parece una pavada que siga dando vueltas con el ejercicio 1 todavia, creo saber qué código es el que esperás que te devuelva, el tema es que yo quiero estar convencido de hacer las cosas de la mejor manera posible, porque si las hiciera solamente por contentar y sin estar convencido, despues voy a hacer las cosas como me parecen de todas formas y no habria aprendido nada. Por eso prefiero debatirlo mil veces y sacarme todas las dudas. Esto de programar para mi es como el ajedréz, las piezas son pocas y es fácil aprender a moverlas, pero para saber jugar tenés que tener paciencia y romperte la cabeza mas de una vez.


Salute!



- Juan Marcos.

---

> From: leonardot en pegasusnet.com.ar
> To: php-objetos en pato2.fi.mdp.edu.ar
> Date: Mon, 16 Feb 2009 15:10:01 -0200
> Subject: Re: [Php-objetos] Nueva entrega de ejercicio 1.
> 
> Hola Juan,
> 
> El lun, 16-02-2009 a las 13:15 -0200, Juan Marcos escribió:
> > Corregí lo que habiamos charlado (esta todo explicado en el comentario
> > de la cabecera del programa). Implementé lo de "Casting" de clases que
> > mandaste, anda fantástico (si hubiese sabido que se llamaba así me
> > hubiese ahorrado bastante tiempo jeje). Espero que esta vez cumpla con
> > las espectativas. Saludos!.
> 
> 	Cumple con mis expectativas, porque lo que espero es que trabajen estos
> conceptos.
> 
> 	Ya estás usando correctamente el tema de las excepciones y la herencia
> aplicada al método calcularConsumo.
> 	Respecto a tu código, tiene un error conceptual grande todavía.
> 	Decís:
> 
> **	Según lo conversado con Leonardo, corrijo dos conceptos (ambos fueron
> malentendidos en la
> **	entrega anterior): 
> **
> **	1) Cáda coche debe tener su combustible. En este caso seria una
> relación de Composición según
> **	lo que vimos escrito en una relacion 1 a 1. Lo que me genera otro
> dilema, debo...?:
> 
> 	Correcto: es mejor una composición. Sin embargo con tu explicación
> anterior, con la salvedad de que era "rara" no había problemas. La idea
> es concebir una solución y ser consistente con su impementación.
> 
> **	a) ¿Crear el objeto Combustible dentro del constructor de vehículo,
> tomando a través de éste
> **	los parámetros iniciales?
> 
> 	Bueno, así se implementa una composición: creando un Combustible dentro
> del constructor del auto...
> 
> ** La contra es que si debo modificar los parámetros del constructor
> **	de Combustible, voy a tener que corregirlos en Vehículo, lo que rompe
> el encapsulamiento de
> **	Vehículo.
> 
> 	Esto no viola el encapsulamiento de ninguna manera!
> 	No me doy cuenta en qué estás pensando cuando decís que se viola el
> encapsulamiento... podrías pasar un ejemplo?
> 
> **	b) ¿Esperar que el Combustible sea creado fuera del Vehículo, y luego
> insertado en el mismo?.
> **	De ésta forma, Vehículo no tendria conocimeinto innecesario alguno
> sobre la composición de
> **	Combustible, sólo usaría los comportamientos que necesita para
> interactuar con éste.
> 
> 	Una composición conoce siempre a los Objetos de los que forman parte,
> si no no los puede crear... es la relación más fuerte entre los objetos.
> 
> **	Creo que la mejor opción es el caso "b", que tomo como referencia a
> partir de ahora. El código
> **	no varía prácticamente de la versión anterior, solo el concepto, pero
> hay que	tenerlo en claro 
> **	para seguir la línea de diseño y contemplarlo en futuras
> actualizaciones.
> 
> 	Nooo! el código sí varía!
> 
> 	Tu decisión es hacer una composición, pero tu código es de una
> agregación.
> ...
> $c2 = new Combustible("GNC", 50);
> $pickup1 = new Pickup($c2, 4, 20, 3000);
> $consumoPickup = $pickup1->calcularConsumo();
> print("Y su consumo es de: $$consumoPickup.");
> // Funciona como se espera.... pero
> $c2->setTipo("GNC2");
> $c2->setValor(75);
> $consumoPickup = $pickup1->calcularConsumo();
> print("Y su consumo es de: $$consumoPickup.");
> // devuelve otro valor.
> ...
> 	Cambia el resultado, con lo cual queda demostrado que tu implementación
> es una agregación, en lugar de una composición...
> 
> 	Creo que crees que tus opciones a) y b) son excluyentes en vez de
> complementarias...
> 
> 	Bueno, quedo a la espera de la respuesta a tu pregunta de más arriba, y
> luego, de nuevo código.
> 	
> -- 
> Leonardo Tadei
> leonardot en pegasusnet.com.ar
> http://blog.pegasusnet.com.ar
> Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
> 
> _______________________________________________
> Php-objetos mailing list
> Php-objetos en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-objetos

_________________________________________________________________
Ingresá ya a MSN en Concierto y disfrutá los recitales en vivo de tus artistas favoritos.
http://msninconcert.msn.com/music/archive/es-la/archive.aspx
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://www3.fi.mdp.edu.ar/cgi-bin/mailman/private/php-objetos/attachments/20090216/f0622dcf/attachment.htm 


Más información sobre la lista de distribución Php-objetos