Discussão interessante…
Abril 15, 2007 at 2:24 pm | In Java | 2 CommentsSemana passada surgiu uma discussão muito interessante no projeto que participo.
Qual o tamanho ideal de um método (linhas de código)?
Na minha opinião, um conceito que deve, ou deveria ser, conhecido de todos os profissionais da área é: “Um método deve ser responsável por executar uma tarefa, apenas uma tarefa.”
É praticamente impossível dar manutenção em métodos gigantes, analisar dezenas de if`s, for`s, etc… Sem contar que a probabilidade de se achar um POG é altíssima.
Então qual seria a solução? Simples, divida as responsabilidades. Se seu método precisa fazer uma validação, deixe essa tarefa para outro método e assim por diante. Dividindo resposabilidades você aumentará a manutenabilidade do código.
Um exemplo:
Já vi muito código assim…. rs
——————————————
public void inserir(Contato pContato) throws ExcecaoNegocio {
if ( (pContato.getNome() == null || pContato.getNome().equals(“”)) &&
(pContato.getTelefone() == null || pContato.getTelefone().equals(“”)) ){
throw new ExcecaoNegocio(“Objeto inválido”);
}
dao.inserir(pContato);
}
——————————————
Este exemplo está bonito perto do que vemos por aí…. mas podemos melhorá-lo.
Minha sugestão…
——————————————
public void inserir(Contato pContato) throws ExcecaoNegocio {
if (!validarContato(pContato)){
throw new ExcecaoNegocio(“Objeto inválido”);
}
dao.inserir(pContato);
}
private boolean validarContato(Contato pContato) {
if (verificaVazio(pContato.getNome()) || verificaVazio(pContato.getTelefone())){
return false;
}
return true;
}
private boolean verificaVazio(String pString){
if (pString == null || pString.equals(“”)){
return true;
}
return false;
}
————————————————–
Veja como ficou dividida a responsabilidade entre os métodos.
O método ‘inserir(Contato pContato)’ apenas persiste o objeto. Ele desconhece as regras de validação.
O método ‘validarContato(Contato pContato)’ apenas valida um contato e pode ser utilizado por outros métodos da aplicação (ex: atualizar).
O método ‘verificaVazio(String pString)’ valida se um objeto String possui um conteúdo válido. Apenas isso.
..
Este exemplo bem simples demostra o quanto é importante a divisão de resposabilidades (entre classes, métodos, etc..) para a qualidade de um sistema.
Alguém acrescenta uma sugestão???
2 Comentários »
Feed RSS dos comentários deste post URI do TrackBack
Deixe um comentário
Blog no WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.
Primeiramente sigo muito essa ideia de uma funcao por metodo.
Eu melhoraria ainda mais esse codigo:
Segue abaixo:
public void inserir(Contato pContato) throws ExcecaoNegocio { if (!isContatoPreenchido(pContato)){ throw new ExcecaoNegocio("Objeto inválido"); } dao.inserir(pContato); }// O nome nao ficou bem legal, mas estou sem muita ideia, Queria mesmo mostrar que com apenas 2 metodos da para fazer o mesmo e eu uso “is” sempre que um metodo retorna um boolean.
private boolean isContatoPreenchido(Contato pContato) { if (pContato.getNome().isEmpty()) || pContato.getTelefone().isEmpty()){ return false; } return true; }Comentário por Alexandre Ferreira — Maio 29, 2007 #
Marcelo,
Bem interessante seu post, parabéns!
Apenas acrescentando uma informação:
O padrão chamado Information Expert (a.k.a. Expert), que é um padrão GRASP fala justamente sobre isso!
Comentário por Daniel — Setembro 2, 2007 #