Buenas tardes
Esta vez no he venido a resolver un ejercicio, sino que vine a resolver una metida de pata del pasado (Que fue bastante grande creo xD). Hace aproximadamente 26 días, escribí un código sobre el Ejercicio CU00630B (Que por cierto, también no tenia que escribir nada de codigo.) que presentaba varios problemas.
Para los curiosos que quieran saber sobre esta metida de pata, aquí esta:
https://www.aprenderaprogramar.com/foros/index.php?topic=2090.msg10282#msg10282He creado la versión 2 de "DiscMan", y lo presento aquí, para saber en que mejorar y demás. Es lo mismo que antes... 3 discos, hasta 20 temas musicales, etc. Aun no termino el curso, estoy en el punto 62, tomen en cuenta esto por si cometí otra vez una metida de pata por favor! Jajaja!
Primero, les comparto lo que hice. Basándome en el pensar
"Divide y vencerás.",cree 4 clases en total:
1. La clase
DiscosMusicales que usaremos para crear los 3 objetos Disco o "DiscosMusicales".
package Discos;
public class DiscosMusicales {
private String nombreDisco, autor, formato, nombreCancion[]= new String[19];
private double duracion, duracionCancion[] = new double[19];
private int numeroCanciones;
public DiscosMusicales(){
nombreDisco = "";
autor = "";
formato = "";
duracion = 0;
numeroCanciones = 0;
nombreCancion = new String[]{"","","","","","","","","","","","","","","","","","","",""};
duracionCancion = new double[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
}
public void setNombreDisco(){
System.out.println("--------------------------------------------");
Lectores leer = new Lectores();
System.out.println("Ingrese el nombre del disco: ");
nombreDisco = leer.LeerCadena();
}
public void setAutor(){
Lectores leer = new Lectores();
System.out.println("Ingrese el nombre del autor de este disco: ");
autor = leer.LeerCadena();
}
public void setFormato(){
Lectores leer = new Lectores();
System.out.println("Ingrese el formato del disco: ");
formato = leer.LeerCadena();
}
public void setCanciones(){
Lectores leer = new Lectores();
do{
System.out.println("¿Cuantas canciones son?: ");
numeroCanciones = leer.LecturaEntero();
if(numeroCanciones > 20){System.out.println("Solo se pueden ingresar hasta 20 temas musicales. \nIntente de nuevo.");
System.out.println(" ");
}
}while(numeroCanciones > 20);
for (int i = 0, j = 1; i < numeroCanciones; i++, j++){
System.out.println("Ingrese el nombre de la cancion numero " + j + ": ");
nombreCancion[i] = leer.LeerCadena();
System.out.println("Ingrese la duracion de la cancion numero " + j + ": ");
duracionCancion[i] = leer.LecturaDecimal();
duracion = duracion + duracionCancion[i];
}
System.out.println("Datos Listos!.");
System.out.println("--------------------------------------------");
}
public String getNombreDisco(){
return nombreDisco;
}
public String getAutor(){
return autor;
}
public String getFormato(){
return formato;
}
public void getCanciones(){
for (int i = 0, j = 1; i < numeroCanciones; i++, j++){
System.out.println(j + ". " + nombreCancion[i] + " (Duracion: " + duracionCancion[i] + ").");
}
System.out.println("*************************************************************************");
System.out.println("Duracion total del disco: " + duracion);
System.out.println("-------------------------------------------------------------------------");
}
}
2. La clase
Lectores que se utilizara para leer los datos que el usuario ingrese.
package Discos;
import java.util.Scanner;
public class Lectores {
public Lectores(){}
public String LeerCadena(){
Scanner in = new Scanner(System.in);
return in.nextLine();
}
public Double LecturaDecimal(){
Scanner in = new Scanner(System.in);
return in.nextDouble();
}
public int LecturaEntero(){
Scanner in = new Scanner(System.in);
return in.nextInt();
}
public char LecturaChar(){
Scanner in = new Scanner(System.in);
return in.next().charAt(0);
}
}
3. La clase
Menu en donde vamos a ejecutar diferentes menús de operaciones. Me lo imagine así: Como el sirviente, recepcionista, mesero, etc... que te pregunta que deseas hacer, ejecutar, que quieres ver y demás.
package Discos;
public class Menu {
DiscosMusicales Disco1 = new DiscosMusicales();
DiscosMusicales Disco2 = new DiscosMusicales();
DiscosMusicales Disco3 = new DiscosMusicales();
int elige;
boolean sal1 = false, sal2 = false;
public char opcion;
public Menu(){opcion = ' ';}
public void MenuPrincipal(){
Lectores leer = new Lectores();
sal1 = false;
do{
System.out.println("Bienvenido a la nueva actualizacion de DISCMAN! \nPara salir del programa, aprete 4. \nElige uno de los 3 discos para empezar: ");
elige = leer.LecturaEntero();
if (elige <= 3){ MenuDisco();}
else if (elige == 4) { System.out.println("Nos vemos pronto!!!"); sal2 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
}while(sal2 == false);
}
public void MenuOperaciones(){
Lectores leer = new Lectores();
System.out.println("Elige una opcion que desees ejecutar en el menú: ");
System.out.println("Ingrese A para agregarle datos al disco.");
System.out.println("Ingrese B para imprimir todos los datos del disco.");
System.out.println("Ingrese C para volver al menu de elegir disco.");
System.out.print("Opcion: ");
opcion = leer.LecturaChar();
}
public void MenuDisco(){
do{
switch(elige){
case 1:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 1!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco1.setNombreDisco(); Disco1.setAutor(); Disco1.setFormato(); Disco1.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco1.getNombreDisco());
System.out.println("Nombre del autor: " + Disco1.getAutor());
System.out.println("Nombre del formato: " + Disco1.getFormato());
System.out.println("Canciones: ");
Disco1.getCanciones();}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
case 2:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 2!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco2.setNombreDisco(); Disco2.setAutor(); Disco2.setFormato(); Disco2.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco2.getNombreDisco());
System.out.println("Nombre del autor: " + Disco2.getAutor());
System.out.println("Nombre del formato: " + Disco2.getFormato());
System.out.println("Canciones: ");
Disco2.getCanciones();}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
case 3:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 3!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco3.setNombreDisco(); Disco3.setAutor(); Disco3.setFormato(); Disco3.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco3.getNombreDisco());
System.out.println("Nombre del autor: " + Disco3.getAutor());
System.out.println("Nombre del formato: " + Disco3.getFormato());
System.out.println("Canciones: ");
Disco3.getCanciones();
}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
default:
System.out.println("No se reconoce la opcion insertada. Intente de nuevo.");
System.out.println(" ");
break;
}
}while(sal1 == false);
MenuPrincipal();
}
}
4. La ultima clase, en donde ejecutaremos el programa, la que va a contener el
método main.
package Discos;
public class Main {
public static void main(String[]args){
Menu main = new Menu();
main.MenuPrincipal();
}
}
Voy citando cada punto del error que me comentaron en el post pasado. Y hay uno que me deja en duda (quizá el que me corrigió lo volvió a notar):
. La clase DiscoMusical incluye el main. Ineficiente.
En Java, cualquier proyecto consta de varias clases. Solo una de ellas tendrá el main, las otras son usadas por el main para llevar a cabo la tarea.
Como se puede ver, el main ahora en este código nuevo, tan solo va a citar una clase (Menu). La clase Menu utiliza a la clase Lectores y DiscosMusicales. Por ejemplos que he visto y demás, es valido que una clase llegue a utilizar otra clase.
Creas un main extenso. Ineficiente. El director de una empresa no se pone a fabricar componentes o envasar el producto. El director, da órdenes y controla el funcionamiento general.
Totalmente arreglado este detalle. Mi antiguo método main tenia alrededor de 234 lineas de código. Ahora... mi método main tan solo lleva 7 lineas. No se pone a hacer absolutamente nada, digamos que esta vez el director contrato a un sirviente, recepcionista, mesero, etc, y solo es necesario darle la orden al que contrato.. ya lo demás se encarga el Sr sirviente o no se como le llamen jajaja
. Creas atributos de la clase sin métodos set y get. Como el main está en la misma clase, manipulas los atributos directamente.
Bajo este concepto tampoco debías crear los métodos set y get del resto de los atributos.
Clase con el metodo main aparte separado.
. El método next() de la clase Scanner toma el espacio en blanco como separador de las entradas. Eso te obliga a escribir RamonRamirez o Ramon_Ramirez en lugar de Ramon Ramirez.
Si no, lo toma como dos entradas del teclado distintas.
El método nextLine() acepta el espacio en blanco y usa la tecla ENTER como separador de las entradas desde teclado.
Esto fue lo que utilize para los lectores. En vez de next(); ahora es nextLine();... Hubo algo que me sucedio anteriormente con el nextLine();, con esto, llegue a la conclusión que como programaba todo en el main, era por eso que me tomaba los espacios....
. Hay código repetido. Ineficiente. Si en tu clase vas a trabajar con tres discos, repites el código una vez para cada disco.
Ok, aquí si puede que patine un poco. De esa forma es la única que se me ocurrió para el menú.
switch(elige){
case 1:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 1!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco1.setNombreDisco(); Disco1.setAutor(); Disco1.setFormato(); Disco1.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco1.getNombreDisco());
System.out.println("Nombre del autor: " + Disco1.getAutor());
System.out.println("Nombre del formato: " + Disco1.getFormato());
System.out.println("Canciones: ");
Disco1.getCanciones();}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
case 2:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 2!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco2.setNombreDisco(); Disco2.setAutor(); Disco2.setFormato(); Disco2.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco2.getNombreDisco());
System.out.println("Nombre del autor: " + Disco2.getAutor());
System.out.println("Nombre del formato: " + Disco2.getFormato());
System.out.println("Canciones: ");
Disco2.getCanciones();}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
case 3:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 3!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco3.setNombreDisco(); Disco3.setAutor(); Disco3.setFormato(); Disco3.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco3.getNombreDisco());
System.out.println("Nombre del autor: " + Disco3.getAutor());
System.out.println("Nombre del formato: " + Disco3.getFormato());
System.out.println("Canciones: ");
Disco3.getCanciones();
}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
default:
System.out.println("No se reconoce la opcion insertada. Intente de nuevo.");
System.out.println(" ");
break;
}
¿Como podría entonces, crear un menú en donde yo elija cual objeto quiero controlar sin repetir un código? Si es que esta incorrecto como lo maneje?.
. Por último, cuando usas la opción C para mostrar los datos, sucede lo siguiente.
Si tu disco tiene 3 canciones, en el contador vas desde 0 hasta 3, que son 4 pasos. El último dato siempre sera null, pues ese elemento del array no se ha inicializado.
Los dichosos arreglos pude repararlos, ya sueltan toda su informacion, no sale ni un Null.