Autor Tema: Cuestiones sobre el diseño Java y evitar el uso de atributos superfluos CU00633B  (Leído 2125 veces)

umadara

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 45
    • Ver Perfil
Buenas tardes otra vez, os subo mi resolución para el ejercicio del título CU00633B del taller de programación en lenguaje Java.

Código: [Seleccionar]
/**
 * Clase de medico.
 * @author (umadara)
 * @version (1.0)
 */
public class medico
{ //nombre de la clase
   
    //atributos de la clase
    public String nombre; //nombre del medico
    public String apellidos; //apellidos del medico
    public int edad; //edad del medico
    public boolean casado; //casado o no
    public String numeroDNI; //numero documento de identidad
    public String especialidad; //tipo de especialidad
    public int faltaEdad; //años que faltan para que la edad sea multiplo de 5
   
    //constructor
    public medico () {
        nombre = "Iván";
        apellidos = "Soldado";
        edad = 30;
        casado = true;
        numeroDNI = "12345678";
        especialidad = "anestesia";
        faltaEdad = 5;
    } //fin del constructor
   
    //metodos para establecer variables
    //metodo nombre
    public void setNombre (String valorNombre) {
        nombre = valorNombre;
        System.out.println ("el nombre del médico cambia a " + getNombre());
    }
    //metodo apellido
    public void setApellidos (String valorApellidos) {
        apellidos = valorApellidos;
        System.out.println ("el apellido del médico " + getNombre() + " cambia a " + getApellidos());
    }
    //metodo edad
    public void setEdad (int valorEdad) {
        edad = valorEdad;
        System.out.println ("la edad del médico " + getNombre() + " cambia a " + getEdad());
        setFaltaEdad(valorEdad);
    }
    //metodo casado
    public void setCasado (boolean valorCasado) {
        casado = valorCasado;
        System.out.println ("el estado matrimonial del médico " + getNombre() + " a cambiado a " + getCasado());
    }
    //metodo numero DNI
    public void setNumeroDNI (String valorNumeroDNI) {
        numeroDNI = valorNumeroDNI;
        System.out.println ("el numero de DNI del médico " + nombre + " ha cambiado a " + getNumeroDNI());
    }
    //metodo especialidad
    public void setEspecialidad (String valorEspecialidad) {
        especialidad = valorEspecialidad;
        System.out.println ("la especialidad del médico de nombre " + getNombre() + " ha cambiado a " + getEspecialidad());
    }
    //metodo para el calculo de multiplo de edad
    public void setFaltaEdad (int valorFaltaEdad) {
        System.out.println ("el médico de nombre "+ getNombre() + ", con especialidad " + getEspecialidad() + " tendrá una edad múltiplo de 5 dentro de " + calculaEdad(valorFaltaEdad) + " años");
    }
   
    //metodo obtener variables
    //metodo nombre
    public String getNombre () {return nombre; }
    //metodo apellidos
    public String getApellidos () {return apellidos; }
    //metodo edad
    public int getEdad () {return edad; }
    //metodo casado
    public boolean getCasado () {return casado; }
    //metodo numero DNI
    public String getNumeroDNI () {return numeroDNI; }
    //metodo especialidad
    public String getEspecialidad () {return especialidad; }
}
     

Creo que dentro de lo que cabe esta bien, aunque me lié mucho ya que cuando me salía un número múltiplo de 5, me ponía que faltaban 5 años. No subí la versión en la que resuelvo eso (con la ayuda de mi hermano), pero lo conseguí con el siguiente código (creo que no se ha visto todavía):
Código: [Seleccionar]
    private int calculaEdad(int edad) {
        int resultado = 0;
        if (edad % 5 != 0) {
            resultado = (faltaEdad - (edad % 5));
        }
        return resultado;
    }

Os agradecería me dijeseis si debería saber hacer eso, por mirarme otra vez las lecciones.
Un saludo
« Última modificación: 05 de Julio 2016, 19:45 por Alex Rodríguez »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:(CU00633B) Operadores aritméticos en Java. +, -, *, / y %
« Respuesta #1 en: 30 de Junio 2016, 15:29 »
Hola umadara:

He estado revisando tu ejercicio y veo que lo has hecho bien, felicitaciones por ello. Sin embargo déjame hacerte algunas observaciones que considero importantes desde el punto de vista de cómo pensar el código.

Defines un atributo llamado 'faltaEdad' donde guardarás la cantidad de años que le falta al médico para tener una edad múltiplo de 5.
Fíjate que ese es un dato superfluo ¿a qué me refiero con "superfluo"? Siempre a partir del campo 'edad' puedo calcular cuántos años le faltan para que su edad sea múltiplo de 5. Por lo tanto no usaré recursos del computador (en este caso un campo de instancia) para almacenar un dato que con un método puedo obtener en cualquier momento. Por lo tanto el atributo 'faltaEdad' no debiera existir, no es necesario almacenarlo, puedo calcularlo en cualquier momento a partir del atributo 'edad'.
Por lo tanto, en vez de definir el método 'setFaltaEdad', definimos un método llamado calculoParaMultiploEdad(), cuyo nombre tiene un poco más de sentido a lo que estamos pretendiendo hacer: un cálculo de edad, y no un 'set'.

¿Qué código debería incluir entonces este método calculoParaMultiploEdad()? pues mira cómo puede modificarse tu código a algo parecido a esto.

Código: [Seleccionar]
public void calculoParaMultiploEdad(){
        int moduloEdad;
        moduloEdad = edad % 5;
        moduloEdad = 5 - moduloEdad;
        System.out.println("El medico: " + nombre + " " + apellidos + " ,con especialidad: " + especialidad + " ,tendra una edad multiplo de 5 en " + moduloEdad + " anios.");
    }

Y en este punto -conforme a lo que expresabas en tu post- hago una salvedad acerca de la interpretación de la consigna del ejercicio:

Si el médico tiene 47 años, pues le faltan 3 años para tener una edad múltiplo de 5.
Si el médico tiene 25 años, pues le faltan 5 años para tener una edad múltiplo de 5 (por más que actualmente tenga una edad múltiplo de 5).
Pero insisto, es una interpretación de la consigna, no tiene mayor importancia.

Último  observación. En el constructor de la clase, deberías inicializar todos los campos a valor por defecto: los String inicializados a "", y los int a 0.

Espero haber sabido explicarme. Cualquier duda estamos aquí para revisarlo nuevamente.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".