Autor Tema: ¿Qué hacen métodos getter? Sólo deben devolver valor pedido nada más CU00632B  (Leído 3679 veces)

ronal.d87

  • Principiante
  • **
  • Mensajes: 72
    • Ver Perfil
Hola he aqui el desarrollo del código que planteo como solución al ejercicio CU00632B del curso básico de programación Java de aprenderaprogramar.

Código: [Seleccionar]
package ejemplo01;

/**
 *
 * @author Ronnie
 */
public class Medico {
    private String nombreMed, apellidosMed;
    private String numDoc, especialidad;
    private int edad;
    private boolean esCasado;

    public Medico() {
        nombreMed = "Juan Diego";
        apellidosMed = "Mosquera Herrera";
        numDoc = "12004754201";
        especialidad = "Podologo";
        edad = 4;
        esCasado = true;
    }

    public void setNombreMed(String nombreMed) {
       
        this.nombreMed = nombreMed;
    }

    public void setApellidosMed(String apellidosMed) {
        this.apellidosMed = apellidosMed;
    }

    public void setNumDoc(String numDoc) {
        this.numDoc = numDoc;
    }

    public void setEspecialidad(String especialidad) {
        this.especialidad = especialidad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public void setEsCasado(boolean esCasado) {
        this.esCasado = esCasado;
    }

    public String getNombreMed() {
        System.out.println("El nombre del medico ha cambiado ha ");
        return nombreMed;
    }

    public String getApellidosMed() {
        System.out.print("sus apellidos son ");
        return apellidosMed;
    }

    public String getNumDoc() {
        System.out.println("Su identificacion es ");
        return numDoc;
    }

    public String getEspecialidad() {
        System.out.println("Esta especializado en ");
        return especialidad;
    }

    public int getEdad() {
        System.out.println("Su edad es de");
        return edad;
    }

    public boolean esCasado() {
        System.out.print("su estaddo civil es casado ");
        return esCasado;
    }
   
    public static void main(String[] args) {
        Medico medico = new Medico();
       
        System.out.println(medico.getNombreMed());
        System.out.println(medico.getApellidosMed());
        System.out.println(medico.getEdad() + "años");
        System.out.println(medico.getNumDoc());
        System.out.println(medico.getEspecialidad());
        System.out.println(medico.esCasado() + ". Nota si es true (esta casado)\n"
                + "si es false (esta soltero)");

    }
   
   
   
}

« Última modificación: 04 de Junio 2020, 17:58 por Alex Rodríguez »
Ronald Mosquera Mancilla

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Respuesta CU00632B
« Respuesta #1 en: 23 de Agosto 2018, 01:00 »
Hola.
Comento lo que bajo mi humilde opinión no es enteramente correcto.

Los metodos getter, en principio, solo deberían devolver el valor que le estamos pidiendo.
Salvo casos muy concretos, no deberían encargarse de imprimir por consola ningún mensaje.

Esto es porque estos métodos han de servir para multiples propósitos, no solo para mostrar información en pantalla.
Me explico.
Pongamos como ejemplo este método:
Código: [Seleccionar]
public int getEdad() {
        System.out.println("Su edad es de");
        return edad;
    }

Supón que en nuestro programa tenemos un listado de 50 médicos, es decir, 50 objetos de la clase Medico.
Y supongamos que queremos calcular la media de edad de estos médicos, por lo que a cada objeto le pediremos que nos de su edad llamando a su método getEdad().
Esta edad no queremos mostrarla en pantalla, solo queremos que nos la devuelva para poder sumar todas las edades del listado de médicos, y luedo dividir por 50 para obtener la media.
Bien, pues con tu método, al pedir la edad a los 50 médicos, resulta que nos saldría en pantalla 50 veces el mensaje:
Citar
Su edad es de
Su edad es de
Su edad es de
Su edad es de
Su edad es de
...
Ni siquiera saldría el valor de las edades, ya que el método no imprime la edad, solo imprime el mensaje "Su edad es de" y el valor lo retorna.
Pero es que para este caso no queremos que imprima la edad, ni el mensaje, ni nada.
Tan solo queremos obtener los valores de cada edad para poder hacer operaciones aritméticas con ellos.

Así que quedaría muy extraño, y esto es porque le estás pidiendo al método getEdad() que haga cosas que no debería hacer.
Debería limitarse sola y únicamente, a devolver la edad:
Código: [Seleccionar]
public int getEdad() {
        return edad;
    }

Y ya luego, en el metodo main(), haremos las concatenaciones necesarias para mostrar el mensaje con la edad:
Código: [Seleccionar]
System.out.println("Su edad es de " + medico.getEdad() + " años");
Lo mismo con el resto de metodos "getter": getNombreMed(), getApellidosMed(), etc...
Deberían ocuparse de retorna el valor del atributo. Ya está, nada más. No es recomendable que además se ocupen de mostrar mensajes por consola ni ninguna otra cosa.

Quizás has incluido estos mensaje debido a este premisa del enunciado del ejercicio:
Citar
En cada método, incluye una instrucción para que se muestre por consola un mensaje informando del cambio.Por ejemplo si cambia la especialidad del médico, debe aparecer un mensaje que diga: “Ha cambiado la especialidad del médico de nombre … . La nueva especialidad es: …”.

Vale, pues de esos mensajes deberían encargarse los "setters", no los "getters".
Los "getters" devuelven valores de los atributos, los "setters" se encargan de establecerlos, es decir, modificarlos.
Por ejemplo, si queremos cambiar la especialidad, invocaremos al método setEspecialidad().
Por lo tanto, será él mismo quien se encargue de lanzar el mensaje informando del cambio.
Código: [Seleccionar]
public void setEspecialidad(String especialidad) {
        this.especialidad = especialidad;
        System.out.println("Ha cambiado la especialidad del médico de nombre " + this.nombre);
        System.out.println("La nueva especialidad es " + this.especialidad");
    }

Por último, sobre como tratar el atributo de "casado".
Este atributo es booleano, es decir, solo tiene dos posibles valores: true o false

Bien, este valor no debemos mostrarlo directamente en pantalla porque no es lo suficientemente informativo para el usuario.
Ni siquiera intentando hacer una aclaración como tú has hecho, no es elegante:
Código: [Seleccionar]
System.out.println(medico.esCasado() + ". Nota si es true (esta casado)\n"
                + "si es false (esta soltero)");

La forma correcta y elegante es comprobar el valor del atributo con el condicional if y preparar los dos posibles mensajes.
Por ejemplo:
Código: [Seleccionar]
if (medico.esCasado() == true)
        System.out.println("Estado civil: Casado");
else
        System.out.println("Estado civil: Soltero");

Implica escribir unas poquitas más de lineas de código, pero la información en pantalla es más elegante y correcta.
« Última modificación: 23 de Agosto 2018, 01:04 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

ronal.d87

  • Principiante
  • **
  • Mensajes: 72
    • Ver Perfil
Correccion Respuesta CU00632B
« Respuesta #2 en: 25 de Agosto 2018, 05:46 »
Hola Kabuto he aqui las correcciones, estare atento

Código: [Seleccionar]
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemplo01;

/**
 *
 * @author Ronnie
 */
public class Medico {
    private String nombreMed, apellidosMed;
    private String numDoc, especialidad;
    private int edad;
    private boolean esCasado;

    public Medico() {
        nombreMed = "Juan Diego";
        apellidosMed = "Mosquera Herrera";
        numDoc = "12004754201";
        especialidad = "Podologo";
        edad = 4;
        esCasado = true;
    }

    public void setNombreMed(String nombreMed) {
       
        this.nombreMed = nombreMed;
    }

    public void setApellidosMed(String apellidosMed) {
        this.apellidosMed = apellidosMed;
    }

    public void setNumDoc(String numDoc) {
        this.numDoc = numDoc;
    }

    public void setEspecialidad(String especialidad) {
        this.especialidad = especialidad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public void setEsCasado(boolean esCasado) {
        this.esCasado = esCasado;
    }

    public String getNombreMed() {
        return nombreMed;
    }

    public String getApellidosMed() {
        return apellidosMed;
    }

    public String getNumDoc() {
        return numDoc;
    }

    public String getEspecialidad() {
        return especialidad;
    }

    public int getEdad() {
        return edad;
    }

    public boolean esCasado() {
        return esCasado;
    }
   
    public static void main(String[] args) {
        Medico medico = new Medico();
       
        System.out.println("El medico " + medico.getNombreMed() +" "+ medico.getApellidosMed());
        System.out.println("Tiene una edad de " + medico.getEdad() + " años");
        System.out.println("Identificado con Doc. "+ medico.getNumDoc());
        System.out.println("Su especialidad es " + medico.getEspecialidad());
        if(medico.esCasado == true){
            System.out.println("El medico " + medico.getNombreMed() + " esta casado");
        }else{
            System.out.println("El medico " + medico.getNombreMed() + " esta soltero");
        }
         
    }
           
}

Ronald Mosquera Mancilla

 

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".