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;

Zend Studio para Eclipse

Tags: , , , — October 3, 2008 @ 4:41 pm

É isso mesmo, você não leu errado. A nova versão do Zend Studio, provavelmente a melhor IDE para PHP existente no mercado, é agora um plugin para o Eclipse.

Enquanto a Zend se prontifica a continuar dando suporte aos usuários do Zend 5.5, a versão 6 foi totalmente reescrita como um Plugin para o Eclipse, adicionando uma série de plugins existentes para desenvolvimento web e propondo-se a criar uma ferramenta IDE completa.

Zend Studio for Eclipse Splash ScreenNa página do Zend Studio, está disponível um comparativo de suas características com as do Eclipse PDT, onde destacam-se algumas características como um editor WYSIWYG para PHP/HTML, possibilidade de ver elmentos JavaScript dentro dos editores PHP e HTML, suporte ao PHPDocumentor e integração com Zend Framework e outros produtos da Zend.

Aproveitando-se das capacidades multiplataforma do Eclipse, o Zend Studio agora está disponível para MS Windows®, Mac OS X® e GNU/Linux. Tenho a dizer que a versão Linux está ótima (novamente, graças ao Eclipse) utilizando o Tollkit GTK2, o que é uma grande melhora ao antigo Zend Studio que era apenas passável para Linux. Infelizmente (e sabe-se lá porque) está disponível apenas para arquitetura x86, o que significa que usuários de Plataforma 64 bits devem continuar com Eclipse + PDT.

Sobre os Plugins… Dei uma rápida olhada nos plugins já instalado no Zend Studio for Eclipse e me deparei com vários nomes conhecidos, como o WTP (web tools plataform), DTP (data tools plataform), GEF (graphical editing framework), Subversive e até mesmo o PDT (PHP development tools). Isso significa que além de seus próprios plugins, a Zend está incluindo no “pacote” uma série de plugins Livres já conhecidos, e isso não é, de forma alguma, um ponto negativo, uma vez que eles estão dando valor e utilizando plugins estáveis e muito já usados por desenvolvedores PHP.

Zend Studio for Eclipse “about” Dialog

Como ponto negativo, a inclusão de uma série de plugins e, inclusive, conectores para diversas bases de dados, torna o instalador um pacote de mais de 320MB, e também o deixa um pouco mais lento que o Eclipse normalmente seria.

Obviamente, o Zend Studio continua sendo Pago (o que não é exatamente um ponto negativo, visto que paga-se pelo suporte e atualizações constantes). Uma versão de avaliação pode ser baixada, ficando disponível por 30 dias.

Resumindo, o Zend Studio for Eclipse torna-se uma ótima opção para desenvolvedores PHP que estejam dispostos a pagar certa quantia pelo software e pelo suporte da Zend, e também para aqueles que utilizam com frequência o Zend Framework e produtos como Zend Debugger e Zend Guard, beneficiando-se da integração da IDE com estes produtos. Quanto aos demais, seria melhor continuar com Eclipse + PDT, ou procurar uma das distribuições do Eclipse que ofereça o que deseja, pelo simples fato de não serem necessários todos os recursos que o Zend Studio for Eclipse oferece.

Lançado CakePHP 1.2 RC3

Tags: , — October 2, 2008 @ 3:08 pm

cake-logo.pngFoi lançada hoje a última versão, antes da versão final do CakePHP 1.2, contendo a correção de bugs existentes e, principalmente, uma grande melhora na performance.

Para quem não conhece, o CakePHP é um Framework PHP que utiliza padrões de desenvolvimento como MVC (Model View Controller) e Active Record, inspirado no conhecido Framework para Ruby Ruby on Rails. O principal diferencial do CakePHP para outros Frameworks está na facilidade de desenvolver aplicações rapidamente com ele, e sua capacidade de trabalhar com relacinamentos entre tabelas.

Nesta nova Release Candidate, Larry (o principal desenvolvedor) se concentrou em iterações e melhorias de performance, resultando em uma versão até 10x mais rápida que a RC2.

Não deixe de atualizar para a RC3 o quanto antes.

Fonte: http://bakery.cakephp.org/articles/view/release-cakephp-rc3-the-rc-of-triumph

Singleton Pattern no PHP 4

Tags: , — September 11, 2008 @ 12:39 am

Já sabemos como funciona o singleton pattern no PHP 5, mas devido as capacidades limitadas de POO do PHP4, não é possível se utilizar do mesmo padrão de desenvolvimento neste, mas há um pequeno truque que podemos fazer para obter o mesmo resultado.

No PHP4 não é possível termos propriedades estáticas em classes, mas ainda é possível ter variáveis estáticas dentro de funções. Assim podemos criar uma função capaz de fazer o papel do singleton ao instanciar uma classe em um objeto estático. Veja o Exemplo:

function &singleton() {
    static $obj;
 
    if (!isset($obj)) {
        //instancia a classe, caso o objeto já não exista
        $obj = new stdclass;
    }
    return $obj;
}

No exemplo, eu usei a classe padrão stdclass do PHP, mas o mesmo funciona com qualquer classe definida pelo usuário. Você pode, inclusive, utilizar um array no lugar da variável $obj para usar a mesma função singleton para instanciar ou recuperar várias classes.

Note o operador de referência ‘&’ antes do nome da função. Ele é necessário para garantir que a função sempre retorne uma referência para o objeto estático, ao invés de criar um novo objeto, e também é necessário ao se atribuir o retorno da função a uma variável . Veja um exemplo de uso da função:

$foo =& singleton(); //cria um objeto
var_dump($foo);
 
$foo->property = 'SamuraiDio'; //atribui um valor a uma propriedade
var_dump($foo);
 
$bar =& singleton(); //recupera o objeto existe (não irá criar um novo)
var_dump($bar);

A saída do código acima, será como a seguir:

object(stdClass)(0) {
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}

Note que a terceira chamadas a var_dump() ainda exibe o valor da propriedade, apesar de ser de outra variável. Isso ocorre porque nossa função singleton() não instancia a classe novamente, mas sim apenas retorna uma referência para o objeto já existente. Assim temos um Singleton Pattern functional também para PHP4.

NOTA: Mesmo com a possibilidade de usar Singleton no PHP4 utiizando-se desta técnica, é altamente recomendável atualizar suas instalações para PHP5, beneficiando-se com a maior capacidade e segurança da versão.

Fontes: http://www.weberdev.com/get_example-4014.html, http://br.php.net/manual/pt_BR/language.variables.scope.php#language.variables.scope.static

Next Page >>>