Autor Tema: Mejorar el diseño de clases Java cómo definir clases eficientes CU00667B  (Leído 4327 veces)

jasolis

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Hola, mi respuesta al ejercicio CU00667B del tutorial Java desde cero

>>>>> Clase EntradaTeclado:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaTeclado{
   
    //Campos o atributos
    Scanner escaner;
    String entrada;
   
    //Constructor
    public EntradaTeclado(){
        escaner = new Scanner(System.in);
        setEntrada(escaner.nextLine());
    }
   
    //Setters
    public void setEntrada(String valor_entrada){entrada = valor_entrada;}
   
    //Getters
    public String getEntrada(){return entrada;}
}


>>>>> Clase CantanteFamoso:
Código: [Seleccionar]
public class CantanteFamoso{
   
    //Campos o atributos
    String nombre;
    String discoConMasVentas;
   
    //Constructor
    public CantanteFamoso(){
        nombre = "Desconocido";
        discoConMasVentas = "Desconocido";
    }
   
    //Setters
    public void setNombre(String valor_nombre){nombre = valor_nombre;}
    public void setDiscoConMasVentas(String valor_discoConMasVentas){discoConMasVentas = valor_discoConMasVentas;}
   
    //Getters
    public String getNombre(){return nombre;}
    public String getDiscoConMasVentas(){return discoConMasVentas;}
   
}//Cierre de la clase

>>>>> Clase ListaCantantesFamosos:
Código: [Seleccionar]
import java.util.ArrayList;

public class ListaCantantesFamosos{
   
    //Campos o atributos
    ArrayList<CantanteFamoso> listaCantantesFamosos;
   
    //Constructor
    public ListaCantantesFamosos(){
        listaCantantesFamosos = new ArrayList<CantanteFamoso>();
    }
   
    //Método añadir objeto de tipo CantanteFamoso a la lista
    public void addCantanteFamoso(CantanteFamoso valor_cantanteFamoso){
        listaCantantesFamosos.add(valor_cantanteFamoso);
    }
   
    public CantanteFamoso getCantanteFamoso(int posicion){
        return listaCantantesFamosos.get(posicion);
    }
   
    public ArrayList<CantanteFamoso> getListaCantantesFamosos(){return listaCantantesFamosos;}
}

>>>>> TestListaCantantesFamosos:
Código: [Seleccionar]
import java.util.Iterator;

public class TestListaCantantesFamosos{
     public static void main(String[] args){
        System.out.println("***** EMPEZAMOS EL PROGRAMA *****");
         
        ListaCantantesFamosos  listaCantantesFamosos = new ListaCantantesFamosos();
        CantanteFamoso         cantante = null;
        EntradaTeclado         entrada = null;
        String                 respuesta = "y";
         
        System.out.println("-Añadir dos cantantes famosos a la lista-");
         
        for(int i = 0; i < 2; i++){
            cantante = new CantanteFamoso();
            System.out.println("Por favor introduce el nombre del cantante");
            entrada = new EntradaTeclado();
            cantante.setNombre(entrada.getEntrada());
            System.out.println("Por favor introduce el disco con más ventas del cantante " + cantante.getNombre());
            entrada = new EntradaTeclado();
            cantante.setDiscoConMasVentas(entrada.getEntrada());
            listaCantantesFamosos.addCantanteFamoso(cantante);
        }
         
        System.out.println("-Usando Iterator, mostrar el nombre de los cantantes ingresados y sus discos mas vendidos-");
        Iterator<CantanteFamoso> it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
        while(it.hasNext()){
            CantanteFamoso tempCantante = it.next();
            System.out.println("Nombre del cantante: " + tempCantante.getNombre());
            System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
        }
         
        while(respuesta.equals("y")){
           
            System.out.println("-Pedir al usuario un nuevo cantante-");
            cantante = new CantanteFamoso();
            System.out.println("Por favor introduce el nombre de otro cantante famoso");
            entrada = new EntradaTeclado();
            cantante.setNombre(entrada.getEntrada());
            System.out.println("Por favor introduce el disco con mas ventas del cantante " + cantante.getNombre());
            entrada = new EntradaTeclado();
            cantante.setDiscoConMasVentas(entrada.getEntrada());
            listaCantantesFamosos.addCantanteFamoso(cantante);
         
            System.out.println("-Mostrar la lista actualizada usando Iterator-");
            it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
            while(it.hasNext()){
                CantanteFamoso tempCantante = it.next();
                System.out.println("Nombre del cantante: " + tempCantante.getNombre());
                System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
            }
           
            System.out.println("Deseas introducir otro cantante? (Y/N)");
            entrada = new EntradaTeclado();
            respuesta = entrada.getEntrada().toLowerCase();
           
            while( !(respuesta.equals("y")) && !(respuesta.equals("n")) ){
                System.out.println("Respuesta no valida. Deseas introducir otro cantante? (Y/N)");
                entrada = new EntradaTeclado();
                respuesta = entrada.getEntrada().toLowerCase();
            }
        }
        System.out.println("***** FIN DEL PROGRAMA *****");
    }//Cierre del main
}//Cierre de la clase
« Última modificación: 09 de Noviembre 2015, 09:39 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Mejorar el diseño de clases Java cómo definir clases eficientes CU00667B
« Respuesta #1 en: 09 de Noviembre 2015, 09:40 »
Hola jasolis he revisado tu código y funciona correctamente realizando su cometido. Puedo señalarte un aspecto que aunque no sea un fallo podría ser mejorado. Te indico cómo podrías mejorarlo para que si tienes interés lo hagas (si quieres pega el código una vez hayas hecho los cambios y te comentaremos de nuevo).

Cuestión 1: en la clase EntradaTeclado para pedir una entrada de teclado y establecer el atributo entrada hemos de crear un objeto, ya que es la única forma de que se nos pida la entrada, el realizarse esa petición dentro del constructor.

Cuestión 2: en la clase TestListaCantantesFamosos lo anterior nos obliga a crear varios objetos EntradaTeclado y surge código repetitivo, por ejemplo:

Código: [Seleccionar]
        for(int i = 0; i < 2; i++){
            cantante = new CantanteFamoso();
            System.out.println("Por favor introduce el nombre del cantante");
            entrada = new EntradaTeclado();
            cantante.setNombre(entrada.getEntrada());
            System.out.println("Por favor introduce el disco con más ventas del cantante " + cantante.getNombre());
            entrada = new EntradaTeclado();
            cantante.setDiscoConMasVentas(entrada.getEntrada());
            listaCantantesFamosos.addCantanteFamoso(cantante);
        }

Se repite entrada = new EntradaTeclado(); aquí y en otros puntos...

Mejora del diseño que se podría implementar: en la clase EntradaTeclado crear un método que sirva para pedir la entrada de teclado (de esta forma, no estaría en el constructor, sino en un método).

En la clase TestListaCantantesFamosos crear un único objeto EntradaTeclado e irlo utilizando a través de sus métodos cada vez que sea necesario. De ese modo evitamos tener que repetir entrada = new EntradaTeclado(); en múltiples ocasiones.

Saludos

jasolis

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Mejorar el diseño de clases Java cómo definir clases eficientes CU00667B
« Respuesta #2 en: 09 de Noviembre 2015, 16:49 »
Hola Alex, gracias por tomarte el tiempo de revisar mi código, me han sido muy útiles tus observaciones. Aquí están las clases modificadas, espero haberlo hecho correctamente. Saludos!

>>>>> clase EntradaTeclado:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaTeclado{
   
    //Campos o atributos
    Scanner escaner;
    String entrada;
   
    //Constructor
    public EntradaTeclado(){
        //escaner = new Scanner(System.in);//Remueve código ineficiente
        //setEntrada(escaner.nextLine());//Remueve código ineficiente
       escaner = null;//Inicializamos el campo del objeto
       entrada = "";//Inicializamos el campo del objeto
    }
    /***** Remueve código ineficiente
    //Setters
    public void setEntrada(String valor_entrada){entrada = valor_entrada;}
    */
   
   //Nuevo método para pedir la entrada del teclado fuera del constructor
   public void pedirEntrada(){
       escaner = new Scanner(System.in);
       entrada = escaner.nextLine();
    }
   
    //Getters
    public String getEntrada(){return entrada;}
}

>>>>> clase TestListaCantantesFamosos:
Código: [Seleccionar]
import java.util.Iterator;

public class TestListaCantantesFamosos{
     public static void main(String[] args){
        System.out.println("***** EMPEZAMOS EL PROGRAMA *****");
         
        ListaCantantesFamosos  listaCantantesFamosos = new ListaCantantesFamosos();
        CantanteFamoso         cantante = null;
        //EntradaTeclado         entrada = null; //Remueve código ineficiente
        EntradaTeclado         entrada = new EntradaTeclado(); //Ahora usamos un solo objeto para pedir la entrada por teclado cada vez que se necesite
         
        System.out.println("-Añadir dos cantantes famosos a la lista-");
         
        for(int i = 0; i < 2; i++){
            cantante = new CantanteFamoso();
            System.out.println("Por favor introduce el nombre del cantante");
            //entrada = new EntradaTeclado();//Remueve código ineficiente
            entrada.pedirEntrada();//Pide entrada por teclato
            cantante.setNombre(entrada.getEntrada());
            System.out.println("Por favor introduce el disco con más ventas del cantante " + cantante.getNombre());
            //entrada = new EntradaTeclado();//Remueve código ineficiente
            entrada.pedirEntrada();//Pide entrada por teclato
            cantante.setDiscoConMasVentas(entrada.getEntrada());
            listaCantantesFamosos.addCantanteFamoso(cantante);
        }
         
        System.out.println("-Usando Iterator, mostrar el nombre de los cantantes ingresados y sus discos mas vendidos-");
        Iterator<CantanteFamoso> it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
        while(it.hasNext()){
            CantanteFamoso tempCantante = it.next();
            System.out.println("Nombre del cantante: " + tempCantante.getNombre());
            System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
        }
       
        String respuesta = "";
       
        do{
            System.out.println("-Pedir al usuario un nuevo cantante-");
            cantante = new CantanteFamoso();
            System.out.println("Por favor introduce el nombre de otro cantante famoso");
            //entrada = new EntradaTeclado();//Remueve código ineficiente
            entrada.pedirEntrada();//Pide entrada por teclato
            cantante.setNombre(entrada.getEntrada());
            System.out.println("Por favor introduce el disco con mas ventas del cantante " + cantante.getNombre());
            //entrada = new EntradaTeclado();//Remueve código ineficiente
            entrada.pedirEntrada();//Pide entrada por teclato
            cantante.setDiscoConMasVentas(entrada.getEntrada());
            listaCantantesFamosos.addCantanteFamoso(cantante);
         
            System.out.println("-Mostrar la lista actualizada usando Iterator-");
            it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
            while(it.hasNext()){
                CantanteFamoso tempCantante = it.next();
                System.out.println("Nombre del cantante: " + tempCantante.getNombre());
                System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
            }
           
            System.out.println("Deseas introducir otro cantante? (Y/N)");
            //entrada = new EntradaTeclado();//Remueve código ineficiente
            entrada.pedirEntrada();//Pide entrada por teclato
            respuesta = entrada.getEntrada().toLowerCase();
           
            while( !(respuesta.equals("y")) && !(respuesta.equals("n")) ){
                System.out.println("Respuesta no valida. Deseas introducir otro cantante? (Y/N)");
                //entrada = new EntradaTeclado();//Remueve código ineficiente
                entrada.pedirEntrada();//Pide entrada por teclato
                respuesta = entrada.getEntrada().toLowerCase();
            }
        }while(respuesta.equals("y"));
        System.out.println("***** FIN DEL PROGRAMA *****");
    }//Cierre del main
}//Cierre de la clase
« Última modificación: 11 de Noviembre 2015, 08:49 por Alex Rodríguez »

jasolis

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Mejorar el diseño de clases Java cómo definir clases eficientes CU00667B
« Respuesta #3 en: 10 de Noviembre 2015, 19:10 »
Hola Alex, me he dado cuenta que el código que modifiqué al final está haciendo algo similar que al principio dado que en cada llamada al método <EntradaTeclado>.pedirEntradad() se crea un nuevo objeto de tipo Scanner...

He modificado una vez más la clase EntradaTeclado y ahora está definida de esta manera:

>>>>> clase EntradaTeclado:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaTeclado{
   
    //Campos o atributos
    Scanner escaner;
    String entrada;
   
    //Constructor
    public EntradaTeclado(){
       escaner = new Scanner(System.in);
       entrada = "";
    }
   
   //Setter
   public void pedirEntrada(){
       entrada = escaner.nextLine();
    }
   
    //Getters
    public String getEntrada(){return entrada;}
}

Saludos!

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Mejorar el diseño de clases Java cómo definir clases eficientes CU00667B
« Respuesta #4 en: 11 de Noviembre 2015, 08:57 »
Hola, ahora lo veo mejor. Te sugiero que compares tu solución con la solución dada en https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0 ahí podrás ver algunas cosas interesantes

Saludos

jasolis

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Mejorar el diseño de clases Java cómo definir clases eficientes CU00667B
« Respuesta #5 en: 11 de Noviembre 2015, 16:28 »
Muchas gracias Alex, tus comentarios me son muy útiles. Voy a echarle un ojo a la solución que mencionas para afinar detalles.

Saludos!
« Última modificación: 12 de Noviembre 2015, 10:02 por Ogramar »

 

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