[Php-objetos] Andrés Re: Envio Ejercicio 1
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Mar Feb 24 18:41:50 ARST 2009
Hola Andrés,
El mar, 24-02-2009 a las 09:16 -0200, Andres Manuel escribió:
> Leonardo Tadei - Pegasus Tech Supply escribió:
> > Hola Andrés,
> >
> > El lun, 23-02-2009 a las 14:16 -0200, Andres Manuel escribió:
> >
> >> Aqui el ejercicio numero uno, tarde pero seguro, BETA por las dudas, jajaja
> >>
> >
> > Está bastante bien hecho.
> >
> > Una corrección y dos observaciones:
> >
> > Corrección: hacés
> >
> > $auto=new Auto('Gasoil',1.88,3,8,66);
> > $auto->combustible->setTipo('gassss');
> > $auto->combustible->setValor(12.44);
> >
> > Lo que significa que para el constructor de Auto, pasás valores del
> > Combustible en el mensaje, pero después permitís usar el objeto
> > Combustible directamente.
> > O una cosa, o la otra, las dos no, porque el código queda incoherente.
> > O repetís la interfaz del Combustible como métodos propios del Auto para
> > definirlo y ponerle un valor, o le pasás al constructor un objeto
> > Combustible.
> >
> Leo lo habia hecho de la segunda manera y me habias dicho que estaba
> mal, por eso lo cambie.
No Andrés, en tu envío anterior estaba mal por haber usado agregación
en vez de composición, no por haber pasado como argumento en el mensaje
de creación al Combustible.
De todas formas, la forma de los mensajes no tiene tanto que ver con si
es una composición o una agregación: se pueden enviar los mensajes de
las 2 maneras y ser composición, o de las mismas dos maneras y ser
agregación.
> Habia hecho metodos propios para modificar los valores de combustible:
>
> $auto->setCombustibleValor($valor);
>
> Estos modificaban el objeto 'Combustible'. Me dijiste que no debia
> hacerlo asi, por que no era el comportamiento esperado.
Lo que no era lo esperado, era que si hacías
$unCombustible->SetValor(10);
se cambie el estado interno del Objeto que contenía este combustible.
> que era como repetir un metodo por que ese metodo hacia lo mismo que
>
> $combustible->setValor($valor);
>
> entonces me dijiste que lo implemente de la siguiente manera:
>
> $auto->combustible->setValor($valor);
Totalmente! Porque es lo más corto de escribir.
Lo que está seguro mal, conceptualmente hablando, es que para unos
métodos del Vehículo pases como parámetro al objeto Combustible, y para
otros pases los atributos del Combustible.
> Ahora tengo un hermoso merengue en la cabeza, pense que ya lo entendia,
> hasta que llego este mail.
Me parece que se te mezcló el tema de "dónde se hace el new" para
determinar una composición o una agregación, del "qué interfaz expone el
objeto", que es lo único que te observé en el mail anterior...
> > Observación: tenés en varios métodos cosa de la forma
> >
> > if (is_int($valor)){
> > $this->plazas=$valor;
> > }else{
> > throw new Exception("El valor de plazas debe ser de tipo entero.");
> >
> > y lo mismo para los string.
> >
> > Lo que me preocupa es que sigas adelante pensando que la idea de
> > preguntar IF (get_class() == Pirulo) para saber si lo que recibís es de
> > una clase dada. Necesitar hacer esta pregunta siempre es por un error de
> > diseño.
> >
> >
> Quisiera que me explicaras como validar esos tipos haciendo lo correcto,
> busque en www.php.net pero no encuentro la solución,
> y no me imagino tampoco, pero quisiera aprender, para no errar en lo
> mismo. Aun que sea pasame un dato en donde pueda leer.
> Thanks
Un mecanismo te lo digo en el mail pasado: create una clase String y
casteá el mensaje.
Es que lo que pasa, por el funcionamiento de PHP y sus datos No
Tipados, es que esto no es muy validable. Entonces la mejor estrategia
si no te escribís clases String, Integer y Float es validar al hacer los
cálculos que usen a los atributos.
No se me ocurre dónde leer esto... no es un tema puntual, sino la
intersección de varios temas y features del lenguaje.
Seguimos!
--
Leonardo Tadei
leonardot en pegasusnet.com.ar
http://blog.pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
Más información sobre la lista de distribución Php-objetos