Foros del Web » Programación para mayores de 30 ;) » Java »

Consulta sobre buenas practicas

Estas en el tema de Consulta sobre buenas practicas en el foro de Java en Foros del Web. Hola a todos, Encontre una pagina para practicar en Java que tiene un ejercicio donde hay que crear una aplicación de consola para un local ...
  #1 (permalink)  
Antiguo 18/03/2016, 17:48
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
Consulta sobre buenas practicas

Hola a todos,
Encontre una pagina para practicar en Java que tiene un ejercicio donde hay que crear una aplicación de consola para un local que alquila autos, yo me trate de complicar un poco y queria saber si lo estoy haciendo bien, porque creo que estoy repitiendo código al dope.

Tengo 3 clases:
  • Renta que es la clase principal donde esta el main
  • Auto es la clase donde defino los atributos y métodos generales de los autos (patente, color, etc)
  • Autos donde tengo un arrayList que uso para guardar el stock y tengo los métodos para alquilar, validar si un auto ya existe en el stock, etc

Dentro del main tengo un menu con 3 opciones:
  1. agregar auto al stock
  2. eliminar auto del stock
  3. mostrar el stock

El código del main es así:
Código:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String cntrl = "s";
    boolean resultado;
    int opc;

    while(!"n".equals(cntrl))
    {
        System.out.println("MENU DEL PROGRAMA\n");
        
        System.out.println("1: Ingresar un auto al stock");
        System.out.println("2: Eliminar un auto del stock");
        System.out.println("3: Ver el listado de autos");
        
        System.out.print("\nIngrese una opcion: ");
        opc = Integer.parseInt(scanner.nextLine());
        
        switch(opc)
        {
            case 1:
                System.out.println("Estas en la seccion 1");
                resultado = agregarAuto();
                
                if (resultado){
                    System.out.println("El auto se agrego correctamente");
                }
                else
                {
                    System.out.println("El auto ya existe en el Stock");
                }
                break;
            case 2:
                System.out.println("Estas en la seccion 2");
                resultado = eliminarAuto();
                if (resultado){
                    System.out.println("El auto se elimino correctamente");
                }
                else
                {
                    System.out.println("El auto no existe en el Stock");
                }
                break;
            case 3:
                System.out.println("Estas en la seccion 3");
                break;
            default:
                System.out.println("Estas en la seccion 1");
                break;
        }
        
        System.out.print("\nDesea continuar ? [s/n] ");
        cntrl = scanner.nextLine();
    }
}
cuando el usuario selecciona la opción 1 (agregar un auto al stock) llamo a la función agregarAuto de la clase Renta, la misma clase donde esta el main. En esa función le pido los datos del auto al usuario, para poder crear el objeto Auto. Una vez que cree el objeto auto, llamo a la función agregarAuto de la clase Autos (donde tengo mi arraylist). el código es algo asi:

función agregarAuto de la clase Renta:
Código:
public static boolean agregarAuto() {
    Scanner scanner = new Scanner(System.in);
    Autos stockAutos   = new Autos();
    String patente;
    String marca;
    String modelo;
    String color;
    double valor;
    int capacidad;
    
    System.out.println("Ingrese la patente del vehiculo ");
    patente = scanner.nextLine(); 
    
    System.out.println("\nIngrese la marca del vehiculo ");
    marca = scanner.nextLine(); 
    
    System.out.println("\nIngrese el modelo del vehiculo ");
    modelo = scanner.nextLine();
    
    System.out.println("\nIngrese el color del vehiculo ");
    color = scanner.nextLine();
    
    System.out.println("\nIngrese el valor del vehiculo ");
    valor = scanner.nextInt();
    
    System.out.println("\nIngrese la capacidad de pasajeros del vehiculo ");
    capacidad = scanner.nextInt();
    
    Auto autito = new Auto(patente, marca, modelo, color, valor, capacidad);

    // Llamo a la funcion agregarAuto de la clase Autos donde tengo mi arrayList
    boolean resulto = stockAutos.agregarAuto(autito);
  
    return resulto;
}
Ahora llamo a la función agregarAuto de la clase Autos, donde primero verifico que no exista un auto con la petente del objeto autito en el arrayList, si no existe lo agrego y si no retorno false.
El código de la clase Autos es así:
Código:
public class Autos {
    public static ArrayList<Auto> autos = new ArrayList<>();
    
    public boolean agregarAuto(Auto autito){
        boolean errores = validarAuto(autito.getPatente());
        
        if(!errores)
        {
            boolean add = autos.add(autito);
            return add;
        }
        
        return false;
    }

    private boolean validarAuto(String patente){
        for(int i = 0; i < autos.size(); i++ )
        {
            if (autos.get(i).getPatente() == null ? patente == null : autos.get(i).getPatente().equals(patente))
            {
                return true;
            }
        }
        
        return false;
    }
}
La pregunta es si estoy haciendo bien las cosas, entiendo que en una aplicación real se tendría que hacer mejor, pero estoy arrancando recién. Por ejemplo, nose si esta bien crear un objeto stockAutos en la función agregarAuto de la clase Renta porque me di cuenta que si quiero eliminar un auto del stock, en la clase Renta tendría que hacer una funcion asi:
Código:
public static boolean deleteCar(){
    Scanner scanner = new Scanner(System.in);
    Autos stockAutos= new Autos();
    String patente;
    
    System.out.println("Ingrese la patente del vehiculo que quiere eliminar ");
    patente = scanner.nextLine(); 
    
    boolean resultado = stockAutos.borrarAuto(patente);
    
    return resultado;
}
Es decir, estaría creado otra vez un objeto stockAutos por cada acción que quisiera hacer, estaría bien crear este objeto fuera de todas las funciones de la clase Renta ? así solo lo creo una vez y listo. Esta bien como me plante la división de las clases ? creo que la clase Autos esta medio al dope pero si lo hago todo dentro de la clase Renta me quedaría enorme. Me podrian ayudar ?
  #2 (permalink)  
Antiguo 19/03/2016, 02:32
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Consulta sobre buenas practicas

Cita:
La pregunta es si estoy haciendo bien las cosas, entiendo que en una aplicación real se tendría que hacer mejor, pero estoy arrancando recién. Por ejemplo, nose si esta bien crear un objeto stockAutos en la función agregarAuto de la clase Renta porque me di cuenta que si quiero eliminar un auto del stock, en la clase Renta tendría que hacer una funcion asi:

Es decir, estaría creado otra vez un objeto stockAutos por cada acción que quisiera hacer, estaría bien crear este objeto fuera de todas las funciones de la clase Renta ? así solo lo creo una vez y listo. Esta bien como me plante la división de las clases ? creo que la clase Autos esta medio al dope pero si lo hago todo dentro de la clase Renta me quedaría enorme. Me podrian ayudar ?
No, sólo puede haber un objeto Autos. ¿Cómo vas a borrar un auto de un objeto recién creado que está vacío? La clase Renta es buen sitio para crearlo, aunque sería mejor que la propia clase Autos devolviese siempre un mismo objeto Autos (busca información sobre singleton) por ejemplo con un método static.

Aparte tampoco veo bien que crees tantos objetos scanner, o bien lo pasas como parámetro o haces que Renta tenga un atributo/propiedad scanner que sea accesible por cualquiera de sus métodos.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 19/03/2016, 09:06
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Consulta sobre buenas practicas

Hola Xerelo, gracias por ayudarme. Dejame ver si entendi.
Lo que podría hacer es usar el patrón singleton para crear una sola instancia de la clase Autos o bien crear un solo objeto fuera de todas las funciones ? asi podria usarlo en cada una de las funciones de la clase Rentas ?

Gracias por orientarme :D

Etiquetas: clase, objeto, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:42.