Autor Tema: qué es el diseño cohesivo en programación orientada a objetos significa CU00666B  (Leído 3235 veces)

lpeiro61

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola, creo que este ejercicio me ha salido un poco más afinado que el anterior.

Citar
EJERCICIO

Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con tres Strings que sean el nombre de cantantes famosos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y usando un for extendido muestre los cantantes en la lista por pantalla. Se debe pedir al usuario un nombre más de cantante famoso, y una vez introducido mostrar la lista actualizada usando un for extendido. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir otro cantante o salir del programa (se podrán introducir tantos cantantes como se desee, para ello usa un bucle while que dé opción a elegir al usuario). Puedes comprobar si tu código es correcto consultando en los foros aprenderaprogramar.com.

Son tres clases.

Para entradas de teclado:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaDeTeclado
{
    private String entradaTeclado;
   
    public EntradaDeTeclado()
    {
        entradaTeclado = "";
        pedirEntrada();
    }
   
    public void pedirEntrada()
    {
        Scanner entradaEscaner = new Scanner(System.in);
        entradaTeclado = entradaEscaner.nextLine();
    }
   
    public String getEntrada(){return entradaTeclado;}
}

La que tiene los métodos.
Código: [Seleccionar]
import java.util.ArrayList;

public class ListaCantantesFamosos
{
    private String nombreLista;
    private ArrayList<String> listaCantantes;
   
    public ListaCantantesFamosos(String nombre)
    {
        nombreLista = nombre;
        listaCantantes = new ArrayList<String>();
        getNombreLista();
        listaCantantes.add("Rosendo");
        listaCantantes.add("Bon Jovi");
        listaCantantes.add("Loquillo");
        listarLosCantantes();
    }
   
    public void addCantante(String cantante)
    {
        listaCantantes.add(cantante);
        System.out.println("");
    }
   
    public void getNombreLista()
    {
        System.out.print(nombreLista + "\n");
    }
   
    public void listarLosCantantes()
    {
       int i = 0;
       for(String nombre : listaCantantes)
       {
           System.out.println("Cantante " + (i+1) + ": " + nombre);
           i++;
       }
    }
}

Y la que contiene el main:
Código: [Seleccionar]
public class TestListaCantantes
{
   public static void main(String[] args)
   {
       ListaCantantesFamosos lista = new ListaCantantesFamosos("CANTANTES ROCKEROS");
           
       System.out.println("\nIntroduce otro cantante...");
       EntradaDeTeclado entrada1 = new EntradaDeTeclado();
       
       lista.addCantante(entrada1.getEntrada());
       lista.getNombreLista();
       lista.listarLosCantantes();
       
       String seguir = "s";       
       while(seguir.equalsIgnoreCase("s"))
       {
           System.out.println("\n¿Quieres añadir otro cantante? S/N");
           EntradaDeTeclado entrada2 = new EntradaDeTeclado();
           seguir = entrada2.getEntrada();
           
           if(!seguir.equalsIgnoreCase("s")){break;}
           
           System.out.println("Introduce otro cantante...");
           EntradaDeTeclado entrada3 = new EntradaDeTeclado();
           lista.addCantante(entrada3.getEntrada());
           lista.getNombreLista();
           lista.listarLosCantantes();
       }
       
       System.out.println("Lista de cantantes finalizada.");
   }
}

Saludos.
« Última modificación: 01 de Abril 2016, 22:23 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola lpeiro61 , en el constructor de la clase ListaCantentesFamosos encuentro algunas cosas a comentar:

Código: [Seleccionar]
    public ListaCantantesFamosos(String nombre)
    {
        nombreLista = nombre;
        listaCantantes = new ArrayList<String>();
        getNombreLista();
        listaCantantes.add("Rosendo");
        listaCantantes.add("Bon Jovi");
        listaCantantes.add("Loquillo");
        listarLosCantantes();
    }

El constructor es el lugar donde se inicializan (se establece el estado inicial) de los objetos.

Normalmente tendremos un constructor sin parámetros y otro con todos los parámetros. Tú has planteado un constructor que recibe sólo un parámetro cuando la clase tiene dos atributos. Está bien, puede hacerse, pero ten en cuenta que no será normalmente lo más habitual.

La línea getNombreLista(); dentro del constructor ¿hace algo? En principio te diré que no hace nada, es decir, que puedes eliminarla porque no tiene ningún efecto. getNombreLista() sirve para recuperar el nombre de la lista, pero aquí no veo que haga nada.

En el constructor añades tres cantantes como pedía el enunciado del ejercicio.

Y luego invocas el método listarLosCantantes();

Esto implica que cuando creas un objeto, se invoca el método, y ese método lo que hace es mostrar por consola la lista de cantantes. ¿Forma esto parte de la inicialización de un objeto? No ¿Debe ir esto en el constructor? No, porque el constructor está destinado a inicializar los objetos, no a mostrar mensajes por consola. Esta idea es extensible a métodos: cada método tiene una responsabilidad, no debe hacer otras cosas. Por ejemplo un método get debe devolver algo, no hacer otras cosas.

Fíjate por ejemplo en este método que has escrito:

Código: [Seleccionar]
    public void addCantante(String cantante)
    {
        listaCantantes.add(cantante);
        System.out.println("");
    }

¿Para qué sirve el método addCantante? Para añadir un cantante a la lista. No debe servir para nada más. Por tanto no debe incluir System.out.println("");, no es su responsabilidad. Esto se llama principio de cohesión: cada método tiene una responsabilidad.



Habrás visto en otros ejercicios en los foros que se llama el método para listar cantantes dentro del constructor o métodos que hacen varias cosas, etc. Quizás yo mismo haya pasado esto por alto en alguna ocasión, pero bueno, para eso hay distintas personas que revisamos ejercicios y no siempre nos damos cuenta o comentamos absolutamente todo...

Otro método:

Código: [Seleccionar]
    public void getNombreLista()
    {
        System.out.print(nombreLista + "\n");
    }

Un método get normalmente se usa para devolver algo. Por ejemplo return nombre;

Si lo que quieres es mostrar algo por pantalla es preferible que llames al método mostrarNombreEnConsola ó simplemente mostrarNombre.


Para tu bucle for extendido: lee los comentarios sobre el uso de i++ en https://www.aprenderaprogramar.com/foros/index.php?topic=2784.0


En tu método main: esta línea no tiene ninguna utilidad: lista.getNombreLista();

Aparece en un par de sitios. Ten en cuenta que esas invocaciones normalmente se hacen cuando queremos recuperar algo para hacer algo.

Por ejemplo System.out.println ("El nombre de la lista es "+ lista.getNombreLista());

Aquí estamos recuperando el nombre de la lista para hacer algo con él. Hacer simplemente lista.getNombreLista(); no tiene ningún efecto, lo estamos recuperando pero ¿para qué si no hacemos nada con él?


Esta línea: if(!seguir.equalsIgnoreCase("s")){break;}

Lee los comentarios al respecto en https://www.aprenderaprogramar.com/foros/index.php?topic=4096.0

Creo que eso es todo, no sé si me habrá quedado algún detalle atrás.

Te parecerá que son muchas correcciones y quizás pienses que tu código estaba mal. No, el código no estaba mal, de hecho funcionaba correctamente, y de hecho tiene bastantes cosas buenas. Muchas veces se presentan en el foro soluciones bastante peores.

Pero si quieres mejorar, te recomiendo que leas los comentarios anteriores con calma y dediques un tiempo a cada una de las cosas, que hagas pruebas, y luego que rehagas el ejercicio.

Me he extendido un poco, espero que te sirva de ayuda

Saludos

lpeiro61

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Muchas gracias Alex.
Seguiré tus consejos.

lpeiro61

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola de nuevo, pongo el código rehecho, a ver si ahora está un poquitín mejor.

Y sobre todo gracias a los moderadores y expertos que dedican su tiempo para nosotros.


Clase para pedir entradas de teclado:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaDeTeclado
{
    private String entradaTeclado;
   
    public EntradaDeTeclado()
    {
        entradaTeclado = "";
        pedirEntrada();
    }
   
    public void pedirEntrada()
    {
        Scanner entradaEscaner = new Scanner(System.in);
        entradaTeclado = entradaEscaner.nextLine();
    }
   
    public String getEntrada(){return entradaTeclado;}
}


Clase para los métodos:
Código: [Seleccionar]
import java.util.ArrayList;

public class ListaCantantesFamosos
{
    private String nombreLista;
    private ArrayList<String> listaCantantes;
   
    public ListaCantantesFamosos()
    {
        nombreLista = "";
        listaCantantes = new ArrayList<String>();
    }
   
    public ListaCantantesFamosos(String nombre)
    {
        nombreLista = nombre;
        listaCantantes = new ArrayList<String>();
    }
   
    public String getNombreLista()
    {
        return nombreLista;
    }
   
    public void primerosCantantes()
    {
       listaCantantes.add("Rosendo");
       listaCantantes.add("Loquillo");
       listaCantantes.add("Bon Jovi");
    }
   
    public void addCantante()
    {
       System.out.println("\nIntroduce otro cantante...");
       EntradaDeTeclado entrada = new EntradaDeTeclado();
       String cantante = entrada.getEntrada();
       listaCantantes.add(cantante);
       System.out.println("");
    }
   
    public void listarLosCantantes()
    {
       System.out.println(nombreLista);
       
        for(String i : listaCantantes)
       {
           System.out.println("  " + i);
       }
    }
}


Clase principal:
Código: [Seleccionar]
public class TestListaCantantes
{
   public static void main(String[] args)
   {
       ListaCantantesFamosos lista = new ListaCantantesFamosos("CANTANTES ROCKEROS");
       
       lista.primerosCantantes();
       
       lista.listarLosCantantes();
       
       lista.addCantante();
     
       lista.listarLosCantantes();
       
       String seguir = "s";       
       while(seguir.equalsIgnoreCase("s"))
       {
           System.out.println("\n¿Quieres añadir otro cantante? S/N");
           EntradaDeTeclado entrada = new EntradaDeTeclado();
           seguir = entrada.getEntrada();
           
           if(seguir.equalsIgnoreCase("s"))
           {
               lista.addCantante();
               lista.listarLosCantantes();
           }
           else{
               seguir = "n";
           }
       }
       
       System.out.println("Lista de cantantes finalizada!");
   }
}


« Última modificación: 02 de Abril 2016, 12:52 por lpeiro61 »

 

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