POO-ITBA / 2024_02

Consultas 2C 2024
3 stars 0 forks source link

TP1ej4 #6

Open felipeboya opened 1 month ago

felipeboya commented 1 month ago

Hola, tengo unas consultas sobre el ej 4. Yo lo hice con algunas diferencias de como esta en las soluciones y me gustaria saber si mi solucion es correcta. Mas que nada queria saber por que el metodo getAndIncrement deberia ser de clase, ya que creo que no tendria sentido invocarlo fuera de una instancia (osea sin que exista una instancia). Es porque no modifica ninguna variable de instancia? Y otra pregunta que tenia es para que se guardaria el valor inicial (INITIAL_NUMBER = 1000) como una constante y por otro lado el valor que le corresponde al siguiente (LAST_NUMBER), ya que el inicial solo se usa una vez.

class Affiliate{
    - String name
    - String lastName
    - String birthdate
    - int number
    - {static} int next = 1000
    + Affiliate(String name, String lastName, String birthdate)
    - int getAndIncrement()
}

Tambien hice la implementacion de la clase con un tester para probar si mi idea funcionaba y me dio el resultado correcto.

public class Affiliate {
    private final String name;
    private final String lastName;
    private final String birthdate;
    private final int number;
    private static int next = 1000;

    public Affiliate(String name, String lastName, String birthdate){
        this.name = name;
        this.lastName = lastName;
        this.birthdate = birthdate;
        number = getAndIncrement();
    }

    private int getAndIncrement(){
        return next++;
    }

    public String getBirthdate() {
        return birthdate;
    }

    public String getLastName() {
        return lastName;
    }

    public String getName() {
        return name;
    }

    public int getNumber() {
        return number;
    }
}

El tester que use es el siguiente:

public class AffiliateTester {
    public static void main(String[] args){
        Affiliate a1 = new Affiliate("Jose", "Garcia", "15/04/2004");
        System.out.println(a1.getName());
        System.out.println(a1.getNumber());

        Affiliate a2 = new Affiliate("Juan", "Perez", "13/02/2007");
        System.out.println(a2.getName());
        System.out.println(a2.getNumber());
    }
}

La salida fue: Jose 1000 Juan 1001

Gracias!

fmeola commented 1 month ago

Hola @felipeboya Sí, si vos ves que el cuerpo del método no accede o escribe una variable de instancia entonces el método debería ser de clase. En general los métodos getters o setters de variables de clase también serán métodos de clase. Lo de INITIAL_NUMBER es una buena práctica para no tener magic numbers. En el siguiente caso:

    private static int next = 1000;

tenés un magic number. Así como en C hacíamos un define acá vamos a declarar una constante como private static final. Deberías tener

    private static final int INITIAL_NUMBER = 1000;
    private static int next = INITIAL_NUMBER;

Bien la implemetación. Recuerden que todavía estamos arrancando con Java así que el TP1 es sólo para hacer UML. Desde el TP2 sí haremos código en Java.