Skip to content
This repository has been archived by the owner on Jul 23, 2024. It is now read-only.

PARCIAL 2022-1C EJERCICIO3 #9

Open
Jalbertonisalini opened this issue Sep 23, 2023 · 1 comment
Open

PARCIAL 2022-1C EJERCICIO3 #9

Jalbertonisalini opened this issue Sep 23, 2023 · 1 comment

Comments

@Jalbertonisalini
Copy link

Jalbertonisalini commented Sep 23, 2023

Buenas! Queria preguntar por esta resolucion. Esto imprime lo que debe pero comparando con la solucion veo que puede ser que se repita mucho codigo... Queria saber de esta manera que tan mal está, es decir que tan penalizable es. Muchas gracias!

`package AR.EDU.ITBA.POO._PARCIALES1P._20221C.EJERCICIO3;

import java.util.Objects;

public class Attraction {

private final String name;

public Attraction(String name){
    this.name = name;
}

public String getName() {
    return name;
}

@Override
public boolean equals(Object obj) {
    if(this == obj){
        return true;
    }
    if(!(obj instanceof Attraction aux)){
        return false;
    }
    return name.equals(aux.getName());
}

@Override
public int hashCode() {
    return Objects.hash(name);
}

}
`

`package AR.EDU.ITBA.POO._PARCIALES1P._20221C.EJERCICIO3;

import java.time.LocalDate;

public abstract class Pass implements CityPass{

private String clientName;
private LocalDate emissionDate;
private Attraction[] attractions;
private int visitCount;

public Pass(Attraction[] attractions, String clientName, LocalDate emissionDate){
    this.clientName = clientName;
    this.emissionDate = emissionDate;
    this.attractions = attractions;
    visitCount = 0;
}

public LocalDate getEmissionDate() {
    return emissionDate;
}

public void IncrementVisitCount(){
    visitCount++;
}

@Override
public Attraction[] getAttractions() {
    return attractions;
}

public String getClientName() {
    return clientName;
}

public boolean canVisit(Attraction attraction, LocalDate date){
    return belongsIn(attraction) &&  (this.emissionDate.isBefore(date) || this.emissionDate.isEqual(date));
}

@Override
public String toString() {
    return "City Pass for %s used for %d attractions".formatted(clientName,visitCount);
}

}
`

`package AR.EDU.ITBA.POO._PARCIALES1P._20221C.EJERCICIO3;

import java.time.LocalDate;

public class UnlimitedPass extends Pass{

public UnlimitedPass(Attraction[] attractions, String name, LocalDate emissionDate){
    super(attractions,name,emissionDate);
}

@Override
public void visit(Attraction attraction, LocalDate date) {
    if (canVisit(attraction, date)) {
        IncrementVisitCount();
        System.out.println("%s visited %s".formatted(getClientName(), attraction.getName()));
        return;
    }
    throw new CannotVisitAttractionException(attraction.getName());
}

}
`

`package AR.EDU.ITBA.POO._PARCIALES1P._20221C.EJERCICIO3;

import java.time.LocalDate;

public class LimitedVisitsPass extends Pass{

private int availablePass;

public LimitedVisitsPass(Attraction[] attractions, String name, LocalDate emissionDate, int availablePass){
    super(attractions,name,emissionDate);
    this.availablePass = availablePass;
}

public void spendVisit(){
    availablePass--;
}

@Override
public void visit(Attraction attraction, LocalDate date) {
    if (canVisit(attraction,date)){
        if(availablePass > 0){
            System.out.println("%s visited %s".formatted(getClientName(), attraction.getName()));
            IncrementVisitCount();
            spendVisit();
            return;
        }
    }
    throw new CannotVisitAttractionException(attraction.getName());
}

}
`

`package AR.EDU.ITBA.POO._PARCIALES1P._20221C.EJERCICIO3;

import java.time.LocalDate;

public class endDatePass extends Pass{

private LocalDate endDate;

public endDatePass(Attraction[] attractions, String name, LocalDate emissionDate, LocalDate endDate){
    super(attractions,name,emissionDate);
    this.endDate = endDate;
}

@Override
public void visit(Attraction attraction, LocalDate date) {
    if (canVisit(attraction,date)){
        if (endDate.isAfter(date) || endDate.isEqual(date)){
            System.out.println("%s visited %s".formatted(getClientName(), attraction.getName()));
            IncrementVisitCount();
            return;
        }
    }
    throw new CannotVisitAttractionException(attraction.getName());
}

}
`

@fmeola
Copy link
Member

fmeola commented Sep 23, 2023

Hola @Jalbertonisalini
Sí, vamos a penalizar que estés repitiendo código del método visit.
En las tres haces:

  • Invocación a canVisit
  • System.out
  • Invocación a IncrementVisitCount
  • throw new CannotVisit...
    Deberías invocar a super.visit para reutilizar comportamiento o directamente no sobreescribirlo.
    Es muy importante lo de canVisit para poder agregar condiciones extras en las clases hijas en lugar de hacer dos if anidados como tenés ahora.
    En el caso de LimitedVisitsPass podés seguir haciendo lo de spendVisit haciendo primero super.visit y luego invocando a spendVisit. Si super.visit lanzó excepción entonces spendVisit nunca se va a invocar.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants