POO-ITBA / 2023_02

0 stars 0 forks source link

Parcial 23/09/2021 ej 3 #11

Open lulostupnik opened 1 year ago

lulostupnik commented 1 year ago

Hola Franco, como estas? Queria saber si esta solucion es correcta, ya que use un ENUM mas, y me quedo medio diferente a la subida. Hay un par de cosas que capaz se podrian incluir en los errores comunes que pusiste, pero no estoy totalmente seguro si esta bien o mal dado a la diferente implementacion. Gracias

package ej3;
import ej2.Person;

public enum AeroChair {
    AMANCAY(), HORSETOOTH(){
        @Override
        public boolean canRide(PersonType p){
            return true;
        }
    }, SIXFOLD();

    public boolean canRide(PersonType p){
        return p.equals(PersonType.SKI);
    }
}
package ej3;

public enum PersonType {
    SKI(){
        @Override
        public String toString(){
            return "Ski";
        }
    }, VISITOR(){
        @Override
        public String toString(){
            return "Visitor";
        }
    };
}

package ej3;

public class Ticket {
    private PersonType p;
    private int cantTrips;
    private int ticketNum;
    public Ticket(PersonType p, int cantTrips, int ticketNum){
        this.p = p;
        this.cantTrips = cantTrips;
        this.ticketNum=ticketNum;
    }

    public void ride(){
        cantTrips--;
    }
    public boolean ridesLeft(){
        return cantTrips > 0;
    }
    public PersonType getPersonType(){
        return p;
    }

    @Override
    public String toString(){
        return "%s ticket %d has %d rides left".formatted(p.toString(), ticketNum, cantTrips);
    }
}
package ej3;

public class TicketOffice {
    private static int lastId = 1001;
    public void ride(Ticket t, AeroChair chairType){
        if(!t.ridesLeft()){
            throw new IllegalArgumentException("No more rides left for ticket");
        }
        if(!chairType.canRide(t.getPersonType())){
            throw new IllegalArgumentException("Invalid chairlift for ticket");
        }
        t.ride();
    }
    public Ticket buyVisitorTicket(int cantTrips){
        return new Ticket(PersonType.VISITOR, cantTrips, TicketOffice.lastId++);
    }
    public Ticket buySkiTicket(int cantTrips){
        return new Ticket(PersonType.SKI, cantTrips, TicketOffice.lastId++);
    }
}
fmeola commented 1 year ago

Hola @lulostupnik Es raro lo de usar un enum para el PersonType en lugar de hacer dos clases tickets pero entiendo lo que quisiste hacer y te quedó sencillo porque aprovechaste que un enum "dependa" del otro. En este caso la penalización no es grave porque, de hacerlo con clases, no hay ninguna variable de instancia distinta o cuerpo de método distinto que no se puede mandar al enum de AeroChair. Si ya necesitás campos distintos o código distinto en los métodos ahí si o sí tenés que ir con dos clases hijas. Igual el método ride de TicketOffice no está bien de estilo: estás haciendo allí código que debería estar en la clase Ticket. Fijate que hacés t.ridesLeft, después t.getPersonType y al final t.ride. Si siempre estoy llamando desde afuera a varios métodos de Ticket mejor que Ticket lo haga directamente en su clase.

lulostupnik commented 1 year ago

Claro, perfecto, gracias