Hace tres dias que no encuentro el error, caso de uso

Iniciado por n-utz, 16 Mayo 2017, 02:11 AM

0 Miembros y 1 Visitante están viendo este tema.

n-utz

Cómo va gente, no soy de postear códigos que no corren o simplemente algoritmos que fallan en la lógica. Pero cómo a mi me gusta corregir algunos programas de C que postean, pienso que a los amantes de Java les gusta corregir/ayudar a los novatos, y realmente en esta lógica no sé que es lo que vaya.


El caso de uso se trata de la validación de patentes de automotores argentinos, hay dos formatos de patentes vigentes hoy en día acá, paso a explicarlas:

2 letras - 3 numeros - 2 letras (NUEVAS)
WW231EQ - ejemplo

3 letras - 3 numeros
JBN321

En el caso creo el objeto y le mando el parametro dominio (patente) como string al objeto, lo que debo hacer es validar si la patente cumple con algun formato correctamente. Esto es lo que hice:

public boolean validarDominio(String dominio) throws Exception{
boolean flag = true;
while(flag){
switch(dominio.length()){
case 6:
if(!(Funciones.esCadenaLetras(dominio.substring(0, 3))));
flag = false;
if(!(Funciones.esCadenaNros(dominio.substring(3, 6))));
flag = false;
break;
case 7:
if(!(Funciones.esCadenaLetras(dominio.substring(0, 2))));
flag = false;
if(!(Funciones.esCadenaNros(dominio.substring(2, 5))));
flag = false;
if(!(Funciones.esCadenaLetras(dominio.substring(5, 7))));
flag = false;
break;
}
break;
}
if(!flag)
throw new Exception("Dominio invalido");
return flag;
}



Por si quieren corroborar les dejo el set y el test.

public class Rodado {
private int idRodado;
private String dominio;
private int modelo;
private String marca;

public Rodado(int idRodado, String dominio, int modelo, String marca)
throws Exception{
this.idRodado = idRodado;
this.setDominio(dominio);
this.modelo = modelo;
this.marca = marca;

}


public void setDominio(String dominio) throws Exception {
if(validarDominio(dominio))
this.dominio = dominio;
}



package test;
import modelo.Rodado;


public class TestRodado {

public static void main(String[] args) {
try{
//DOMINIO JN332EW
Rodado rod_1 = new Rodado(1,"JN332EW",2011,"Ford");
System.out.println(rod_1.getIdRodado());
System.out.println(rod_1.getDominio());
System.out.println(rod_1.getModelo());
System.out.println(rod_1.getMarca());
} catch (Exception ex){
System.out.println(ex.getMessage());
}
}

}


Como pueden ver el dominio/patente es el segundo parametro. El problema aquí es que siempre salta la excepción del dominio inválido, aunque no esté inválido.


Tranquilos y sin apuros, a ver si le podemos encontrar la vuelta.

Aclaro que soy nuevo programando en Java, cualquier consejo es más que bienvenido.

3n31ch

#1
Te recomendaria hacer uso de expresiones regulares (busca en google expresiones regulares en java o directamente "regex java" y sabras que digo)

Aca un codigo que hace lo que quieres, aunque se puede mejorar (y no lo he probado):

Código (java) [Seleccionar]

   public boolean validarDominio(String input) {
       Pattern pattern1 = Pattern.compile("[A-Z]{2}[0-9]{3}[A-Z]{2}");
       Pattern pattern2 = Pattern.compile("[A-Z]{3}[0-9]{3}");
       return pattern1.matcher(input).matches() || pattern2.matcher(input).matches();
   }


Vere tu codigo para ver que falla, pero desde ya te digo que no es muy "prolijo". (Luego edito este comentario para detallar tu code).

Olvidalo, no lo probare, ya encontre el error: Los if no terminan con ;

Código (java) [Seleccionar]
if(!(Funciones.esCadenaLetras(dominio.substring(0, 3))));
flag = false;


Eso esta mal, tendria que ser así:

Código (java) [Seleccionar]
if(!(Funciones.esCadenaLetras(dominio.substring(0, 3))))
flag = false;


Sin el ;

(Esto te paso en todos los if)

Por cierto, no entiendo la necesidad del while  :xD.
Te recomendaria juntar los if de para verificar letras y numeros y no es necesario que pongas el metodo entre parentesis, solo pon el !.

Interesante froma de usar switch y case, pero no creo que sea la mejor, directamente habria hecho un if. No soy muy amigo de switch y case a menos que sea un menu o algo por el estilo.

Aquí otra forma de expresar tu codigo mas ordenado:
Código (java) [Seleccionar]

public boolean validarDominio(String dominio) throws Exception{
boolean flag = true;
        switch(dominio.length()){
            case 6:
                flag = esCadenaLetras(dominio.substring(0, 3)) &&
                        esCadenaNros(dominio.substring(3, 6));
break;
            case 7:
                flag = esCadenaLetras(dominio.substring(0, 2)) &&
                        esCadenaNros(dominio.substring(2, 5)) &&
                        esCadenaLetras(dominio.substring(5, 7));
            break;
            default:
                flag = false;
}
        if(!flag) throw new Exception("Dominio invalido");
        return flag;
    }


Suerte con tu codigo!

n-utz

Buscaré lo que me dices, pf y ni cuenta me daba.
Si, tengo pendiente leer Clean Code, pero sé muy poco Java todavía.

Buen código, creo que te lo robaré y empezaré a utilizar más esa igualdad de booleanos.

Y quedé embobadísimo con los "pattern". Gracias, de verdad.

3n31ch

La mayoria de las veces los errores son ese tipo de "estupideces", es normal.  :xD

Si quieres saber mas sobre las expresiones regulares te recomiendo estudiar Automatas.

Suerte con tus estudios!