Que atire uma pedra aquele que ainda não está cansado de ver/escrever código assim:
public Departamento insere(Integer codigo, String descricao) {
if (descricao == null) || (descricao.equals("")) {
//faz alguma coisa
}
}
Poxa, é impossível. Cada desenvolvedor deve escrever isso no mínimo umas 10 vezes por dia. Se você faz isso todo dia, acha um saco e nunca achou uma maneira para resolver esse ‘problema’, eis a solução:
public Departamento insere(Integer codigo, String descricao) {
//faz alguma coisa
}
Simples não? Problema resolvido.
A documentação deve deixar bem claro que este método não aceita nulo ou vazio no parâmetro ‘descricao’.
Se este método for interno à sua aplicação, fica fácil, você sabe que as classes que irão chamar este método precisam estar escritas de tal maneira que não passe nenhum valor nulo ou vazio, caso contrário, haverá algumas excessões não esperadas.
Se você prestar atenção, ao remover essas verificações de toda a hierarquia de classes, as únicas classes que realmente irão precisar da verificação são as classes que interajem com a interface do usuário.
Agora se seu método estiver exposto em um WebService, isso significa que outros desenvolvedores poderão chamar este método e você não tem controle sobre o que estes desenvolvedores irão passar para o método. Neste caso, ainda assim, deixe o método sem as verificações e faça-as nas interfaces do WebService. Crie pré-condições para seus serviços, deixe claro que o parâmetro descrição deve conter algum valor. Se a condição estiver válida, você pode chamar o método tendo a garantia de que não haverá excessões.
É comum que quando nos deparamos com um erro de NullReferenceException (C#) ou NullPointerException (Java) no log da aplicação, a primeira coisa que fazemos é ir direto na linha que deu erro e adicionar a verificação se é nula apenas para que não ocorra tais erros. Se um valor nulo chegou até ali é porque ele deveria ter parado em algum lugar antes, geralmente na camada entre a interface do cliente e o código de negócio.
Lembre-se do princípio da responsabilidade exclusiva! Não é responsabilidade do método ‘insere’ garantir que os parâmetros estejam válidos.
Além deste caso onde você pode ter problemas com parâmetros nulo, existem lugares em que você faz a verificação de nulo com o retorno de um método, ficando mais ou menos assim:
Departamento depto = dao.insere(1, "Compras");
if (depto != null) {
//Faz algo
}
E nesses caso, como se comportar? Isso vai ficar para o próximo post, lá eu falo sobre isso e um pattern relacionado, chamado de Null Object Pattern. Até mais!
Edit #1: O post sobre Null Object Pattern é este aqui.
