Quanto mais simples melhor
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;


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
Hahahaha nossa! Isso sim é gambiarra (e desnecessária ainda).
Cada pérola :P
Comment by Bruna Griebeler — March 26, 2009 @ 10:04 pm
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