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;

Compilando Chromium (ou Google Chrome) no Linux

Tags: , , — September 11, 2008 @ 4:13 pm

Com o lançamento beta do navegador web Google Chrome, obviamente eu também fiquei animado e ansioso para testar o novo “brinquedinho”.

Vou mostrar aqui como compilar o Chromium, o projeto no qual é baseado o Google Chrome, no Debian GNU/Linux e rodar os unit tests que vêm com ele. Note que não existe ainda um navegador Chromium para Linux, tudo o que temos são alguns comandos de terminal usados para testar alguns móduilos, ou seja, este tutorial será exclusivamente destinado a desenvolvedores (principalmente C/C++) e pessoas curiosas.

Nota: Ainda não existe uma versão funcional de navegador baseado no Chromium para Linux. Porém, vários sub-módulos podem ser compilados no Linux, mas tudo o que se obtém é um comando executável que retorna “all tests pass”. ”

Se você deseja instalar um navegador baseado no Chromium funcional, procure por um dos vários tutoriais de instalação do Google Chrome no Wine.

Primeiramente, você precisará instalar as seguintes dependencias:

  • Subversion >= 1.4
  • pkg-config >= 0.20
  • Python >= 2.4
  • Perl >= 5.x
  • gcc/g++ >= 4.2
  • bison >= 2.3
  • flex >= 2.5.34
  • gperf >= 3.0.3
  • libnss3-dev >= 3.12

No Debian e distribuições derivadas dele (como o Ubuntu) basta instalar tudo com o apt-get / aptitude:

# aptitude install subversion \
    pkg-config \
    python \
    perl \
    g++ \
    bison \
    flex \
    gperf \
    libnss3-dev

Após instalar as dependências, escolha um diretório para colocar os fontes e compilar. Vou considerar que o diretório escolhido seja $HOME/chromium. Primeiramente crie o diretório e mude para ele:

$ mkdir $HOME/chromium
$ cd $HOME/chromium

Então obtenha o depot tools usando o comando svn:

$ svn co http://src.chromium.org/svn/trunk/depot_tools/linux depot_tools

Como alternativa, você pode baixar o depot tools em tar.gz.

Depois disso mude seus locales para “C” (necessário devido a um bug temporário nos scripts gclient, que interpretam a saída do subversion), e execute ./depot_tools/gclient config:

$ export LANG=C
$ export LANGUAGE=C
$ export LC_ALL=C
$ ./depot_tools/gclient config http://src.chromium.org/svn/trunk/src

O checkout dos arquivos via svn deve demorar algum tempo, dependendo de sua conexão. Caso esteja muito lento você pode também obtar por obter um snapshopt do SVN Checkout.

Após obter os fontes, para compilar execute:

$ cd $HOME/chromium/src/chrome
$ ../third_party/scons/scons.py Hammer

Como o projeto ainda está engatinhando, e os desenvolvedores estão “brincando” com o código, é bem comum que alguma coisa falhe nesta parte. Infelizmente será necessário um mínimo de conhecimento em C/C++ ou outras linguagens utilizadas para seguir adiante. Eu por exemplo, me deparei com alguns erros nos arquivos src/webkit/glue/webframe_impl.h e src/skia/effects/SkCullPoints.cpp, facilmente corrigidos removendo uma declaração typedef e adicionando alguns parênteses a uma condição, respectivamente. Estou postando meus DIFFs para caso alguém tenha o mesmo problema:

webframe_implh.diff
skcullpointscpp.diff

Após a compilação, executáveis criados durante o processo estarão disponíveis em $HOME/chromium/src/chrome/Hammer.

Como mencionado anteriormente, Ainda não existe uma versão funcional de navegador baseado no Chromium para Linux. A única coisa que você pode fazer no momento é executar alguns unittests:

$ cd $HOME/chromium/src/chrome
$ Hammer/base_unittests
$ Hammer/net_unittests

Para quem tiver interesse em colaborar com os esforços para termos um navegador baseado no Chromium para linux, não deixem de acessar a página de desenvolvimento para Linux, com alguns detalhes do desenvolvimento, e uma série de bugs aguardando ajuda.

Desta vez não tem screenshot…
Bem, já que insistem… aí vai um screenshot de um unittest:

chrome_baseunittest.jpg

Fonte: http://dev.chromium.org/developers/how-tos/build-instructions-linux

SpiderMonkey JavaScript Shell – Programando JavaScript em linha de comando

Tags: , , , — March 14, 2008 @ 7:10 pm

Desenvolvedores Web costumam ter grandes problemas para debugar JavaScript. Enquanto programas como a extensão FireBug do Firefox fazem milagres para debugar, o programador ainda precisa colocar sucessivos alert()s para descobrir os valores que suas variáveis assumem em determinados pontos. Certo?

Errado!

Estava pesquisando agora a pouco algumas funções de js no MDC quando fiquei meio curioso com o modo como os exemplos de código eram mostrados e, em especial, de uma função print(). Como no fragmento a seguir:

var names = "Harry Trump ;Fred Barney; Helen Rigby ;";
print(names);
var re = /\s*;\s*/;
var nameList = names.split(re);
print(nameList);

Ora, bolas! Javascript não pode imprimir nada em stdout, então, como pode existir uma função print()?

Então que, pesquisando mais um pouquinho, cheguei ao SpiderMonkey Javascript Shell.

O SpiderMonkey é o mecanismo interpretador de Javascript do Gecko, escrito em C, e utilizado em vários produtos Mozilla, como o Firefox, por exemplo e a boa notícia é que ele provê também um Shell para executar js em linha de comando.

Com isso fica extremamente fácil criar e testar scripts para usar posteriormente. Veja o exemplo a seguir:

diovani@debian-websul:~$ js
js> var frase = 'Hello World!';
js> var tamanho = frase.length;
js> var teste = frase + ' tem ' + tamanho + ' caracteres.';
js> print(teste);
Hello World! tem 12 caracteres.
js>

Para instalar o SpiderMonkey JS Shell no Debian GNU/Linux basta executar o comando:

# aptitude update && aptitude install spidermonkey-bin

Após a instalação, basta executar em um terminal o comando $ js para entrar no Shell interativo:

Para entrar no shell interativo use o comando:
$ js

Para executar os scripts de um arquivo (foo.js) use:
$ js -f foo.js

Para executar os scripts de um arquivo (foo.js) e entrar no shell interativo (muito útil para carregar funções ou bibliotecas) em seguida use:
$ js -f foo.js -f -

Mas mesmo para outras distribuições, e até mesmo Windows, deve ser extremamente fácil instalá-lo. Veja o link abaixo para a Documentação do Javascript Shell e exemplos de uso:

Link: Introdução ao Shell Javascript

PHP Eclipse

Tags: , — October 3, 2007 @ 8:00 pm

Após um bom tempo sem postar venho com uma recomendação.

Não faz muito tempo, em meu post sobre Delphi e Visual Studio como IDEs para PHP falei no Eclipse, agora venho fazer um resumo e recomendação sobre esta IDE.

O Eclipse é uma IDE produzida inicialmente para Java, mas que possui plugins para diversas outras linguagens, assim podendo ser usado para desenvolvimento em C/C++, Ruby, Python, e claro, PHP. Acontece que o Eclipse é, ao meu ver, a segunda melhor IDE para programação com PHP, perdendo apenas para o Zend Studio, porém, livre, mais leve, e até mesmo com mais recursos, isso porque você pode adicionar mais ferramentas para editar arquivos HTML, JS, SQL, e até fluxogramas e ferramentas gráficas.

Ademais ele conta com um excelente controle de projetos, ajuda de contexto (inclusive para classes definidas pelo usuário) e suporte a controle de versão com CVS ou SVN.

eclipse-context-help.png botões para sincronização com um repositório CVS

O Eclipse pode ser adquirido pelo website oficial ou em distribuições customizadas para diversas linguagens. Eu recomendo o EasyEclipse para PHP, que pode ser aquirido aqui. Lembrando que mesmo as distribuições podem ser customizadas para adicionar mais e mais recursos. Ele também pode ser instalado via ap-get no Debian ou Ubuntu, mas as distribuições customizadas parecem bem mais completas e funcionais.

Recomendado!

Next Page >>>