sexta-feira, 14 de agosto de 2009

Dicas

Alguns alunos meus e amigos me perguntaram em diferentes momentos o que eu recomendaria como primeiros passos para quem está começando no mundo do desenvolvimento. Então aqui vão algumas dicas:

Convenção de Código

Sempre que eu lido com o código, eu fico impressionado com a criatividade de programadores em codificar. Infelizmente, essa criatividade é utilizada de maneira a complicar algo simples, o que virá a dificultar a manutenibilidade do projeto. Quando se está aprendendo a programar, é comum se desenvolver de maneira desleixada se preocupando apenas com o resultado da execução. Essa prática deve ser evitada o quanto antes e uma das melhores maneiras de se fazer isso é se adotando uma convenção de código.
Não se espante ao discordar de algo da convenção. Praticamente todas as pessoas discordam da convenção em um ou mais itens, mas, ainda assim, é importante se aplicar a convenção combinada do começo ao fim do projeto. Num próximo projeto , caso toda a equipe fique de acordo, pode-se aperfeiçoar a convenção para o seu contexto, baseando-se também nas próprias lições aprendidas dos projetos passados.
Recomendo se começar com alguma convenção madura como a da Zend ou da Sun.

Controle de Versão

Hoje em dia, é praticamente impossível se trabalhar com programação sem se utilizar uma ferramenta de controle de versão. A qualidade das informações que esse tipo de ferramenta traz para o controle das alterações e versões do seu sistema torna-se imprecindivel quando se começa a desenvolver projetos grandes, seja em equipe ou não.
Vantagens:
  • Controlar "o que", "quando", "por quem" e "por que" de cada alteração feita.
  • Comparar versões do sistema.
  • Voltar a uma versão do sistema.
  • Combinar alterações.
  • Ver o histórico de um arquivo ou pasta.
  • Interface com várias aplicações que montam diferentes tipos de relatórios a partir dos dados do servidor.
  • Interface com várias aplicações possibilitando o disparo de testes automáticos, criação / alteração de demandas via mensagens de envio.
Dentre os mais famosos do momento temos o Subversion e o Mercurial.

Documentação automática

Documentar todos os métodos, classes e pacotes para possibilitar uma melhor manutenção é requisito mínimo para um bom projeto. Quando se documenta utilizando algum padrão de de documentação estilo javadoc, algumas ferramentas, entre elas o doxygen, possibilita a saída de relatórios muito ricos a partir da documentação criada. Um exemplo disto pode ser visto aqui, onde a documentação do projeto foi criada automaticamente a partir dos comentários existentes.

Teste Unitário

Apesar de ser algo essencial para a criação de softwares de qualidade, os testes unitários ainda são difíceis de serem encontrados em aplicações comerciais. Esses testes automáticos, também conhecidos como teste de fumaça quando aplicados a contextos pequenos, são similares aos casos de teste só que feitos automaticamente desde de contextos pequenos, como pequenos métodos que alteram uma string, até em contextos complexos, onde se pode testar todo um fluxo de funcionalidades, trabalhando em conjunto, num projeto.
Ao escrever esses testes automáticos existem ferramentas que podem executa todos eles em seu sistema, informar quais testes falharam, quais classes, métodos e linhas não foram executados, o que lhe informa que ou faltam testes no seu sistema ou existe código excedente.
Essas validações automáticas podem ser feitas a cada atualização do seu controle de versão, o que possibilita se saber de novos erros existentes no sistema assim que eles surgem, tornando seu sistema mais confiável e a manutenção facilitada.
As ferramentas mais conhecidas de teste unitário sao o JUnit e o PHPUnit e um exemplo de saída do PHPUnit pode ser vista aqui.

Padrões da Web

Conhecer os padrões da W3C deveria ser o ponto de partida de qualquer programador web. Infelizmente, isso não é nem de longe a regra. Eu, quando dou aula de programação, sempre me dedico a falar sobre o que é um XML, Schema e DTD, ensino os meus alunos a desenvolverem XHTML e falo um pouco sobre as validações da W3C. Para auxiliar no aperfeiçoamento das suas páginas desenvolvidas eu recomendo mais um plugin do firefox chamado Web Developer além do Relaxed e o Html Validator que infelizmente ainda não funciona no linux.
Para quem está realmente começando, um dos melhores sites em português é o Tableless.com.br. O w3schools é outra excelente referencia em relação ao assunto.

Prototipagem

Prototipo, WireFrame, Rascunho de Tela, etc. Todos esses nomes são para desenhos das telas que devem guiar os designers na criação do desenho final da tela. Esse rascunho será comparado com o fluxo de teste planejado e deve ser apresentado ao cliente antes de se iniciar a construção real do sistema. É natural que, com o desenvolvimento do sistema, alterações sejam feitas nas telas. Mas, ainda assim, o protótipo auxilia muito a reduzir a quantidade futura de alterações já dando um ponto de partida confiável para o desenvolvimento do sistema.
Algumas empresas fazem protótipo de tela em ferramentas não especializadas como powerpoint ou até mesmo no photoshop ou gimp mas existem muitas ferramentas feitas especialmente com este propósito. Dentre as gratuitas, a que eu mais recomendo é o Pencil Project, um plugin para firefox muito bom para prototipagem.

Modelagem de banco

Saber modelar bem um banco de dados e compreender um modelo é essencial para um bom sistema. Ao meu ver, a ferramenta gratuita mais popular é o DBDesigner4, mas, eu não a considero a melhor opção. Algumas outras opções, ainda gratuitas, que eu recomendo são o JDeveloper e o Power Architect.

Mas, é essencial estudar como fazer uma boa modelagem de banco de dados, não se restrigindo apenas às ferramentas. É importante estudar como deve ser uma boa modelagem de banco de dados, e existem muitos bons livros gratuitos para leitura como o Data Modeling Fundamentals

Modelagem de Processos de Negócio - BPM

Uma das ( muitas ) maneiras de se modelar um processo antes de implementa-lo é pelo bpm. Uma representação gráfica do negócio a ser implementado utilizando uma notação padrão. Quanto a ferramentas gratuitas para geração de bpms, recomendo o BizAgi apesar de não funciona no linux ( sem wine ou vbox ). Estou testando recentemente algumas aplicações novas, dentre elas o BonitaSoft, mas, ainda estou as estudando.

UML

Muito se fala de UML e existem muitos livros sobre o assunto, principalmente os livros de Engenharia de Software como o Sommerville. Não querendo entrar na discussão ideológica do assunto, um bom programador precisa conhecer os diagramas UML.

Dentre as ferramentas para criação de diagramas UML gratuitas e que rodam tanto no linux quando no windows, a que, até o momento, tem me mostrado os melhores resultados é o JDeveloper. Ferramenta muito boa para geração dos casos de uso, diagramas de classes, com sincronia codigo x diagrama, diagrama de negócio ( uma versão do UML do BPM ), etc. Não é, obviamente, o visual paradigm, mas, dentre as restrições apresentadas, me tem sido muito útil.

O diagrama no JDeveloper que para mim mostrou as maiores limitações foi o de sequencia. Mesmo após se informar que um "LifeTime" é um objeto de uma classe já existente ele não procura pelos métodos, trava as vezes sem nenhum motivo aparente, etc. Mas, como os projetos que eu tenho trabalhado recentemente são todos PHP, eu peguei o rascunho de código Java gerado pelo JDeveloper, converti em classes PHP e usei o CodeToDiagram conseguindo resultados muito legais.

Tenho também analisado outras opções como o Jude e StarUml mas confesso com pouca dedicação pela falta de tempo. Caso alguma dessas ferramentas venha a me encantar, farei um post novo a respeito.

Espero que essa descrição geral possa vir a ajudar a todos. Criticas e sujestões fiquem a vontade. Um grande abraço.

quarta-feira, 20 de maio de 2009

Reflections Entendidas e Estendidas

PHP Reflections são recursos muito interessante que se você ainda não conhece precisa conhecer agora. O princípio é basicamente o seguinte: Você pode executar métodos que lhe trazem detalhamento sobre o funcionamento de arquivos / classes / funções que existam no seu código em execução.


/**
* Apenas um pequeno exemplo
*
/

class exemplo
{}

$objReflection = new ReflectionClass( $strClass );
print $objReflection->getClassName();
print $objReflection->getDocComment
();



Utilizando reflections é possível, por exemplo, se listar os parametros de um método ou função, podendo obter o nome, tipo e valor padrão, se houver, se cada um deles. Esses recursos podem ser extremamente úteis para possibilitar um debuger melhor, como se pode ver na ferramenta de backtrace do Renan de Lima.

Mas, as vezes, para poder se fazer funcionalidades realmente avançadas pode-se precisar d estender a classe das notações. Isso pode se tornar algo um tanto trabalhoso de se fazer tendo em vista as referencias cruzadas.

Por exemplo:


class teste{

}


class novaReflection extends ReflectionClass{}
$objNovo =
new novaReflection( "teste" );


if ( $objNovo->getMethod( 'vai' )->getDeclaringClass() instanceofnovaReflection )

{

print "bem que você gostaria.";
}

else

{
print "problema dificil de resolver";
}


Ao se tentar pegar a classe de reflexão da classe que contém o método ‘vai’ o php não retornou a classe estendida ‘novaReflection’ mas a classe ReflectionClass original. A referencia Elemento->getFilho()->getPai() falha não retornando um objeto da mesma classe do Elemento.

Essa situação problema se replica em todas as classes do Reflection. E, na idéia de se facilitar a criação de estensões para classes de reflection eu lhes ofereço o pacote de ExtendedReflection. Esse pacote de classes são estensões das classes do Reflection, mas com métodos chaves que, ao serem sobrepostos tornam fácil o processo de criação de estensões das classes dos reflections.

Ficou confuso? Então vamos a um exemplo:
Ao invés de se estender diretamente a classe do ReflectionClass você irá estender a classe ExtendedReflectionClass e deverá sobrescrever os seguintes métodos:

  • createExtendedReflectionClass
  • createExtendedReflectionProperty
  • createExtendedReflectionMethod

Estes métodos servem para converter um objeto do pacote Reflection nativo em uma objeto do pacote estendido de Reflection, tornando os links internos válidos.

Um pacote estendido para demonstrar isso é o Code Reflection que estende o pacote ExtendedReflection adicionando métodos novos nas classes de reflection o que torna possível se obter os códigos php dos objetos refletidos.

note em especial os seguintes métodos:

/**
* Make the recursive calls and indirectly call return the extended reflection object and not
* a native reflection property.
*
* @see ExtendedReflectionClass::createExtendedReflectionProperty( ReflectionProperty )
* @param ReflectionProperty $objOriginalReflectionClass
* @return CodeReflectionProperty
*/

protecte function createExtendedReflectionProperty ( ReflectionProperty $objOriginalReflectionProperty )
{
return new CodeReflectionProperty( $this->getName() , $objOriginalReflectionProperty->getName() );
}

/**
* Make the recursive calls and indirectly call return the extended reflection object and not
* a native reflection method.
*
* @see ExtendedReflectionClass::createExtendedReflectionMethod( ReflectionMethod )
* @param ReflectionMethod $objOriginalReflectionClass
* @return CodeReflectionMethod
*/

protected function createExtendedReflectionMethod ( ReflectionMethod $objOriginalReflectionMethod )
{
return new CodeReflectionMethod ( $this->getName() , $objOriginalReflectionMethod->getName() );
}


Todas as referencias a objetos do pacote do reflection externos passaram antes, necessariamente, por esses métodos, que convertem o objeto reflection nativo no objeto reflection estendido.


Deste modo você tem a flexibilidade de estender uma classe com a riqueza dos recursos de uma classe de reflexão sem complicação, podendo gerar produtos bem legais como estamos fazendo no CodeToDiagram

terça-feira, 7 de abril de 2009

Code To Diagram

Gerando Diagramas de Sequência a Partir de Uma Execução PHP

Conforme prometido, após muito trabalho, estou publicando de fato o projeto CodeToDiagram de geração de diagramas. Para prover esse projeto estou utilizando o www.assembla.com um site para administração de projetos muito legal. A ideia desse projeto é possibilitar a geração de diagramas de sequência a partir de execuções de código PHP. A descrição no site do projeto está em inglês. Mas aqui eu mando uma introdução a respeito do mesmo em português.

O diagrama de sequência talvez seja a mais intuitiva maneira de se compreender uma execução.

O seu uso na fase de pré-projeto é bastante comum para descrever o funcionamento esperado de um software. A partir dele podem-se desenvolver diagramas de teste, como também conferir se todas as funcionalidades descritas foram detalhadas em demais fases do planejamento tal qual o caso de uso, por exemplo.

Ao se descrever funcionalidades mais próximas das linhas de código, tal qual a interação de objetos através de métodos, se consegue planejar como serão as classes e as interfaces do sistema. Mas, a medida que o desenvolvimento avança, seja por falhas na análise ou por uma mudança nos requisitos, os diagramas vão se distanciando da realidade, perdendo o caráter descritivo e ganhando uma característica de legado.

Além disto, se solicitar a um analista que exista um diagrama de sequência de todos os testes do projeto seria um gasto enorme de tempo tanto na criação quanto na manutenção desses diagramas, tendo em vista que a mudança do nome de um método ou de um atributo num método alteraria todos os diagramas que envolvem este elemento.

A solução aqui proposta e implementada é a geração de diagramas de seqüência a partir de execuções de código PHP. Uma execução ou o trecho da execução é monitorado por classes de instrumentação de código que geram a partir das informações recebidas um diagrama daquela execução. Esse diagrama pode ser visto como HTML, salvo como HTML e em breve salvo como XML e futuramente exportado como imagem JPEG.

Todo este processo deve ser simples o suficiente para ser utilizado bastando uma simples chamada, mas também flexível para atender a todos os casos especiais. A idéia é gerar o diagrama de uma execução interferindo o mínimo possível no código-fonte o qual ela irá executar.

Em poucas palavras:

Este código:

<?php

require_once( '../../public/codetodiagram.php' );
CodeToDiagram::getInstance()->start();

require_once(
'Wolf.class.php' );
require_once(
'Pig.class.php' );
require_once(
'House.class.php' );
require_once(
'History.class.php' );

new
History();
?>

Resulta nesse diagrama


















Um componente menor que foi gerado no processo da geração desta solução mas que pode ser utilizado individualmente é o gerador de diagramas de sequência a partir de um XML. Esta aplicação pode ser testada aqui onde um XML de exemplo já foi informado mas pode ser alterado a vontade.

A meta desta aplicação é a geração de um diagrama de sequência para cada método das classes de teste sendo cada um destes diagramas salvo com um nome de fácil localização. Algumas futuras funcionalidades devem ser acrescidas como mostrar a linha de código das chamadas, melhorar a explanação dos parâmetros, dentre outras.

Se você quiser utilizar esta solução em sua última versão, basta baixar do nosso SVN. Mas para apenas navegar no código ele é melhor legível aqui. Para testar a aplicação em funcionamento nos exemplos disponíveis clique aqui

Por hora o projeto ainda não funciona completamente no Internet Explorer. Mas ainda assim, o gerador já torna a vida mais simples na manutenção desse tipo de diagramas. Nós agradeceremos a qualquer um que tiver a paciencia e o desejo de fazer as mudanças no CSS necessárias para fazer o sistema funcionar no Internet Explorer.

Lembrando ainda, que a aplicação completa da UML 2.0 ainda está em desenvolvimento. Qualquer um que tiver interesse em trabalhar nesse campo é bem vindo ao time. Se você tiver uma correção ou uma extensão ao projeto que deseje nos enviar, será também muito bem recebida. E lembre-se, este é um software livre, e como tal, não dispõe de nenhuma garantia. Use por sua conta e risco. Ainda sendo um projeto em desenvolvimento sem nenhuma versão estável, erros podem ser encontrados. Caso os encontre por favor nos avise, teremos muito prazer em corrigi-los assim que possível.

Clique aqui para saber como utilizar essa solução.

Clique aqui para saber mais sobre diagramas de sequência.

Clique aqui e aqui para saber mais sobre Instrumentação de Código.

Clique aqui para conhecer a equipe de desenvolvimento responsável por este produto.

terça-feira, 17 de fevereiro de 2009

Gerador de Diagramas de Seqüência a partir de XMLs



Recentemente, precisei gerar diagramas de seqüência automaticamente. Comecei a procurar geradores de diagramas de seqüência e de fato eu encontrei várias ferramentas que geram diagramas a partir de XMI. Dentre elas algumas que valem a pena serem citadas são: a Xmi2Svg e o Net Beans Uml Diagrams . O problema de todas as soluções apresentadas é que as entradas eram em XMI e, o pior um XMI extremamente específico, problema comum no XMI, o que o faz sair do próprio propósito original. O código do XMI é muito esquisito, na falta de uma palavra melhor. Um trecho de um diagrama de seqüência simples do Net Beans pode ajudar a demonstrar o que eu quero dizer:
</UML:GraphEdge.waypoints>
<UML:GraphElement.semanticModel>
<UML:Uml2SemanticModelBridge presentation="Message" xmi.id="xmi_id">
<UML:Uml2SemanticModelBridge.element>
<UML:Message xmi.idref="DCE.1F882CFB-E059-6341-7A50-2D9D63879AEB"/>
</UML:Uml2SemanticModelBridge.element>

Após muito procurar, eu resolvi partir para a filosofia "faça você mesmo". Então, após alguns dias de esforço, eu apresento a vocês o meu Gerador de Diagramas de Seqüência . Como é um código PHP, este está num link externo do meu ainda inutilizado dominio pessoal.

Neste conversor o XML de entrada é muito mais simples que o XMI, focado apenas no diagrama de seqüência , sendo facilmente compreensível. Conforme exemplo:

<sequence>
<actors>
<actor id="1" type="user">me:people</actor>
<actor id="2" type="system">you:people</actor>
</actors>
<messages>
<message type="call" from="1" to="2" text="hi"/>
<message type="return" from="2" to="1" text="hello"/>
</messages>
</sequence>


Gere então seu próprio XML, divirta-se no exemplo dos "Três Porquinhos" e me diga o que achou. Esse gerador de diagramas faz parte de um plano muito maior que eu ainda não revelarei para os senhores. Mas saibam que no fim tudo será revelado!!!

segunda-feira, 12 de janeiro de 2009

Métodos Mágicos no Javascript.

Uma das coisas que eu mais gosto em php é a simplicidade junto com a riqueza de recursos. Um recurso muito conhecido, de uso simples mas que é extremamente interessante são os métodos mágicos. Uma vez eu estava me perguntando se existiria algo parecido com isto em javascript e a resposta é: "depende". Na verdade esse recurso está disponível no firefox e foi nele que eu achei a documentação a respeito.

Tudo isso e muito mais pode ser visto neste link do site da Mozilla Firefox.

Não sei se ele chega a funcionar no Safari ou no Google Chrome, eu particularmente duvido devido ao fato de não ser padrão, mas CERTAMENTE não funciona no Internet Explorer.

Ainda assim, quando se deseja depurar páginas javascript no Firefox, fazer esses métodos gerarem uma exceção já ajuda bastante a se encontrar o erro, pode-se ainda fazer as "classes" de seu framework todas extenderem de uma classe padrão que ao se tentar ler ou escrever qualquer atributo inexistente ou chamar um método inexistente gere uma exceção evitando, principalmente ao lidar com atributos, que valores "undefined" possam ser lidos ou que novos atributos "fantasmas" possam aparecer nos seus objetos.

Infelizmente não podemos utilizar isso como recurso de framework tendo em vista a restrição de uso, salvo alguem tenha alguma ideia genial para fazer isso funcionar em qualquer navegador. Não vale citar o projeto Tamarin!! Alguma idéia ?