Quanto mais simples melhor

Tags: , — January 20, 2009 @ 9:08 pm

Fazendo manutenção em um script hoje no trabalho (código legado), me deparei com um código mais ou menos assim:

$condicao = !($var == 0);

Devo ter levado cerca de uns 5 minutos para entender o que a maldita expressão retornava. Pelo menos ela rendeu algumas risadas minhas e de meus colegas.

Acontece que, em programação, quanto mais simples e fácil de entender se deixar uma expressão melhor. Mesmo que você seja o único a ter acesso ao fontes posteriormente.

Não quero criticar o autor do código que eu estava mantendo (até porque não sei quem é), mas apenas estou usando o (mau) código acima para exemplificar o tema do tópico.

Falando de boas práticas de programação, não se nega uma comparação deste jeito. O correto seria usar o operador NOT EQUAL (diferente):

$condicao = ($var != 0);

E se considerarmos as facilidades de conversão de tipos do PHP, podemos simplificar ainda mais, bastanto usar um cast:

$condicao = (bool) $var;

Explicando…
A expressão acima (primeiro exemplo) compara se a variável é igual a 0 (zero) e depois nega o resultado, assim se a variável for igual a zero, a comparação retornará true (verdadeiro), que se tornará false (falso) devido a negação (!), o que dá o mesmo resultado que comparar se a variável é diferente de 0 (zero)(segundo exemplo). Como em PHP 0 (zero) é validado com false (falso) e qualquer outro valor como true (verdadeiro), o resultado é o mesmo que simplesmente converter a variável para booleano (terceiro exemplo).

Resumindo, sempre mantenha as linhas de código o mais claras e simples o possível.
Seguem algumas dicas:

  • Evite expressões difíceis de entender, como a do exemplo deste post. Verifique há um modo mais simples de obter o mesmo resultado com código mais claro e/ou menor, se não encontrar, adicione comentário para tornar a expressão mais clara;
  • use nomes de variáveis que exemplifiquem sua finalidade. Prefira usar $cor, ao invés de $c ou $x;
  • sempre indente corretamente seu código, deixando os bloco {} bem visíveis. Use linhas em branco entre blocos de comandos diferentes. Prefira usar espaços ao invés de tabs para indentação, assim o código fica com o mesmo visual em qualquer editor;
  • evite blocos vazios, como um if ou loop sem corpo, é comum encontrarmos blocos como:
    if ($valor == true) {
     
    } else {
        $var = 'constante';
    }
  • utilize phpdoc
    /**
     * Descrição da classe, método ou função
     *
     *@param tipo [variável [descrição]]
     *@return tipo [descrição]
     */

    para definir classes, interfaces, métodos, propriedades e funções. Este é o método de documentação padrão do PHP e auxilia no uso de IDEs especializadas (Eclipse PDT, Zend Studio, etc.);

  • comente TODA linha de código sempre que possível.

Com estas boas práticas, seus códigos deverão ter uma vida útil muito mais longa (sim, código fonte tem validade, e a clareza e documentação destes serve de embalagem).

Só pra concluir, vou colocar uma tabelinha de comparações básicas em PHP aqui, do tipo que a gente sempre fica em dúvida quando usa um if($var) :

//array vazio, string vazia, 0 com ou sem aspas e null
//são todos avaliados como FALSE (falso)
array() == "" == '' == '0' == 0 == null == false;
//se usados operadores de comparação explícita,
//que também comparam os tipos (=== e !==)
//APENAS valores IDÊNTICOS são avaliados
//como TRUE (verdadeiro)
0 === 0;
'abc' === 'abc';
 
//todos diferentes se comparados também em seus tipos
array() !== "" !== '' !== '0' !== 0 !== null !== false;
If you enjoyed this post, make sure you subscribe to my RSS feed!

3 Comments »

  1. Realmente os códigos tem que ser legíveis!

    Ja peguei coisas assim:

    if(true){

    }

    Comment by Marcelo Sabadini — February 2, 2009 @ 5:27 pm

  2. Hahahaha nossa! Isso sim é gambiarra (e desnecessária ainda).
    Cada pérola :P

    Comment by Bruna Griebeler — March 26, 2009 @ 10:04 pm

  3. hehe, Toda semana tenho encontrado algumas pérolas no trabalho, nesta última foi uma de SQL onde uma query tinha 4 LEFT JOINs para as mesmas tabelas, agrupando em uma linha registros que ficariam bem melhores em 4… trabalhar com código legado dá nisso :P

    PS.: Olá Bruna, estarei na sua palestra este sábado, aguardo umas boas dicas ;)

    Comment by diovani — March 26, 2009 @ 10:11 pm

RSS feed for comments on this post. TrackBack URI

Leave a comment