How to optimize the validations in a registration form?

2

I am making a registration form on android, I use several if blocks to validate each field and then insert the information into a database (I have solved this already), I would like to know if there is any way to optimize or improve my code.

private void validateForm(View v){

    User u = new User();

    if(!editTextfirstName.getText().toString().equals("") && editTextfirstName.getText().toString().length() >= 3){

        u.setFirstName(editTextfirstName.getText().toString());
        editTextfirstName.setError(null);

    }else {

        editTextfirstName.setError("Nombre(s) invalidos");

    }

    if(!editTextlastName.getText().toString().equals("") && editTextlastName.getText().toString().length() > 3){

        u.setLastName(editTextlastName.getText().toString());
        editTextlastName.setError(null);

    }else{

        editTextlastName.setError("Apellido(s) invalidos");

    }

    if(!editTextEmail.getText().toString().equals("") && editTextEmail.getText().toString().contains("@") && editTextEmail.getText().toString().length() > 5){

        u.setEmail(editTextEmail.getText().toString());
        editTextEmail.setError(null);

    }else{

        editTextEmail.setError("Correo electronico invalido");

    }

    if(!editTextPass.getText().toString().equals("")  && editTextPass.getText().toString().length() >= 5){

        String pw = editTextPass.getText().toString();
        editTextPass.setError(null);
        editTextConfirmPass.setError(null);

        if(editTextConfirmPass.getText().toString().equals(pw)){

            u.setPassword(pw);

        }
        else {
            editTextConfirmPass.setError("Las contaseñas no coinciden");
        }

    }else {

        editTextPass.setError("Contraseña invalida");
        editTextConfirmPass.setError("Contraseña invalida");

    }


    insert(u, v);


}

private void insert(User u, View v){

    if(u.getFirstName() != null && u.getLastName() != null && u.getEmail() != null && u.getPassword() != null){
        myDatabase.addUser(u);

        cleanForm();

        Snackbar snackbar = Snackbar.make(v, "Usuario registrado correctamente", Snackbar.LENGTH_SHORT);
        snackbar.show();
    }

}

private void cleanForm(){
    editTextfirstName.setText(null);
    editTextlastName.setText(null);
    editTextEmail.setText(null);
    editTextPass.setText(null);
    editTextConfirmPass.setText(null);
}
    
asked by Aarón Zúñiga 10.02.2017 в 09:13
source

2 answers

1

It is better to reduce the code by means of functions, for example by adding one that detects if the value contained in the EditText is not empty and is greater than the required length:

private boolean noNullEmptyOrMinLength(String value, int length){
    if(value != null || !value.isEmpty() || value.length() > length) {
        return true;
    }else{
        return false;
    }
}

You can use the same or another method to validate if it contains the desired character:

   private boolean noEmptyOrMinLengthContains(String value, int length, String containValue){
        if((value != null || !value.isEmpty()) && value.length() > length && value.contains(containValue)) { //Se cumple condición.
            return true;
        }else{
            return false;
        }
    }

You could not use else if since they are different EditText , you could reduce to:

if(noNullEmptyOrMinLength(editTextfirstName.getText().toString(), 3)){    
    u.setFirstName(editTextfirstName.getText().toString());
    editTextfirstName.setError(null);    
}else {    
    editTextfirstName.setError("Nombre(s) invalidos");    
}

if((noNullEmptyOrMinLength(editTextlastName.getText().toString(), 3)){    
    u.setLastName(editTextlastName.getText().toString());
    editTextlastName.setError(null);   
}else{    
    editTextlastName.setError("Apellido(s) invalidos");    
}

if(noEmptyOrMinLengthContains(editTextEmail.getText().toString(),5, "@")){
    editTextEmail.setError(null);    
}else{
    editTextEmail.setError("Correo electronico invalido");
}

if((noNullEmptyOrMinLength(editTextPass.getText().toString(), 5)){
    String pw = editTextPass.getText().toString();
    editTextPass.setError(null);
    editTextConfirmPass.setError(null);
    if(editTextConfirmPass.getText().toString().equals(pw)){
        u.setPassword(pw);
    }else {
        editTextConfirmPass.setError("Las contaseñas no coinciden");
    }
}else {
    editTextPass.setError("Contraseña invalida");
    editTextConfirmPass.setError("Contraseña invalida");
}
    
answered by 10.02.2017 в 17:50
1

I think you could do it in the following way:

private boolean validateForm(){
    if (condicionErronea) {
        editTextfirstName.setError("Nombre(s) invalidos");
        return false;
    } 
    if (condicionErronea2) {
        editTextlastName.setError("Apellido(s) invalidos");
        return false;
    } 
    if (condicionErronea3) {
        editTextEmail.setError("Correo electronico invalido");
        return false;
    } 

    .
    .
    .

    return true;

}

As a datum, you should not call insert if your User can have data null

Method insert :

private void insert(User u, View v){

    myDatabase.addUser(u);

    cleanForm();

    Snackbar snackbar = Snackbar.make(v, "Usuario registrado correctamente", Snackbar.LENGTH_SHORT);
    snackbar.show();

}

Main process:

if (validateForm()) {
    //Si llega aquí es que no ha habido ningún error
    User u = new User();
    u.setFirstName(editTextfirstName.getText().toString());
    u.setLastName(editTextlastName.getText().toString());
    u.setEmail(editTextEmail.getText().toString());
    .
    .
    .

    insert(u, v);
}
    
answered by 10.02.2017 в 10:08