POO-ITBA / 2024_01

Consultas 1C 2024
0 stars 0 forks source link

Parcial 1 2023 2C Ej 2 #31

Closed whatisthisgit closed 2 months ago

whatisthisgit commented 2 months ago

Buenas tardes, queria saber si mi resolucion del ej 2 de el parcial en el titulo esta bien, en particular el uso de StringBuilder en toString para Lounge y sus descendientes.

public class Passenger 
{
    private String name;
    private String airline;
    private int passes;

    Passenger(String name, String airline, int passes)
    {
        this.name = name;
        this.airline = airline;
        this.passes = passes;
    }

    public void decrement_passes()
    {
        passes--;
    }

    public boolean check_passes()
    {
        return passes > 0;
    }

    public String getAirline()
    {
        return airline;
    }

}

public class LoungeCentral {

    private boolean isOpen = true;

    public void openLounges() {
        isOpen = true;
    }

    public void closeLounges() {
        isOpen = false;
    }

    public boolean isOpen() {
        return isOpen;
    }
}

public class LoungeException extends RuntimeException
{
    private final static String MESSAGE = "Cannot enter lounge.";

    LoungeException()
    {
        super(MESSAGE);
    }

    LoungeException(String message)
    {
        super(message);
    }

}

public class Lounge 
{
    private String name;
    private int guests;
    private LoungeCentral cl;

    Lounge(LoungeCentral cl)
    {
        this.cl = cl;
    }

    public String getName()
    {
        return name;
    }

    public int getGuests()
    {
        return guests;
    }

    public boolean canEnter(Passenger passenger)
    {
        return passenger.check_passes() && cl.isOpen();
    }

    public void enter(Passenger passenger)
    {
        if(!canEnter(passenger))
        {
            throw new LoungeException();
        }
        passenger.decrement_passes();
        guests++;
    }

    public void exit(int amount)
    {
        if(amount > guests)
        {
            throw new LoungeException("Lounge is empty.");
        }
        guests -= amount;
    }

    public void exit()
    {
        exit(1);
    }

    @Override
    public String toString()
    {
        StringBuilder s = new StringBuilder(String.format("%s has %d guests", getName(), getGuests()));
        return s.toString();
    }

}

public class CapLounge extends Lounge
{
    private int max;

    CapLounge(LoungeCentral cl, int max)
    {
        super(cl);
        this.max = max;
    }

    public int getMaxGuests()
    {
        return max;
    }

    @Override
    public boolean canEnter(Passenger passenger)
    {
        return super.canEnter(passenger) && getGuests() < max;
    }

    @Override
    public String toString()
    {
        StringBuilder s = new StringBuilder(super.toString()).append(String.format(" up to %d guests", getMaxGuests()));
        return s.toString();
    }

}

public class VIPLounge extends CapLounge 
{
    private String airline;

    VIPLounge(LoungeCentral cl, int max, String airline)
    {
        super(cl, max);
        this.airline = airline;
    }

    public String getAirline()
    {
        return airline;
    }

    @Override
    public boolean canEnter(Passenger passenger)
    {
        return super.canEnter(passenger) && passenger.getAirline().equals(airline);
    }

    @Override
    public String toString()
    {
        StringBuilder s = new StringBuilder(String.format("%s ", getAirline())).append(super.toString());
        return s.toString();
    }
}

Tambien tenia otras dudas: Predicate se puede usar en el recuperatorio del parcial 1? No termino de entender cuando nos conviene crear un interfaz nuevo en lugar de una clase abstracta nueva, a menos que sea un caso en el cual hay varias clases que tienen que tener variables en comun, algunos metodos en comun y otros metodos diferentes (se usa una clase abstracta en este caso, ya que las interfaces no pueden tener variables a menos que sean estaticas), o un caso en el cual hay varias clases que no estan relacionadas que tienen que tener un conjunto de metodos para encarnar una cierta caracteristica (las interfaces ya incorporadas de java son asi). Y si hay otras excepciones comunes que deberiamos recordar ademas de RuntimeException, IllegalArgumentException, y NoSuchElementException. Tambien me gustaria saber la fecha del recuperatorio del segundo parcial si ya la tienen.

Gracias

fmeola commented 2 months ago

Hola @whatisthisgit Fijate que en Lounge no estás recibiendo name entonces esa variable siempre será null StringBuilder es útil cuando utilizás un método append para ir armando el string de a partes. Así que está bien CapLounge y VipLounge pero en Lounge es redundante, ahí el toString debería ser el String.format directamente. En Lounge el método getGuests debería ser protected En CapLounge el método getMaxGuest no es necesario

Respecto a las otras dudas:

whatisthisgit commented 2 months ago

Muchas gracias Franco.