Discussão interessante…

abril 15, 2007 às 2:24 pm | Publicado em Java | 2 Comentários

Semana 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???

Anúncios

2 Comentários »

RSS feed for comments on this post. TrackBack URI

  1. 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;
       }
    

  2. 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!


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Crie um website ou blog gratuito no WordPress.com.
Entries e comentários feeds.

%d blogueiros gostam disto: