segunda-feira, dezembro 19, 2005

Por um codigo melhor - II

No post anterior eu postei alguns dos erros que mais me irritam quando leio código alheio. Na verdade, não chega a ser irritação de fato, se fosse não me surpreenderia se fosse diagnosticado com ulcera ou coisa pior. Penso apenas que talvez, com um pouco de pair programming, o autor provavelmente não teria cometido tais erros, ou talvez tivesse cometido menos erros. Essa segunda parte não é muita coisa além de adições de novas dicas esquecidas no post anterior. Na verdade, eu estava com preguiça, mas enfim... vamos a outras dicas para evitar que seu código dê mais trabalho do que deveria e, acredite, se vc comete esse tipo de erros, ele vai dar mais trabalho do que deveria:

1. Exceptions são um fluxo à parte e não o principal. Mas que espécie de dica é essa? Todo mundo já sabe disso, o nome já explica, ora bolas. É, explica, mas não impede ninguém de escrever algo assim:
public int foo(int num) {
if(num > 50) {

//faz um monte de coisas complicadas com num
//até chegar a um "resultado"

return resultado;

}

throw new IllegalArgumentException("num deve ser maior do que 50");
}
Estranho porque o fluxo que realiza a operação é tratado como secundário, à parte, ele é quem faz parte do desvio e não a exception. Esse exemplo - lembre-se, sou péssimo para exemplos - pode não parecer tão ruim, mas experimente lidar com mais de uma exception dessa maneira para vermos no que acontece:
public int foo(int num) {
if(num > 50) {

if(num%2 == 0) {

// faz um monte de coisas complicadas com num
// até chegar a um "resultado"
return resultado;
}

throw new IllegalArgumentException("num deve ser par");
}

throw new IllegalArgumentException("num deve ser maior do que 50");
}
Agora sim é possível perceber o problema com esse tipo de abordagem. Afinal, a grande questão é, porque as pessoas cometem esse tipo de erro? Pergunta retórica apenas. Exceptions, claro, devem ser tratadas em fluxos à parte, ou seja, se uma pré-condição não for satisfeita, uma exception devem ser lançada:
public int foo(int num) {

// eu sei que não é assim, mas o maldito do blogger não sabe!
if(num menorOuIgual 50) {
throw new IllegalArgumentException("num deve ser maior do que 50");
}

if(num%2 != 0) {
throw new IllegalArgumentException("num deve ser par");
}

// faz um monte de coisas complicadas com num
// até chegar a um "resultado"
return resultado;

}
Se vc ainda não se convenceu a escolher a segunda abordagem, experimente colocar uma nova pré-condição em cada um dos trechos e veja em qual faz isso de modo mais prático. Hoje, mesmo que ainda precise falar outras coisas sobre exception, fica apenas essa dica.

valeuz...