[Php-objetos] Gonzalo Re: [PHPOO] Correccion de ejercicios

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Vie Feb 20 00:58:28 ARST 2009


Hola Gonzalo,

El jue, 19-02-2009 a las 23:42 -0200, .txalo. escribió:
> Hola Leo!
> 
> >>Tenés un par de cosas mal en el ejercicio.
> 
> A ver???
> 
> >>Una es que Combustible lo tenés como atributo en todas las clases,
> pero
> >>en vez de ponerlo en tu superclase Vehículo lo ponés en las
> subclases.
> >>Por qué $cantRuedas está en la superclase y Combustible no???
> 
> Eh?? No entiendo?? si lo puse en la superclase! 

	No lo vi... capaz que se me mezcló con otro script.

> Y tambien en el constructor de la superclase.
>    
>     function __construct ($ruedas, $consXKm, $combustible){
>         $this->cantRuedas = $ruedas;
>         $this->consumoPorKm = $consXKm;
>         $this->combustible = $combustible;        
>     }

	En c1e1h.php el constructor no está escrito de esta manera... 
	Capaz que estás viendo una versión más nueva del c1e1h.php que me
mandaste...

> >>Otra cosa es que el constructor espera como parámetros atributos del
> >>Combustible en vez de al Combustible. Esto no tiene sentido porque
> >>entonces la interfaz que mostrás al mundo no revela que dentro hay
> un
> >>Combustible y no tenés setters ni getters de los atributos del
> >>combustible para usarlos o leerlos más tardel
> 
> COmo que no?????? Si los puse ... o estoy borracho?? 
> Eso me pasa por mandarte dos archivos!!
> Agregue los metodos getNombreCombustible(), getValorCombustible().

	Estos métodos no están en c1e1h.php ... los tengo a la vista!

> >>Un Auto debería tener algún mecanismo para responder al mensaje
> "decime qué combustible usás".
> 
> Y preguntale!! Si ahi lo agregue!

	Bueno, ahora sí, pero antes no y por eso la observación.

	Ahora, por un cambio en la nueva versión, si hago:

$miAuto = New Auto(4, 5, 0.08, $nafta);
print "Consumo $ por Km: ".$miAuto->calcularConsumo()."<br/>";
$nafta->setValor(4.5);
print "Nuevo Consumo $ por Km: ".$miAuto->calcularConsumo()."<br/>";

	El valor del consumo del auto varía, lo cual no es el comportamiento
esperado y no pasaba en la versión anterior...

	Coregilo!!

> Ejercicio 2:
> 
> >> La idea está bien.
> 
> Es como lo entendi yo .... mucho no se hablo del ejercicio 2,
> estuvimos 2 horas con los autitos!

	Vox Populi, Vox Dei... nadie tocó este tema y nos dieron las 6...

> >>  La implementación tiene 2 errores.
> 
> A ver ...
> 
> >>      Uno es que $almacen->add() debería esperar un Objeto de clase
> Artículo
> >>en el mensaje, y no la lista de los atributos.
> 
> Liste! le paso un articulo como atributo!

	Ok.
	No tiene así "mejor forma" la cosa ???

> >>       Un iterador no debe depender del conocimiento de la cosa que
> itera.
> >>Debe poder iterar cualquier cosa! Para casos particulares como este,
> se
> >>puede decir que el iterador mantiene una colección de un tipo de
> objeto
> >>dado y no de otros, pero jamás de una lista de atributos.
> 
> Sigo sin entender como funciona el iterador, podrias explicarlo mejor?
> es decir ... como lo uso en forma generica, lo que hice es lo que se
> me ocurrio con la poca informacion que tenia.

	Forma genérica:

public function add($articulo){
	$this->unaEstructura[] = $articulo;
}

	Acá podés meter Objetos de cualquier clase.

	Forma especializada:

public function add(Articulo $articulo){
	$this->unaEstructura[] = $articulo;
}

	Acá podés meter solo Objetos de clase Artículo.

	Cuando se usa una o la otra?
	En la primera no se espera que el Iterador sepa hacer algo con los
Objetos más que recorrerlos. Ergo, no interesa de que clase son.
	En la segunda, como es tu caso de implementación, el iterador hace algo
con su contenido, lo que significa que sí o sí los Objetos que contiene
deben responder a un protocolo en particular, ya sea porque es heredado
o porque es polimórfico.

> >>       Es el mismo error conceptual del ejercicio anterior en el
> constructor.
> 
> Arreglado!

	Ok.

> >>       El otro es que el cálculo del precio está mal: devolvés la
> suma unitaria en vez de cuanto vale el stock completo.
> 
> Espero no equivocarme pero el ejercicio no hablaba de stock, pero
> bueh! no te voy a contradecir y le agregue el stock.

	No habla de stcok, habla de "peso" y de "precio".
	tal vez consideraste que 

$arroz = new Articulo ("Arroz", 5, 1)

	era $5 cuesta 1Kg, pero que

$arroz = new Articulo ("Arroz", 7, 10)

	significa que $7, cuestan los 10Kg.

	Es decir, consideraste que el precio siempre era por el total pasado y
no por unidad de medida.
	La idea del stock valorizado era multiplicar el precio por el peso que
haya... se me escapa por completo como interpretás tu

$harina = new Articulo ("Harina",2.5,1, 34);

	$2.5 vale 1Kg y tengo "34 unidades de 1Kg" ???

	Si es así, entonces esto:
$duraznos = new Articulo ("Duraznos",4.5,0.6, 11);

	que tenés 11 "bolsas" de 600gr ???!!!???

	Por supuesto, se aceptan sugerencias para mejor redacción de este y de
cualquier otro ejercicio... pero que en el enunciado no esté la
solución, sino solo el problema!

	Por otra parte, si tenés tiempo porque estos son opcionales, pensá cómo
debería comportarse ante este caso:

...
$harina = new Articulo ("Harina",2.5,1, 34);
$duraznos = new Articulo ("Duraznos",4.5,0.6, 11);
$panLactal = new Articulo("Pan Lactal", 5, 1.2, 12);
$harina2 = new Articulo ("Harina",3,1.5,10);

$almacen->add($harina);
$almacen->add($duraznos);
$almacen->add($panLactal);
$almacen->add($harina2);
...

	Y otra, más opcional que esta: cómo se borra un elemento del Almacén ?

> Abrazo! 
> Gracias.

	Por nada!
-- 
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