quarta-feira, 2 de janeiro de 2013

Otimização e Boas Práticas de Programação!


O Sérgio Taborda escreveu um excelente artigo sobre otimização preventiva de código. Concordo com ele em quase tudo, só não considero alguns casos como otimização que, a meu ver, são boas práticas!

Primeiramente, deve se entender o que é otimização. Conforme o dicionário Aurélio, otimização, vem de otimizar cuja a definição para a informática é:
Aperfeiçoar (um programa, rotina, etc) a fim de que ele realize sua função no menor tempo ou no menor número de passos possível. 
Só que um problema deve utilizar somente o número de passos necessários a sua resolução e nada mais e isso não ocorre nos casos abaixo, similares a exemplos colocados pelo Sérgio:
void fazAlgo(boolean ok){
  if(ok == true){
    //faz alguma coisa
  }
  else {
    //faz outra coisa
  }
...

private Set<Cliente> clientes;

void buscaCliente(cpf CPF){
  Cliente resposta;
  for(Cliente cliente : clientes){
    if (cliente.getCpf.equals(cpf))
      resposta = cliente;
  }
  return resposta;
}
Na função fazAlgo (desconsiderando possáveis otimização do compilador) a verificação é desnecessária, pois são feitas duas operações ao invés de uma). Na função buscaCliente a iteração continua mesmo que tenha encontrado o cliente na primeira iteração! Em ambos os casos temos um problema de desempenho por más praticas de programação na minha opinião!

As soluções de ambas são simples, e explicadas pelo Sérgio (deixa de ser preguiço e vai ler o post dele dele), mas não acredito que sejam "otimizações". Uma otimização possível do exemplo acima, que também foi exemplificado por ele, seria substituir o Set por um Map assim na busca de clientes teríamos um ganho de desempenho pois teríamos apenas uma operação sendo feito ao invés de N conforme exemplo abaixo. Nesse caso, temos realmente uma otimização preventiva.

private Map<CPF, Cliente> clientes;
void buscaCliente(cpf CPF){
  return clientes.get(cpf);
}
Para concluir, a minha intenção ao escrever este texto é ressaltar a importância da diferença entre otimização e a alteração de código para corrigir problemas oriundos de más práticas programação. Más praticas devem ser combatidas e otimização devem ser feitas com moderação pois podem introduzir erros ou tornar o código confuso e de difícil manutenção. Conforme o citação retirado do livro Java Efetivo, de Joshua Bloch (o qual recomendo a leitura veementemente)
Mais erros de computação são cometidos em nome da eficiência (sem necessariamente atingi-la) do que por qualquer outra razão - inclusive a simples ignorância!
 Então evite as más práticas e otimize com moderação!