[Php-objetos] Ping Pong jeje
Juan Marcos
malditared en hotmail.com
Lun Feb 16 20:28:39 ART 2009
Hola Leo.
> La solución a esto es facilícima: en vez de pasar al constructor
> valores del Objeto Componente, directamente pasás una instancia del
> Objeto y listo!
Claro, eso es exactamente lo que hice! Sin embargo me lo marcaste como que no es el caso porque se mezcla la Agregación con la Composición.
> Con la implementación que me mandaste, no hay cómo hacer que
> getCombustible() no haga lo que hace... me parece que seguís mareado con
> composición/agregación.
Lo que quiero consultar es si tengo que cambiar el getCombustible() y setCombustible(), es decir, si asi como está no es como debería. ¿Debo hacer que el setCombustible() tome como parámetro un objeto y éste lo use para obtener los valores a setear del combustible? por ejemplo:
class Vehiculo {
...
public function setCombustible($combustible) {
$this->combustible->setTipo($combustible->getTipo());
$this->combustible->setValor($combustible->getValor());
return true;
}
public function getCombustible() {
$temp->new Combustible($this->combustible->getTipo(), $this->combustible->getValor());
return $temp;
}
...
} // class Vehiculo
Si lo hacemos de este modo los setters y los getters no devolverían/insertarían en sí el objeto y el combustible quedaría "aislado" dentro de Vehículo. ¿Es así como se deberia hacer? Esto haria como digo yo que Vehículo dependa aún más de Combustible, pero si esta es la forma en que se resuelve el ejercicio, lo hago asi.
> > 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.
>
> Si hacés $c2=null, perdés el atributo y calcularConsumo() de tu
> implementación no funciona más...
Ups...
Saludos Leo! y a toda la lista también, no me ofendo si alguien más opina sobre el tema, al contrario!, al fin y al cabo es una lista y las consultas en general van para el que quiera responder, no solo para Leo.
Suerte!
- Juan Marcos.
---
> From: leonardot en pegasusnet.com.ar
> To: php-objetos en pato2.fi.mdp.edu.ar
> Date: Mon, 16 Feb 2009 19:43:30 -0200
> Subject: Re: [Php-objetos] Nueva entrega de ejercicio 1.
>
> Hola Juan,
>
> El lun, 16-02-2009 a las 19:03 -0200, Juan Marcos escribió:
> > De a poco se me aclara la visión, mas que nada entendiendo un poco más
> > lo de Composición,
>
> Me alegra.
>
> > 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.
>
> Bueno, en todo caso esto no rompería el encapsulamiento: a lo sumo un
> cambio en la implementación de el Objeto componente te afecta al
> constructor del Objeto continente.
> La solución a esto es facilícima: en vez de pasar al constructor
> valores del Objeto Componente, directamente pasás una instancia del
> Objeto y listo!
> Igual al ser la Composición una relación tan fuerte, es de esperar que
> un cambio en un Componente cambie al Objeto entero...
>
> > 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.
>
> Esto no es cierto: si bien a nivel de argumentos del mensaje no hay
> cambio, no tendrías como saber ni siquiera cómo se llaman los setters y
> getters del Objeto, así que estás en la misma, pero en otro lugar.
>
> > 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,
>
> Correcto: es una implementación más rebuscada de lo que te envío yo...
>
> > 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),
>
> Con la implementación que me mandaste, no hay cómo hacer que
> getCombustible() no haga lo que hace... me parece que seguís mareado con
> composición/agregación.
>
> > le quitaría todo propósito de utilizar un objeto para Combustible.
>
> Por qué le "quitaría el propósito" ???
>
> > 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.
>
> Si hacés $c2=null, perdés el atributo y calcularConsumo() de tu
> implementación no funciona más...
>
> > 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.
>
> Yo también prefiero que lo discutamos.
> Tal vez para estar más convencido deberías remitirte a bibliografía más
> extensa sobre este tema, además del apunte que necesariamente es un
> resumen.
> "Design Object Oriented Software" de Wirf-Brook es un libro que se
> explaya varios capítulos sobre este asunto.
> Si me pasás títulos y autores, te ayudo a diferenciar a los
> chapuceros...
>
> > Salute!
>
> =mente!
> --
> 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
_________________________________________________________________
¿Aburrido? Ingresá ya y divertite como nunca en MSN Juegos.
http://juegos.ar.msn.com/
------------ 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/a852ef04/attachment.htm
Más información sobre la lista de distribución Php-objetos