Hola! estoy preparando el final para febrero, hice esta resolucion de la parte A de wollk , si alguien lo hizo para comparar resultados.
dejo el link abajo del final
https://docs.google.com/document/d/1kKkH...yTeQI/edit
saludos
Parte A)
1) a)Falso. No es correcto que la clase empresa sea la que realice la lógica de un producto , el paradigma de ojetos no intenta representar fielmente la realidad sino modelarla, lo correcto seria delegar responsabilidades de venta para las clases PlanVip, PlanNormal.
b) Falso, no es correcto preguntar a los planes PlanVip y PlanNormal si es esVip, ya que se esta preguntando para cada plan si es Vip, no es un buen uso del polimorfimo aunque reciban un mismo mensaje, esta hecho para tomar una decisión desde afuera.
c) verdadera, gracias a que se resuelve con composición (el cliente conoce su plan y se puede realizar una asignación para cambiar el plan del cliente), es posible cumplir con lo que se pide.
d) falso, lo correcto seriá que en la clase Cliente el mensaje pagar : monto, se le pregunte si el dinero es mayor al monto, si es verdadero, se le descuenta el dinero según el plan que tenga cada cliente, y si es False se arroja una excepción que no tiene suficiente dinero
2)
class Empresa {
method venderA(producto, cliente){
if(not producto.hayStock()){
return false
}
if (cliente.pagar(cliente.plan().precioAPagar(producto, cliente))){
cliente.agregarProducto(producto)
producto.decrementarStock()
}
return true
}
}
class Producto{
var stock
var costo
method costo() = costo
method decrementarStock(){
stock -= 1
method hayStock(){
return stock >= 1
}
}
class PlanVip {
method precioAPagar(producto, cliente){
return producto.costo() * 0.75
}
}
class PlanNormal {
method precioAPagar(producto, cliente){
if(not cliente.yaCompro()){
return producto.costo() * 0.9
} else {
return producto.costo()
}
}
}
class Cliente {
var productos = #{}
var dinero
var plan
method plan() = plan
method pagar(monto) {
if(dinero >= monto){
dinero -= monto
return true
}else{
self.error("No tiene suficiente dinero")
return false
}
}
method yaCompro(){
return not productos.isEmpty()
}
method agregarProducto(producto){
productos.add(producto)
}
}