Eu tenho uma classe que tem muitos atributos, nem todos eles como obrigatório. Dependendo do que eu cadastrar, dos atributos que eu inserir dados, ele vai salvar com uma situação que é de preenchimento automatico
eu tenho 5 tipos de situações para este meu objeto
Minha regra de negocio fala que por exemplo:
se campos A,B,C,D estiverem preenchidos &&
se campo C < 100 &&
campo D não estiverem preenchidos
Então situação = situação 1
se campo A,B,C estiverem preenchidos &&
se campo C < 100 &&
campo C,D não estiverem preenchidos
Então situação = situação 2
E assim por diante…
Eu tenho essa regra que verifica os campos preenchido e se atender algumas validações ele seta uma situação(status) apropriada.
Em uma classe especifica para Negocio do caso de uso eu poderia simplemente criar um monte de IFs para resolver este problema.
Eu gostaria de diminuir esse monte de IF, porque if com OO fica feio.
Eu queria aplicar mais o OO
PS: Tentei aplicar o Padrão de Projeto state, porem ele foi descardado pelo fato de, que este padrão parte do pressuposto de que quando alterado uma situação, ele executa um comando especifico para aquela situação
no meu caso eu tenho que apenas validar meus campos se estão preenchidos ou não e setar essa situação automaticamente. Alguem tem alguma ideia de como resolver este problema, este excesso de if?
alguem tem algum padrão que auxilia nessa regra?
[code] /**
* Testes usados para validação do CNPJ
*
* Last Revision: 01/14/2009
* @author Tomaz Lavieri
* @since Lavieri Brazilian Utilities 1.0
* @version 1.0 /
private enum ValidateCnpj {
/*
* Cnpj não nulo, cnpj != null. /
NOT_NULL { @Override public boolean isValid(Cnpj cnpj) {
return !cnpj.isNull();
}
},
/*
* Cnpj ##.###.###/0000-## com ordem não zero. /
NOT_ORDER_ZERO { @Override public boolean isValid(Cnpj cnpj) {
return !cnpj.getOrderDigits().equals(“0000”);
}
},
/*
* Cnpj 00.0##.###/YYYY-## com pelomenos 3 zeros no inicio, e ordem maior que
* 300 e que não seja o banco do brasil sa (00.000.000/####-##) não são
* permitidos. /
NOT_BASE_START_WITH_ZERO_AND_HAS_ORDER_GREATER_300_AND_NOT_BB { @Override public boolean isValid(Cnpj cnpj) {
boolean startWith3zero =
cnpj.getBaseDigits().substring(0, 3).equals(“000”);
boolean isOrderGreater300 =
Integer.parseInt(cnpj.getOrderDigits()) > 300;
boolean isNotBancoDoBrasil =
!cnpj.getBaseDigits().equals(“00000000”);
return !(startWith3zero && isOrderGreater300 && isNotBancoDoBrasil);
}
},
/*
* Cnpj YY.YYY.YYY/####-##, onde Y é um número que se repete, e diferente de
* zero. Por exemplo 11.111.111/0001-91 é invalido, mesmo o digito verificador
* estado correto, esta regra só não vale para 00.000.000/####-## que é o CNPJ
* do banco de brasil sa.
*/
NOT_BASE_WITH_ONLY_SAME_DIGIT_AND_NOT_BB { @Override public boolean isValid(Cnpj cnpj) {
boolean isNotBancoDoBrasil =
!cnpj.getBaseDigits().equals(“00000000”);
boolean allDigitEquals =
cnpj.getBaseDigits().matches(cnpj.getBaseDigits().charAt(0)+"{8}");
return !(isNotBancoDoBrasil && allDigitEquals);
}
},
/**
* Cnpj com digitios verificadores corretos.
*/
VALID_DIGITS {
@Override public boolean isValid(Cnpj cnpj) {
return VerifierDigits.isValid(cnpj, BASE_LENGTH, FACTOR, COEFICIENTS);
}
};
/**
* Realiza o teste para o {@link Cnpj} passado no parametro.
* <BR>
* <BR>Para validar um {@link Cnpj} é necessario que este seja válido para todos
* os {@link ValidateCnpj}, porém um {@link Cnpj} será inválido quando qualquer
* um dos testes de {@link ValidateCnpj} retorne <tt>false</tt>.
* @param cnpj {@link Cnpj} a ser testado.
* @return <tt>true</tt> - caso seja válido para este teste. Não indica que este
* {@link Cnpj} é valido, para tal é preciso ser valido para todos os
* {@link ValidateCnpj}
* <br><tt>false</tt> - caso seja inválido para este teste, o que
* consequentemente invalida o {@link Cnpj}.
*/
abstract public boolean isValid(Cnpj cnpj);
}
assim eu guardo os teste em um Enum, e posso sair testando todos, podia ali ao constatar que stillValid = false, lançar um Throws com o ValidadeCnpj.CONSTATE adequado…