Autor Tema: Java ejemplo de mal diseño de clases código ineficiente redundante ejer CU00666B  (Leído 1212 veces)

@mayakoski

  • Sin experiencia
  • *
  • Mensajes: 43
    • Ver Perfil
Solución propuesta para el ejercicio CU00666B del tutorial pdf de programación Java básico.

Código: [Seleccionar]
package com.aprenderaprogramar;
import java.util.ArrayList;

public class ListaCantantesFamosos2 {

private String nombreUsuario;
private ArrayList<String> listaCantantes = new ArrayList<String>();

public ListaCantantesFamosos2(String pUsuario) {
setNombreUsuario(pUsuario);
listaCantantes.add("Juanes");
listaCantantes.add("Shakira");
listaCantantes.add("Andres Calamaro");
}

public void mostrarLista() {
int i=0;
for(String cantante : listaCantantes) {
System.out.println("Cantante "+ (i+1) +" "+ cantante);
i +=1 ;
}
}

public String getNombreUsuario() {
return nombreUsuario;
}

public void setNombreUsuario(String nombreUsuario) {
this.nombreUsuario = nombreUsuario;
}

public void addCantante(String pCantante) {
listaCantantes.add(pCantante);
}

public String getCantante(int pos) {
return(listaCantantes.get(pos));
}

public int getsize() {
return listaCantantes.size();
}
}



Código: [Seleccionar]
package com.aprenderaprogramar;
public class TestListaCantantesFamosos2 {
public static void main(String[] args) {
boolean addcantante = true;

System.out.println("Por favor introduzca el usuario que crea la lista:");
CadenaEntrada usuario = new CadenaEntrada();
ListaCantantesFamosos2 miLista = new ListaCantantesFamosos2(usuario.getEntrada());

// Salida
miLista.mostrarLista();
while(addcantante) {
System.out.println("ingrese otro cantante: ");
EntradaDeTeclado nuevoCantante = new EntradaDeTeclado();
miLista.addCantante(nuevoCantante.getEntrada());
miLista.mostrarLista();
System.out.println("Desea ingresar mas cantantes: \"no\" para terminar; Cualquier otra tecla para continuar" );
EntradaDeTeclado opcionUsuario = new EntradaDeTeclado();
if(opcionUsuario.getEntrada().equalsIgnoreCase("no")) {
addcantante = false;
System.out.println("Ha terminado de llenar");
}
}
}
}


Código: [Seleccionar]
package com.aprenderaprogramar;

import java.util.Scanner;

public class CadenaEntrada {
private String entrada;

public static void main(String[] args) {
System.out.println("Ingrese primera palabra");
CadenaEntrada entrada1 = new CadenaEntrada();

System.out.println("Ingrese segunda palabra");
CadenaEntrada entrada2 = new CadenaEntrada();

Comparacion(entrada1.getEntrada(), entrada2.getEntrada());
}

public CadenaEntrada() {
pedirEntrada();
}

public void pedirEntrada() {

Scanner entradaTeclado1 = new Scanner(System.in);
setEntrada(entradaTeclado1.nextLine());
}

public static void Comparacion(String pEntrada1, String pEntrada2) {
int maxI, minI, numEntrada, i = 0;

if (pEntrada1.length() > pEntrada2.length()) {
maxI = pEntrada1.length();
minI = pEntrada2.length();
numEntrada = 2;
} else {
maxI = pEntrada2.length();
minI = pEntrada1.length();
numEntrada = 1;
}

while (i < maxI) {
if (i < minI && pEntrada1.substring(i, i + 1).equals(pEntrada2.substring(i, i + 1))) {
System.out.println("¿Letra " + (i + 1) + " igual en las dos palabras? True.");
} else if (i < minI) {
System.out.println("¿Letra " + (i + 1) + " igual en las dos palabras? False.");
} else {
System.out.println("¿Letra " + (i + 1) + " igual en las dos palabras? La palabra " + numEntrada
+ " no tiene letra " + (i + 1));
}
i += 1;
}
}

public String getEntrada() {
return entrada;
}

public void setEntrada(String entrada) {
this.entrada = entrada;
}

}



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

public class EntradaDeTeclado {
    private String entradaTeclado;

    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        pedirEntrada();
    }


    public void pedirEntrada ()  {       

        Scanner entradaEscaner = new Scanner (System.in);

        entradaTeclado = entradaEscaner.nextLine ();     }


    public String getEntrada () { return entradaTeclado; }

    public String getPrimeraPalabra ()  {

        for (int i=0; i < entradaTeclado.length() - 1; i++) {
            if (entradaTeclado.substring (i, i+1).equals(" ") ) {     //IMPORTANTÍSIMO: COMPARAMOS CON EQUALS
                return entradaTeclado.substring(0, i+1);         }
        }

        return entradaTeclado;  //Caso de que no se detecte ningún espacio devolvemos lo que haya

    } //Cierre del método getPrimeraPalabra

    public int getLongitud ()  {  //Método de la clase
        return entradaTeclado.length();
    } //Cierre del método getLongitud

} //Cierre de la clase
« Última modificación: 09 de Octubre 2020, 14:03 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2053
    • Ver Perfil
Hola, en relación a esta propuesta de solución, aunque el código "funciona", no puede considerarse una buena solución para el ejercicio debido al diseño inadecuado. las observaciones serían:

a) Contiene una clase CadenaEntrada que parece tomada de otro ejercicio, con lo cual tiene una parte de código que no es útil en este ejercicio. (Mal diseño: código sin utilidad)

b) Hace uso de una clase EntradaDeTeclado que a su vez es similar a la clase CadenaEntrada. Aquí lo más razonable hubiera sido utilizar una sola clase para gestionar las entradas de teclado.

Puede verse una solución correcta para este ejercicio en https://aprenderaprogramar.com/foros/index.php?topic=2262.0

Saludos

 

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