<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hlegius &#187; Desenvolvimento</title>
	<atom:link href="http://programe.me/category/desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://programe.me</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Wed, 23 Nov 2011 17:26:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Git, Git, Git&#8230;</title>
		<link>http://programe.me/git-git-git/</link>
		<comments>http://programe.me/git-git-git/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 15:30:33 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=713</guid>
		<description><![CDATA[Uma buzz word bem pronunciada no meio de desenvolvimento de software atualmente, principalmente pelos Rubistas, o Git é um VCS descentralizado e tudo mais o que falam por aí. Ao invés desse marketing todo em cima do software, é melhor explicar aqui os motivos que fazem eu utilizá-lo atualmente. Git é descentralizado. Sim, isto é [...]]]></description>
			<content:encoded><![CDATA[<p>Uma buzz word bem pronunciada no meio de desenvolvimento de software atualmente, principalmente pelos Rubistas, o Git é um <a href="http://en.wikipedia.org/wiki/Revision_control" target="_blank">VCS</a> descentralizado e <a href="http://en.wikipedia.org/wiki/Git_(software)" target="_blank">tudo mais o que falam por aí</a>.</p>
<p>Ao invés desse marketing todo em cima do software, é melhor explicar aqui os motivos que fazem eu utilizá-lo atualmente.</p>
<p><strong>Git é descentralizado</strong>. Sim, isto é uma maravilha ! Sem delongas, permite que eu gerencie meus branches localmente, sem a necessidade <span style="text-decoration: line-through;">daquele role todo para</span> de criar um branch no servidor e depois fazer um checkout dele. Em miúdos, isso dá a agilidade necessária para eu parar o que estou fazendo atualmente para corrigir algum imprevisto, a.k.a, bug, em um branch separado voltando versões se necessário, fazer merge com meu branch principal e subir no servidor de homologação.</p>
<p><strong>Git comunica-se com vários repositórios remotos sem complicações.</strong></p>
<p>Eu, faço uns testes mirabolantes com meus códigos, logo, preciso comitar um mesmo código em servidores diferentes, inclusive em servidor SVN. Ora, isso é bem simples com os &#8220;remotes&#8221; do Git.</p>
<pre>$ git remote add &lt;remote_name&gt; &lt;url_address&gt;
$ git remote show</pre>
<p>Para mostrar as informações de um remote específico:</p>
<pre>$ git remote show &lt;nome_do_remote&gt;</pre>
<p>No SVN, consigo facilmente receber e mandar commits para o servidor.</p>
<pre>$ git svn rebase  #para receber do servidor svn os commits que você ainda não possui
$ git svn dcommit #para enviar os commits locais ao servidor</pre>
<p>Ou caso queira você criar o merge manualmente das revisões:</p>
<pre>$ git svn fetch
$ git merge remotes/git-svn</pre>
<p>Isto supondo que você está no branch master, claro.</p>
<p><strong>Git tem um &#8220;ponteiro&#8221; com índices e mais&#8230;</strong></p>
<p>Esse é o nome que dou aos stashes do Git. Quebra um galho imenso e muitas vezes acabo utilizando um stash ao branch. O Stash, salva em um &#8220;vetor&#8221; as modificações que estão no seu &#8220;stage&#8221; &#8211; em miúdos: arquivos já trackeados pelo Git e arquivos novos no stage - para uma memória temporária.</p>
<p>Seu uso é simples:</p>
<pre>$ git stash                       #salva os arquivos modificados dentro do stage.
$ git stash list                  #lista os stashes existentes em memória (Sim, armazena mais de um)
$ git stash pop  &lt;stash name&gt;     #recupera os arquivos do stash e apaga o stash.
$ git stash drop                  #limpa o stash sem recuperar os arquivos
$ git stash branch &lt;name&gt; &lt;stash&gt; #cria um branch &lt;name&gt; com o &lt;stash&gt;</pre>
<p><strong>Git tem Ctrl + Z</strong></p>
<p>Claro, afinal este é o propósito de qualquer VCS. Mas no Git a coisa é mais fácil voltar em qualquer ponto após quaisquer ações, digamos, não desejadas.</p>
<pre>$ git reflog</pre>
<p>Para aplicá-lo, basta pegar o nome que o reflog lhe dirá</p>
<pre>$ git checkout <em>&lt;hash&gt;</em></pre>
<p>Pode-se usar também, o<em> git merge</em>, a depender do que quer fazer.</p>
<p>A solução para um problema que eu penei até encontrar uma resposta: como ignorar alterações em arquivos que já estão sob o controle de versão do Git ?</p>
<p>Quer um exemplo ? O <em>databases.yml ; config.yml</em>; &#8230; A solução era bem simples:</p>
<pre>$ git update-index --assume-unchanged &lt;file&gt; #adiciona o arquivo na lista de índices ignorados
$ git update-index --assume-changed &lt;file&gt;   #volta o arquivo para o índice de arquivos à comitar.</pre>
<p>Para fechar, para aqueles que não desejam criar um <em>workspace</em> ao iniciar um repositório Git, deve-se criar um repositório do tipo <em>bare.</em></p>
<pre>$ git init --bare &lt;diretorio&gt;</pre>
<p>Isto é útil para você criar o repositório em sua VPS para salvar ou/e compartilhar  seus códigos remotamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/git-git-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Você assinou seu código hoje ?</title>
		<link>http://programe.me/voce-assinou-seu-codigo-hoje/</link>
		<comments>http://programe.me/voce-assinou-seu-codigo-hoje/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 10:42:37 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[entrevista]]></category>
		<category><![CDATA[opinião]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=674</guid>
		<description><![CDATA[Quem utiliza-se ou já utilizou da annotation @author no cabeçalho de seus códigos levanta a mão ! o/ Desde que comecei a programar no ínicio do segundo semestre de 2004, eu utilizo desse tal de arroba-aútor. Já vi algumas variantes dela, por exemplo: Há ainda aqueles que detalham no cabeçalho sua pog contribuição: Sinceramente eu [...]]]></description>
			<content:encoded><![CDATA[<p>Quem utiliza-se ou já utilizou da <em>annotation</em> @author no cabeçalho de seus códigos levanta a mão ! o/</p>
<div id="attachment_675" class="wp-caption aligncenter" style="width: 448px"><a href="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author.png"><img class="size-full wp-image-675" title="author" src="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author.png" alt="Annotation @author" width="438" height="121" /></a><p class="wp-caption-text">Annotation @author</p></div>
<p>Desde que comecei a programar no ínicio do segundo semestre de 2004, eu utilizo desse tal de <em>arroba-aútor.</em> Já vi algumas variantes dela, por exemplo:</p>
<div id="attachment_676" class="wp-caption aligncenter" style="width: 443px"><a href="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo.png"><img class="size-full wp-image-676" title="Annotation @author pastel" src="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo.png" alt="Annotation @author pastel" width="433" height="173" /></a><p class="wp-caption-text">Annotation @author Augusta edition</p></div>
<p>Há ainda aqueles que detalham no cabeçalho sua <span style="text-decoration: line-through;">pog</span> contribuição:</p>
<div id="attachment_677" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo2.png"><img class="size-medium wp-image-677" title="Blablabla no annotation" src="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo2-300x77.png" alt="Blablabla no annotation" width="300" height="77" /></a><p class="wp-caption-text">Blablabla no annotation (clique para ampliar - ou não)</p></div>
<p>Sinceramente eu nunca fui pesquisar se há uma convenção na utilização deste annotation. O fato é que meu uso com isto é descomplicado:</p>
<ul>
<li>Insiro meu nome em novos arquivos;</li>
<li>Adiciono meu nome abaixo do último se eu fiz alguma adição ao arquivo, ou;</li>
<li>Não adiciono quando faço pequenas modificações sem acrescentar algo de valor ao então domínio/objetivo/proposta do arquivo.</li>
</ul>
<p>Mas mesmo assim, sempre coloco no formato <strong>Nome completo &lt;email@provedor&gt;</strong></p>
<p>Porém, não pela primeira vez vejo um developer defendendo o não uso deste annotation. A última vez foi numa discussão &#8211; no bom sentido &#8211; entre <a href="http://twitter.com/sergioprado" target="_blank">@sergioprado</a> e <a href="http://twitter.com/lfamorim" target="_blank">@lfamorim</a>. Com isto, fui perguntar a eles &#8211; e alguns outros mais &#8211; a opinião pessoal em relação ao tal annotation. Confira:</p>
<p><strong>Eduardo Guerra</strong> &#8211; <a href="http://twitter.com/emguerra" target="_blank">@emguerra</a></p>
<blockquote><p>﻿Obviamente se o uso de @author nas classes for uma prática da equipe irei segui-la sem problemas, mas se a escolha for minha opto por não colocar. Esse tipo de marcação no meu ponto de vista atrapalha a propriedade coletiva do código por determinar explicitamente os autores da classe. No caso de erros na classe, sempre haverão dedos apontando o autor como culpado, mesmo se não foi ele quem introduziu o problema.</p>
<p>Como toda documentação não-executável, pode deixar de ser atualizado com a evolução de um projeto e muitas vezes o autor original não é mais quem mais contribuiu para a classe no seu estado atual. Adicionalmente, sou a favor de manter o código o mais limpo possível e esse tipo de coisa acaba deixando o código de todas as classes mais verboso.</p></blockquote>
<p><strong>Cainan Costa -<a href="http://twitter.com/sryche" target="_blank"> @</a></strong>﻿<a href="http://twitter.com/sryche" target="_blank">﻿sryche</a><strong> </strong>via Jabber</p>
<blockquote><p>[20:03:08] cainan.costa: não faz sentido, porque o VCS já mostra =P<br />
[20:03:16] cainan.costa: quem é o maluco que fez a parada<br />
[20:03:25] cainan.costa: aí tu usa um git blame<br />
[20:03:33] cainan.costa: e já sabe quem encher de porrada</p></blockquote>
<p><a href="http://lfamorim.com" target="_blank"><strong>Lucas Fernando Amorim</strong></a> &#8211; <a href="http://twitter.com/lfamorim" target="_blank">@lfamorim</a></p>
<blockquote><p>Hoje em dia a tag @author é tão obsoleta quanto respeitar um limite de colunas para seu código, mas ainda assim acho elegante e talvez até relevante.</p>
<p>Fica muito mais fácil para aqueles programadores que não usam a IDE XPTO verem o criador de determinado arquivo, método ou função sem ter que recorrer a um programa. É repetitivo você pode alegar, mas eu posso retrucar que a tarefa pode ser automatizada.</p>
<p>Eu aprecio muita essa tag, pois a partir dela posso usando minha humilde IDE identificar o criador de determinados códigos, antecipando os vícios do autor e me adaptando para a leitura. Tudo isso sem abrir a shell e digitar N^C comandos.</p>
<p>N = Familiaridade com o programa X de controle de versão.<br />
C = Commits anteriores.</p></blockquote>
<p><strong><a href="http://www.chrisb.com.br/" target="_blank">Christian Benseler </a></strong>- <a href="http://twitter.com/chrisbenseler" target="_blank">@chrisbenseler﻿﻿﻿</a></p>
<blockquote><p>﻿﻿Tenho uma visão que o negócio é &#8220;mais embaixo&#8221;. Antes de tentar assinar um script como seu, o desenvolvedor tem que se preocupar com outros assuntos mais importantes: é um projeto pessoal ou colaborativo? Está prestando serviços a alguém, outra empresa? Qual a política do seu cliente? Qual a versão do script? E qual o tipo de licensa que será adotada?<br />
Só assinar o script não vai fazer a menor diferença se não tiver essas informações. E não vai fazer nenhuma diferença se a comunidade não parar de copiar o script feito por A, retirar os author notes do script e redistribuir o script sem dar esses créditos e/ou sem levar em conta o tipo de licensa adotado.</p></blockquote>
<p><strong><a href="http://chester.blog.br" target="_blank">Carlos Duarte do Nascimento</a></strong> &#8211; <a href="http://twitter.com/chesterbr" target="_blank">@chesterbr</a></p>
<blockquote><p>Antes de mais nada, você se refere a qual linguagem? Em Java, @author pode significar tanto uma anotação em si (e aí depende do contexto), tal como:</p>
<p>@author(&#8220;chester&#8221;)<br />
public foo(int bar) {<br />
&#8230;</p>
<p>quanto (o que eu imagino que você queira dizer) a anotação feita em um doclet, i.e.:</p>
<pre>/**
 * Um elemento coberto por JavaDoc.
 * @author chester
 */
public foo(int bar) {
...</pre>
<p>No segundo caso, eu gosto de @author devido à facilidade em lidar com a autoria coletiva: ela permite anotar classes inteiras ou métodos/atributos particulares; você pode colocar múltiplos autores, e<br />
o Eclipse pode ser facilmente configurado para adicioná-la automaticamente. No PHP, se me recordo, é possível usar algo<br />
equivalente (phpdoc) em cabeçalhos de código, mas não sei se é válido colocar em métodos/atributos, ou se é possível ter múltiplas declarações no mesmo escopo.</p>
<p>Em qualquer caso, vale notar que sistemas de controle de versão como svn e git são mais eficientes para descobrir quem efetivamente contribuiu com uma classe/método do que esse tipo de tag. Além disso, elas não são suficientes para notas de copyright (ou seja, teriam que ser replicadas apropriadamente para o correto licenciamento do código, independente da licença utlizada), o que limita de fato sua utilidade prática.</p></blockquote>
<p><a href="http://sergioprado.org" target="_blank"><strong>Sérgio Prado</strong></a> &#8211; <a href="http://twitter.com/sergioprado" target="_blank">@sergioprado</a></p>
<blockquote><p>﻿Há muito tempo atrás, as ferramentas disponíveis aos programadores eram escassas e limitadas.</p>
<p>&lt;oldschool&gt;Já programei em Assembly com um DOS rodando num x86 e monitor CGA de 80 colunas x 25 linhas &lt;/oldschool&gt;</p>
<p>Nesta época, ferramentas de controle de versão não eram tão comuns, nem monitores de 21 polegadas. Foi então que surgiram alguns paradigmas. Eram consideradas boas práticas de programação usar no máximo 80 colunas por linha de código (limitação causada pelos monitores da época), e incluir informações no cabeçalho do arquivo como @version, @author, @date, @changes etc.</p>
<p>O problema é que para muitas pessoas estes paradigmas perduram até hoje, por herança, por gosto (ou mazoquismo mesmo). Qualquer ferramenta decente de controle de versão pode te trazer, desde sua criação, todo o histórico de alteração de um arquivo. Além de ser mais seguro e confiável. Se eu usar no código-fonte &#8220;@author pica-pau&#8221;, grande parte das pessoas não irá perceber, porque ninguem lê o cabeçalho do arquivo. Também não existe garantia de que o nome documentado no código-fonte é realmente o do desenvolvedor. Já com uma ferramenta de controle de versão esta garantia existe.</p>
<p>Eu mesmo usava @author nos cabeçalhos uns tempos atrás, mas parei de usar depois que comecei a criticar alguns paradigmas que tinha. É tudo questão de delegar para ferramentas o que pode ser automatizado e buscar novas soluções para os mesmos problemas.</p></blockquote>
<p><strong><a href="http://fabiolnm.blogspot.com" target="_blank">Fábio Miranda</a></strong> &#8211; <a href="http://twitter.com/fabiolnm" target="_blank">@fabiolnm</a></p>
<blockquote><p>﻿Não uso por pura falta de hábito &#8211; nunca trabalhei em um projeto onde essa prática fosse adotada.<br />
Mas acho interessante, não só o autor, como o email / github tb.</p>
<p>Pode ocorrer de ser necessário dar manutenção em determinado código cuja compreensão não seja trivial, e a possibilidade de contactar o autor, mesmo que remota, deve ser considerada e viabilizada.<br />
Não vejo razão para ser contra.</p></blockquote>
<p>E pra finalizar, os comentários fundamentados de <a href="http://hannelita.wordpress.com" target="_blank">Hanneli Carolina Tavante</a> <a href="http://twitter.com/hannelita" target="_blank">@hannelita</a> &#8211; sobre o uso de @author e muito mais:</p>
<blockquote><p>Bom, vou dar minha opinião sobre comentários no código antes de qualquer coisa&#8230;. Também utilizarei algumas metáforas e exemplos reais.</p>
<p>Eu já trabalhei com códigos de sistemas legados &#8211; Mainframes e sistemas bem antigos &#8211; , envolvendo C e Assembly. Vou contar uma coisa &#8211; quando abríamos um código e víamos infinitas linhas de comentário, já sabíamos que vinha coisa ruim pela frente. Tudo bem para aquele tipo de código sempre achei necessário comentar &#8211; Há algumas subrotinas do inferno que precisam de explicação. E o cara que fez isso tem idade pra ser meu pai, já faleceu ou se aposentou. Portanto, códigos assim são &#8220;legíveis&#8221; graças aos comentários deixados para trás. Já peguei código em Assembly sem comentários. E fiquei quase 10 dias só pra entender por cima o que o programa fazia.</p>
<p>Mas atualmente estamos em uma época onde encontramos linguagens extremamente expressivas, como Ruby e Python. E pra ajudar ainda tem uns framewroks tipo Sinatra, incorporando DSLs. Ou seja, hoje é possível escrever códigos que HUMANOS são capazes de ler. (humanos comuns, quis dizer hehehe). Se você escreve códigos em Ruby que humanos não entendem, então sinto muito, meu amigo, vá ler o Clean Code ou aprender a programar de forma limpa. Aliás, práticas de TDD ou BDD, por exemplo, influenciam e praticamente geram um código limpo e legível dadas as etapas que sugerem na construção da aplicação. Por exemplo, o famoso &#8220;Vermelho, verde, refatorar&#8221; do TDD &#8211; O refatorar ocasiona um cógido extremamente mais compreensivo. Construído tal código sólido e bem estruturado, eu questiono &#8211; comentários para que? Eles perdem o sentido. Por exemplo, você se depara com a seguinte expressão em Ruby:</p>
<pre> unless valor == 0
  puts "Valor diferente de zero!"
 end</pre>
<p>Bem expressivo, certo? Pra que um comentário então? Uma das coisas que me irrita um pouco é encontrar códigos assim:</p>
<pre>public class Pessoa {
  private String nome; //define o nome da pessoa
  private int idade; // define idade da pessoa
}</pre>
<p>Ou pior, bem pior que isso:</p>
<pre>public class Pessoa {
  private String a; //define o nome da pessoa
}</pre>
<p>Ambos os casos eu considero inapropriados. O primeiro por gerer redundância &#8211; é ÓBVIO que o atributo &#8220;nome&#8221; faz menção ao nome da entidade pessoa! O segundo exemplo nos remete a alguém que não fez uso de bom senso de orientaćão a objetos para definir o nome do atributo. O comentário era necessário porque não houve refatoração e uso de um nom esclarecedor ao campo. De qualquer forma, isso é incorreto no meu ponto de vista.</p>
<p>Então quando usar comentários? Costumo usar comentários quando, por exemplo, utilizei algum recurso pouco conhecido da linguagem. Por exemplo, o uso de Fibers no Ruby &#8211; poucas pessoas sabem o que são Fibers; coloquei um comentário no meu código extremamente sucinto explicando o que era e onde achar mais informações. Ou se você utilizar alguma magia-negra no código, embebida por metaprogramação, por exemplo, acho que é bom deixar um comentário sucinto do que aquilo quis dizer. Esse tipo de comentário ajuda programadores juniors a adquirir experiência e ajuda até memso os seniors a captar a idéia geral de um método/bloco que possui lógica complexa.<br />
E há alguns casos que comentários podem ajudar a leitura do código fluir e ficar mais agradável. Pra Java, por exemplo, existe uma API &#8211; GAG =&gt; <a href="http://code.google.com/p/gag/" target="_blank">http://code.google.com/p/gag/</a> &#8211; Google Annotations Gallery, da qual já fui colaboradora. Essas anotações dão emoćão ao código; de vez em quando acho interessante utilziar algumas delas; tornam o coódigo mais expressivo. Novamente, acho que se deve usar sem abusos =)</p>
<p>Sobre o uso do <strong>@author</strong> &#8211; Aí já acho que é uma cosia meio pessoal. Eu não coloco. Saber que sou colaboradora/commiter do projeto já está bom pra mim. A ligaćão entre eu e o código fonte vai muito mais além que um @author. Claro, tem o lado bom de se colocar; todos que tiverem o fonte saberão o responsável por aquela ciração, e poderão parabenizá-lo, encontrá-lo no Twitter ou no Facebook e coisas do gênero. Ou poderão xingar sua mãe com vontade. Mas acredito que há outras formas de se descobrir e pedir ajuda sobre algum fonte que não são através do @author.</p>
<p>Bom, essa é minha visão geral da coisa! =D</p></blockquote>
<p>E aí, é contra ou a favor do @author ?</p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/voce-assinou-seu-codigo-hoje/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Refatore cedo, refatore regularmente.</title>
		<link>http://programe.me/refatore-cedo-refatore-regularmente/</link>
		<comments>http://programe.me/refatore-cedo-refatore-regularmente/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 18:58:22 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=670</guid>
		<description><![CDATA[Dica de número 47 do livro The Pragmatic Programmer, de Andrew Hunt e David Thomas, esta é uma das dicas mais fáceis de explicar e uma das mais difíceis de ser seguida. Mas, perché ? Simples ! O que significa refatorar ? Essa palavra que está na roda de conversa dos developers atualmente nem sempre [...]]]></description>
			<content:encoded><![CDATA[<p>Dica de número 47 do livro <a href="http://pragprog.com/titles/tpp/the-pragmatic-programmer" target="_blank">The Pragmatic Programmer</a>, de Andrew Hunt e David Thomas, esta é uma das dicas mais fáceis de explicar e uma das mais difíceis de ser seguida.</p>
<p>Mas<em>, perché </em>?<em><br />
</em>Simples ! O que significa refatorar ?</p>
<p>Essa palavra que está na roda de conversa dos developers atualmente nem sempre é utilizada com sua real definição. Pare para pensar na última vez em que você refatorou algo.<em> </em>Responda a si mesmo as perguntas:</p>
<ul>
<li>Qual o objetivo do <em>refactoring</em> ?</li>
<li>Quantas coisas (pontos de função, pacotes, <em>formas (?)</em>) foram alteradas ?</li>
<li>Após, o que mudou ?</li>
<li>Por quê necessitou refatorar ?</li>
</ul>
<p><strong>1. Qual o objetivo do refactoring ?</strong><br />
Fazer valer os princípios <span style="text-decoration: line-through;">trazidos do alto da montanha</span> descritos por developers como <a href="http://twitter.com/#!/unclebobmartin" target="_blank">Uncle Bob</a> e <a href="http://www.pmg.csail.mit.edu/~liskov/" target="_blank">Barbara Liskov</a>.<br />
Em outras palavras: não repetir a mesma coisa duas vezes; ser coeso; ser claro e objetivo; cada &#8220;coisa&#8221; precisa ter sua responsabilidade e esta deverá ser única; e <a href="http://domaindrivendesign.org/node/132" target="_blank">etc</a>, <a href="http://www.objectmentor.com/resources/articles/ocp.pdf" target="_blank">etc</a> e <a href="http://www.objectmentor.com/resources/articles/isp.pdf" target="_blank">etcetera</a>.</p>
<p><strong>2. Quantas coisas (pontos de função, pacotes, formas (?)) foram alteradas ?</strong><br />
Uma e somente uma. Se você resolveu mudar uma funcionabilidade e junto adicionou uma coisa por menor que mínima, você aumentou a probabilidade de dar tudo errado. A dica aqui é: <strong>não é possível assoviar e chupar cana ao mesmo tempo.</strong> <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>3. Após, o que mudou ?</strong><br />
Nada. Você não tinha como objetivo mudar um comportamento, apenas melhorar algo que já existia. Se fez um refactoring por causa de um bug, então você não refatorou, mas sim, inseriu um ou mais novos bugs. Leia o item 2 novamente se ficou com dúvidas.</p>
<p><strong>4.  Por quê necessitou refatorar ?</strong><br />
Vários motivos podem levar você a isto, mas a finalidade sempre acaba recaíndo sobre: melhorar o processo, a atividade ou relacionamento entre eles.</p>
<p><strong>Processos, atividades e relacionamentos.</strong></p>
<p>Repare que eu evitei falar de código diretamente. Isso pois eu vejo a refatoração algo possível para qualquer um em qualquer área. Tente aplicar os 4 itens acima em sua área. Se for um gestor, veja a refatoração como evolução e adequação dos processos existentes; No item 2 eu falei sobre <em>formas(?) </em>justamente com este propósito. Refatore a forma como você faz algo.</p>
<p>Nós da área Web da Vex, mantemos dentro do repositório dos projetos os arquivos SQL que geramos ao decorrer de cada alteração/adição feita aos projetos. Em meados do primeiro semestre de 2009, os arquivos .sql eram salvos da seguinte forma:</p>
<pre>/data/projetoXPTO/moduloABC/umNomeDescritivo.sql</pre>
<p>O <em>umNomeDescritivo.sql</em> parece algo legal. Vamos fazer um teste de mesa com isto:</p>
<pre>/data/erp/relatoriosFinanceiros/engineDeGraficos.sql</pre>
<p>Woow! Funciona perfeito. Tudo referente à engine de gráficos ficará neste arquivo .sql e <em>done deal</em>.</p>
<p>Com o tempo, aquilo ficou impossível de controlar pois a cada nova atualização, os arquivos ficavam maiores e o pior: quando o deploy da aplicação era realizado, como saber exatamente o que atualizar no banco de dados de produção ?</p>
<p>A partir deste problema, uma refatoração na forma de salvar arquivos SQL fora realizada. O novo modelo sugeria o padrão:</p>
<pre>/data/projetoXPTO/moduloABC/YYYYMMDD_umNomeDescritivo.sql</pre>
<p>Legal, problema resolvido ! Vamos ao teste de mesa:</p>
<pre>/data/erp/relatoriosFinanceiros/20100301_engineDeGraficos.sql</pre>
<p>A primeira vista, tudo perfeito. Contudo, nossos softwares são feitos com base em releases e acredite, temos muito código a cada novo release, gerando assim <strong>muito</strong> SQL para atualização. Processos manuais ou automatizados tornaram-se inviáveis pois a pergunta que ecoava na sala era:</p>
<blockquote><p>Quais foram as datas dos Release 1.2.2 e Release 1.2.3 do software de autenticação mesmo ?</p></blockquote>
<p>Pois é. E agora, José ? A partir disso eu pensei um bocado e resolvi dar palpite no processo. Porque não armazenar por release ?</p>
<pre>/data/release-1.2.3/projetoXPTO/modulo_umNomeDescritivo.sql</pre>
<p>Pronto. Agora consigo fazer uma análise do que mudou por versão. Essa refatoração no processo de armazenamento dos arquivos SQL mudou a forma como os arquivos são salvos e só.</p>
<p>Refatore sempre que puder. Mude e melhore aquilo que funciona, mas que não está na sua melhor forma. Tenha em mente que deixar algo que pode ser melhorado para trás, poderá custar-lhe caro amanhã. Porém, eu entendo que só há refatoração quando o objeto alvo está <strong>finalizado e funcionando</strong>. Antes disso o nome ao meu ver é implementação.</p>
<p>Keep refactoring <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left;"><small><em>Artigo originalmente postado por mim no até então blog Ready to Sail, hoje, o <a href="http://readytosail.vexcorp.com">planet da Vex</a>.</em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/refatore-cedo-refatore-regularmente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>O poliglotismo no desenvolvimento pseudomoderno</title>
		<link>http://programe.me/o-poliglotismo-no-desenvolvimento-pseudomoderno/</link>
		<comments>http://programe.me/o-poliglotismo-no-desenvolvimento-pseudomoderno/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 00:04:51 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvimento]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=666</guid>
		<description><![CDATA[No ínicio, quando &#8220;softwares&#8221; disponíveis através do browser não passavam de sites pessoais munidos com ingênuos formulários para contato, quem fosse capaz de entender C ou Perl rodando em CGI era rei. Com a evolução de hardware, servidores, linguagens de programação, browsers e etc., aquelas linguagens em CGI ganharam novas utilidades, cada vez agregando mais [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">No ínicio, quando <em>&#8220;softwares&#8221;</em> disponíveis através do browser não passavam de sites pessoais munidos com ingênuos formulários para contato, quem fosse capaz de <em>entender</em> C ou Perl rodando em <acronym title="Common Gateway Interface">CGI</acronym> era rei. Com a evolução de hardware, servidores, linguagens de programação, browsers e etc., aquelas linguagens em CGI ganharam novas utilidades, cada vez agregando mais itens às ferramentas produzidas.</p>
<p style="text-align: left;">A coisa toda deslanchou quando CRMs e ERPs começaram a ganhar versões web, direcionando-se para um modelo centralizado, eliminando a necessidade daquelas instalações em clientes, controle das versões, módulos e <span style="text-decoration: line-through;">todo </span><span style="text-decoration: line-through;">aquele inferno</span> toda aquela via sacra que é controlar isto.</p>
<p style="text-align: left;">Os softwares web evoluíram, mas ainda precisavam do bendito refresh a cada ação. Surge então, a brilhante idéia baseada em uma API Microsoft<em>iana </em>esquecida ao léu, concebida ainda na década de 90, onde na ocasião os desenvolvedores a chamaram de XMLHttpRequest e tinha como objetivo iteração entre Outlook e Internet Explorer, provendo acesso ao Outlook Web Access. Ah sim, isso é conhecido pelos <em>stakeholders</em> como Ajax.</p>
<p style="text-align: left;">Com o advento desse tal Ajax, as telas baseadas em funcionabilidades puderam evoluir para telas baseadas em eventos &#8211; o que pode ser conversa para outro post <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8211; Com essa utilidade, softwares web-based aumentaram em quantidade astronômica e junto levaram a complexidade às alturas !</p>
<p style="text-align: left;">Essa tal de complexidade, começou a exigir dos softwares comunicação com outros softwares, iteração com diversos dispositivos: hardware hospedeiro; ferramentas e dispositivos físicos plugados na máquina cliente, ou seja, na máquina que está acessando o software via browser. De frente à toda essa necessidade, no ínicio teimaram em prover tudo isso com sua <em>Linguagem de Programação Preferida e Bala de Prata &#8482;</em>. O resultado ? Perda de desempenho, muito dinheiro gasto com códigos que apenas satisfazem a necessidade da linguagem (i.e. Java, oi ?) e noites sem dormir.</p>
<p style="text-align: left;">PHP é uma excelente linguagem <span style="text-decoration: line-through;">que muitos programadores PHP ainda não conhecem</span> porém, não insista em controlar a impressora do cliente com a tal linguagem por que você simplesmente tomará na cabeça !</p>
<p style="text-align: left;">Disso, <em>surgiu</em>, assim digamos, um novo tipo de programador: o poliglota. Isso não quer dizer que entender ahn, COBOL e PHP torne-o passível de ser tachado como tal. Martin Fowler em <a href="http://www.infoq.com/br/interviews/martin-fowler-agile-brazil" target="_blank">entrevista</a> à Paulo Silveira na Agile Brazil 2010, afirmou sem titubear que o programador poliglota é aquele que trabalha com mais de uma linguagem de programação <strong>em um mesmo software</strong>.</p>
<p style="text-align: left;">Neal Ford, tem uma visão um pouco mais abrangente sobre poliglotismo: ele afirma no livro <a href="http://pragprog.com/titles/twa/thoughtworks-anthology" target="_blank">The ThoughtWorks Anthology</a> que o grande ponto do poliglotismo é aproveitar o que cada linguagem que roda sobre a JVM tem de melhor a oferecer. Ele dá exemplos de Java + Groovy; Java + JRuby e até Java + Jaskell. Isso é sem dúvidas infinitamente melhor do que tentar fazer uma aplicação em PHP e testá-la com Ruby e <a href="http://github.com/aslakhellesoy/cucumber" target="_blank">Cucumber</a> sem qualquer tipo de integração direta =P</p>
<p style="text-align: left;">Desenvolver desta forma é mais comum do que se pensa ! Os <acronym title="por isso o 'pseudomoderno' no título">primórdios dos Internet Banking&#8217;s</acronym> foram construídos &#8211; e assim continuam &#8211; desta forma. <span style="text-decoration: line-through;">Nada de arquitetura SOA !</span> &#8211; O banco ABN AMRO <a href="http://www.jistem.fea.usp.br/index.php/jistem/article/view/10.4301%252FS1807-17752006000100002" target="_blank">tem um artigo sobre SOA publicado no JISTEM-USP</a> &#8211; É utilizado Java e PHP com o módulo <em>PHP-Java bridge</em> para tal mágica. Empresas como Facebook, Last.fm, Google, Yahoo! utilizam mais de uma linguagem para uma mesma ferramenta como é <a href="http://www.makeuseof.com/tag/facebook-work-nuts-bolts-technology-explained/" target="_blank">anunciado</a> na rede. Isto demanda profissionais com algumas características:</p>
<ul style="text-align: left;">
<li>Livre de tecnologia. Os <em>fanboys</em> de linguagem de programação ficam a ver navios;</li>
<li>Domínio da teoria. Não basta ficar preso às facilidades de uma linguagem X ou Y; Faz-se necessário conhecer o por quê das coisas, pois uma linguagem pode ser mais ou menos <em>easy-to-use</em> do que a outra;</li>
<li>Interesse em conhecer novas formas e padrões: não adianta forçar-se a programar com o estilo Java com linguagens como Ruby. <a href="http://en.wikipedia.org/wiki/Camel_Case" target="_blank">Camel case</a> não é o <em>padrão</em> em Ruby;</li>
<li>Vontade em conhecer novas linguagens. No livro <a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer" target="_blank">The Pragmatic Programmer</a> é pelos autores recomendado que você aprenda uma linguagem nova a cada ano, e;</li>
<li>Estar apto a mudar <span style="text-decoration: line-through;">tudo</span> quase tudo, sempre!</li>
</ul>
<p style="text-align: left;">Diante de tudo isso, qual linguagem &#8220;investir&#8221;? Eu levo em consideração a minha vontade na linguagem. Não é porque a linguagem Scala não está no topo dos mais procurados que eu não partiria para aprendê-la e usá-la em meus projetos e experimentos pessoais. É questão de afinidade com a linguagem. O mercado? Virá atrás de você de forma natural. <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left;"><small><em>Artigo originalmente postado por mim no até então blog Ready to Sail, hoje, o <a href="http://readytosail.vexcorp.com">planet da Vex</a>.</em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/o-poliglotismo-no-desenvolvimento-pseudomoderno/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programador apaixonado</title>
		<link>http://programe.me/programador-apaixonado/</link>
		<comments>http://programe.me/programador-apaixonado/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 22:10:24 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=599</guid>
		<description><![CDATA[Ser programador é uma coisa engraçada ! Tenho visto recentemente várias movimentações por parte de programadores, buscando juntar-se para: programar ! É possível reparar que a quantidade de grupinhos que buscam aprender coisas novas &#8211; sejam elas linguagens da hype &#8211; metodologias ou ainda algum projeto pessoal integrando algumas linguagens, dados públicos e uma interface [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Ser Programador" href="http://hlegius.pro.br/ser-programador" target="_blank">Ser programador</a> é uma coisa engraçada ! Tenho visto recentemente várias movimentações por parte de programadores, buscando juntar-se para: <strong>programar</strong> !<br />
É possível reparar que a quantidade de grupinhos que buscam aprender coisas novas &#8211; sejam elas linguagens da <em>hype</em> &#8211; metodologias ou ainda algum projeto pessoal integrando algumas linguagens, dados públicos e uma interface dita Web 2.0.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/danicuki/4671867058/in/set-72157624208353028/"><img title="Random Hack of Kindness São Paulo 2010 por danicuki" src="http://farm2.static.flickr.com/1275/4671867058_104bf2b4eb.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">Random Hack of Kindness São Paulo 2010 por danicuki</p></div>
<p>Eventos como Yahoo! Open Hack day; Google Developer Day; o recente Random Hack of Kindness; <a href="http://www.codingdojo.org" target="_blank">Coding Dojo</a> (o de Sampa no IME da USP está meio inativo ao que consta); e vários outros movimentos iniciados até por empresas, como a própria <a href="http://www.caelum.com.br" target="_blank">Caelum</a> que já abriu as portas para criar um ambiente onde programdores pudessem se juntar e desenvolver suas coisas, ou mesmo que fechado ao grupo de programadores da mesma como já ouvi relatos de programadores.</p>
<p>O que leva esse bando de programador <em>malhucos</em> das cavernas a participarem com empolgação destes eventos &#8211; muitas das vezes apenas com <em>free lunch</em> e Internet 0800 ? São desocupados ? Loucos ?</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/acarlos1000/4448541107/"><img title="Yahoo! Open Hack Day Brazil 2010" src="http://farm5.static.flickr.com/4020/4448541107_bf35ab2bea.jpg" alt="Yahoo! Open Hack Day Brazil 2010" width="500" height="281" /></a><p class="wp-caption-text">Yahoo! Open Hack Day Brazil 2010 por Antônio Carlos</p></div>
<p>Simples: adoram o que fazem ! São essas pessoas que geralmente criam tendências, aplicam ideias e tomam iniciativas nas corporações em que trabalham; São os mesmos developers que passam horas a fio programando com vários livros de nomes <em>nonsense</em> à tira-colo; ou que criam projetos pessoais para suprir uma necessidade própria e acabam chamando a atenção de muita gente &#8211; vide tantas <em>startups</em> bem sucessidas criadas e mantidas por programadores.</p>
<p>Geralmente esses mesmos programadores conhecem pelo menos duas linguagens. O motivo ? Curiosidade ! Pouco importa se Ruby on Rails fará sucesso no mercado coorporativo ou se Python não agrada o chefe. É legal para eles, então, investem tempo nisto.</p>
<p>Sempre em busca de novos conhecimentos, fanáticos pela arte em programar e fazer coisas novas; de novas formas e com novas ferramentas. Criam coisas, compartilham o feito e ainda passam a diante o novo conhecimento com artigos, blogs ou seminários. São programadores sempre motivados que buscam fazer uma análise crítica sobre suas próprias formas de programação buscando a evolução das ideias.</p>
<p>Vida social ? Muito bem, obrigado ! Nestas idas e vindas acabam conhecendo pessoas, lugares e oportunidades diferentes. Trocam ideias, conversam, trocam contactos das redes sociais; <acronym title="PHPinga, oi ?">juntam-se em botecos</acronym> ou equivalentes tornando o simples ato de programar em grupo em praticamente uma festa completa ! <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/programador-apaixonado/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Ser programador</title>
		<link>http://programe.me/ser-programador/</link>
		<comments>http://programe.me/ser-programador/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 18:19:15 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[projetos]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=564</guid>
		<description><![CDATA[Quando decidi, aliás, percebi, que eu tinha vontade de estudar programação, nunca passou pela minha cabeça o quão difícil era criar uma aplicação a nível profissional. Iniciei na segunda metade de 2004, instalando um daqueles all in one for Windows (PHP, Apache, MySQL) e em uma semana estava fazendo uns ifs e submetendo formulários via [...]]]></description>
			<content:encoded><![CDATA[<p>Quando decidi, aliás, percebi, que eu tinha vontade de estudar programação, nunca passou pela minha cabeça o quão difícil era criar uma aplicação a nível profissional.<br />
Iniciei na segunda metade de 2004, instalando um daqueles <em>all in one</em> <em>for Windows</em> (PHP, Apache, MySQL) e em uma semana estava fazendo uns <em>ifs</em> e submetendo formulários via HTTP POST.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/harmony19490/363024712/"><img src="http://farm1.static.flickr.com/138/363024712_5783b2bee0.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">&quot;Java printout por Ngọc Hà @ flickr&quot;</p></div>
<p>Naquela época era claro para mim que programação era algo relacionado à área de exatas, pois criar uma aplicação é algo lógico tendo envolvimento direto com matemática e tudo mais.<br />
Em coisa de um mês e pouco já conseguia fazer até uns &#8220;SQLs&#8221; e montava sites no estilo <em>macarrônico</em> de desenvolver. Aquilo para mim era fantástico! Tinha como objetivo aprender bem a linguagem para assim conseguir <a title="Zend Certified Engineer" href="http://www.zend.com/en/store/education/certification/authenticate.php/ClientCandidateID/ZEND010366/RegistrationID/231431226" target="_blank">minha certificação da Zend</a>, tornando-me assim um programador profissional.</p>
<p>Aconteceu porém, algo inesperado: comecei a &#8220;seguir&#8221; &#8211; não era no Twitter, até porque ele ainda era um protótipo de projeto na época &#8211; pessoas realmente profissionais em desenvolvimento de software e eu percebi assim que o buraco era mais embaixo e que eu ser excelente em uma linguagem era apenas um dos passos para tornar-me um programador profissional.</p>
<p>Abrindo um parênteses, eu li através do <a href="http://www.twitter.com/sergioprado" target="_blank">@sergioprado</a>, não lembro onde agora, uma frase interessante e que tem como tradução algo como:</p>
<pre>"O caminho para tornar-se mestre: siga o mestre; ande com o mestre;
torne-se o mestre."</pre>
<p>Após começar eu a seguir os mestres, pude perceber que programação vai muito além da leitura de um requisito funcional de software e fazer daquilo algo sistêmico. Hoje, arrisco-me a dizer que programação não é algo somente relacionado à exatas. Possuí também, questões éticas &#8211; humanas &#8211; e artísticas.</p>
<p><strong>A programação é relacionada a área de exatas</strong></p>
<p>Isso é bem claro aos envolvidos em desenvolvimento de software. Você lê um problema descritivo, vulgo especificação funcional, ou visual (UML, rabisco na <a href="http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&amp;field-keywords=moleskine&amp;x=0&amp;y=0" target="_blank">Moleskine</a>, <em>whatever</em>) e faz daquilo algo sistêmico e que agregue valor ao negócio de seu cliente.</p>
<p>Como premissa você precisa aprender uma linguagem. Conhecer uma linguagem bem não é nada fácil. Você precisa empenhar-se para conhecer as intrínsecas e peculiaridades para aproveitar o melhor dela, tornando-se um especialista na linguagem. Eu valorizo mais um programador excelente em uma linguagem a um que já &#8220;trabalhou&#8221; com várias. Não é impossível uma pessoa ser excelente em mais de uma linguagem, mas isto, porém, demandaria muito tempo de dedicação para atingir tal nível.</p>
<p><strong>A programação é relacionada a ética</strong></p>
<p>Toda área tem suas condutas éticas e humanas, óbvio. Em programação, porém, vejo muitos ditos programadores ignorando isto. Quando você troca qualidade por falso ganho de tempo, você está sendo antiético. Quando não analisa corretamente as decisões que irá tomar em cima de algum problema, falta-lhe ética. Quando deixa de atentar seu cliente, o que inclui seu chefe, sobre a ausência de segurança, qualidade ou algum problema em cascata que venha a aparecer em decorrência de uma atitude, você está sendo antiético.</p>
<p>E isso acontece em demasia em nossa área! Seja por falta de interesse por parte do dito programador ou mesmo por medo de perder o emprego/projeto por &#8220;afronto&#8221; ao seu chefe ou cliente.</p>
<p>Para conhecer as técnicas, metodologias e artimanhas no desenvolvimento de software é necessário antes, ter uma boa noção de análise e projeto de software; arquitetura de aplicações; padrões e melhores práticas, para, após criticar uma atitude antiética de seu chefe/cliente, você ter total embasamento para propor a solução sem comprometer o projeto nem a aplicação. Isto será necessário também, para você ter um vocabulário comum para quando estiver numa roda de conversa entre os &#8220;mestres&#8221; da área.</p>
<p>Importante ressalvar que seu cliente ou chefe pode estar tomando uma atitude antiética, no ponto de vista de programação, inconscientemente. Afinal ele é especialista no negócio, o programador profissional é você! <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>A programação é também relacionada a artes</strong></p>
<p>Há uma enorme diferença entre criar algo que funcione e criar algo que além de funcionar, transparece o domínio (regra de negócio).</p>
<p>Eu posso saber ler e escrever em português, mas há uma diferença gritante entre um poeta português e eu. Ele, diferentemente de mim, sabe utilizar muito bem as palavras e com elas, faz transparecer sentimentos, idéias e pensamentos sobre determinado tema, trazendo um enredo ao assunto abordado, envolvendo-nos em sua história.</p>
<p>Posso saber desenhar, mas isso não me torna um artista que emociona as pessoas com minhas obras.</p>
<p>Como programadores profissionais é fundamental conseguirmos fazer o mesmo ! É de nossa responsabilidade criar um código simples, legível e que conte toda a história da aplicação através de seus pacotes, classes, métodos, parâmetros, atributos e variáveis. Qualquer coisa diferente disso, não pode ser aceito como código profissional.</p>
<p>Pouco importa se a linguagem X é tachada como mais poluída que a Y. Você como profissional, tem que quebrar essa barreira e torná-la tão legível quanto qualquer outra, afinal, você é especialista na linguagem, lembra ?</p>
<p>Além de criar, é nossa responsabilidade cuidar para que o código continue sempre otimizado por tantas quantas forem as mudanças que nele ocorrer. Criar algo legível recai diretamente sobre isto, pois, no futuro outro profissional em programação poderá continuar seu trabalho sem danificar ou abandonar as premissas cruciais para um bom código. <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1272218331&amp;sr=8-1" target="_blank">Andrew Hunt</a> aborda o título: <em>&#8220;Don&#8217;t live with broken windows&#8221;</em>, onde resumidamente ele alerta para não descuidarmos da qualidade, pois, basta uma janela quebrada em uma casa para que ela transpareça o estado de abandono, fazendo assim, com que outras pessoas destruam mais janelas.</p>
<p>E como toda arte, não há uma receita para criar bons softwares. É necessário muito empenho, ler muitos códigos, revisar muitos paradigmas ao longo do tempo e claro, programar bastante. Não é possível tornar-se um programador profissional sem conhecimento teórico, tão pouco, sem vivência com erros e acertos.</p>
<p>Ao desenvolver a aplicação, não aceite nada menos do que seu melhor naquilo e atente-se para não cair na armadilha de criar softwares de forma sistematizada. Tenha autocrítica para fazer avaliações em seus próprios códigos e evitar assim, programar por coincidência.</p>
<p>Lembre-se de que será seu nome no <em><strong>@author.</strong></em> <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/ser-programador/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Review: Zend Studio 7</title>
		<link>http://programe.me/zend-studio-7-review/</link>
		<comments>http://programe.me/zend-studio-7-review/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 00:50:37 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=372</guid>
		<description><![CDATA[Salve ! Desde quando comecei a fazer programas venho usando algumas ferramentas para desenvolver em PHP. Na categoria Editor / IDE, na minha mão (ui) já passaram Quanta Plus, KDevelop, Eclipse PHP IDE, Netbeans for PHP e agora estou utilizando o Zend Studio. Com exceção do último, todos free ou opensource. Netbeans é muito bom, [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Desde quando comecei a fazer programas venho usando algumas ferramentas para desenvolver em PHP.<br />
Na categoria Editor / IDE, na minha mão (ui) já passaram <strong>Quanta Plus</strong>, <strong>KDevelop</strong>, <strong>Eclipse PHP IDE</strong>, <strong>Netbeans</strong><strong> for PHP</strong> e agora estou utilizando o <strong>Zend Studio</strong>. Com exceção do último, todos free ou opensource.</p>
<p>Netbeans é muito bom, porém o que me chamou a atenção no <a href="http://www.zend.com/products/studio/" target="_blank">Zend Studio</a> foi o <em>all-in-one</em> que ele traz por default. Listando rapidamente:</p>
<ul>
<li>Editor PHP</li>
<li>Integração SVN/CVS/Git</li>
<li>PHP Debugging já integrado ao Zend Debugger</li>
<li>PHP Profiling</li>
<li>Database Management e Debug</li>
<li>Um ToDo simples</li>
<li>Facilidade em achar as coisas nos projetos</li>
<li>Zend Toolbar integration para Firefox e IE &#8211; mas quem liga pro IE afinal</li>
<li>etc&#8230;</li>
</ul>
<p>Claro que não é impossível configurar toda essa penca de coisa no Eclipse nativo ou Netbeans, só que isto demandaria tempo. <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Destaque para PHP Debug, Profiling e Zend Toolbar. Isto me chamou MUITA atenção quando estava olhando reviews e também nos trinta dias de testes.</p>
<p>Além do<em> feijão com arroz </em>temos:</p>
<p><strong>1. Call Hierarchy / Type Hierarchy / Open Type Hierarchy</strong></p>
<p>Ajuda um bocado na localização nas relações entre classes e métodos dentro do projeto. No exemplo tenho um método que chama outro e esse outro chama outro. No caso, tudo dentro de mesma classe, mas funciona perfeitamente em qualquer parte do sistema &#8211; incluindo libs no <em>Include Path:</em></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/callHierarchy.PNG"><img class="aligncenter size-full wp-image-397" title="Call Hierarchy" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/callHierarchy.PNG" alt="Call Hierarchy" width="339" height="144" /></a></p>
<p>Já o Type Hierarchy mostra a relação entre uma classe e suas relações com classes pai ou interfaces:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/typeHierarchy.PNG"><img class="aligncenter size-full wp-image-398" title="Type Hierarchy" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/typeHierarchy.PNG" alt="Type Hierarchy" width="342" height="373" /></a></p>
<p>E o Open Type Hierarchy (Ctrl + Shift + H) auxilia a localização de objetos, arquivos e métodos dentro do projeto.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/openTypeHierarchy.PNG"><img class="aligncenter size-medium wp-image-399" title="Open Type Hierarchy" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/openTypeHierarchy-300x260.PNG" alt="Open Type Hierarchy" width="300" height="260" /></a></p>
<p>Ainda na área de localização de elementos, há uma pesquisa mais completa (Ctrl + H) que permite localização de métodos, arquivos, classes separando por tipo e muito mais:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/search1.PNG"><img class="aligncenter size-medium wp-image-400" title="Search (Ctrl + H)" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/search1-300x224.PNG" alt="Search (Ctrl + H)" width="300" height="224" /></a></p>
<p>Após encontrar um resultado, a tab search é exibida/focada:</p>
<p><img class="aligncenter size-full wp-image-401" title="Search Results" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/search2.PNG" alt="Search Results" width="323" height="262" /></p>
<h3></h3>
<p><strong>2. Indentação e Marcação (diff) no código:</strong></p>
<p>Outra coisa interessante &#8211; e que existe em qualquer IDE decente &#8211; é a possibilidade de trazer o que é chamado de Quick Diff. Este recurso permite mostrar de forma simples o que você alterou, removeu ou adicionou no código. Funciona com SVN, CVS e cópia do disco local. Selecione o tipo e as cores e voilà !</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/quickDiff.PNG"><img class="aligncenter size-medium wp-image-403" title="Quick diff" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/quickDiff-292x300.PNG" alt="Quick diff" width="292" height="300" /></a></p>
<p>Embora muito comum, a indentação de código é algo interessante de manter ajustado (tab com 4 espaços) e suas preferências quanto a espaço entre os elementos; posição de chave de abertura e etc;</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/indent.PNG"><img class="aligncenter size-medium wp-image-402" title="Indent" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/indent-300x257.PNG" alt="Indent" width="300" height="257" /></a></p>
<p>Nessa tela é possivel você definir praticamente tudo sobre indentação de código ! Depois de configurar ao seu gosto (ou padrão) pode exportar para XML e usar em qualquer outra ferramenta que leia o formato &#8211; qualquer Eclipse, por exemplo =P</p>
<p><strong>Depois de configurado</strong>, você pode selecionar o trecho a ter a indentação ajustada selecionando o trecho e  Ctrl + i &#8211; obrigado, Otávio pela dica; Pode formatar todo um arquivo usando Ctrl + shift + F &#8211; valeu Toscano pela tip &#8211; ou ainda, formatar TODO o projeto: <em>Selecione o Projeto no PHP Explorer, Source -&gt; Format &#8211; </em>obrigado hlegius <img src='http://programe.me/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Note que todos atalhos funcionam no Eclipse também <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>3. PHP Debug</strong></p>
<p>Não é um recurso muito usado pelos developers PHP, principalmente aqueles que começaram com PHP, como eu, mas sem dúvidas revoluciona a forma de como você desenvolve. Após adotar o debug você não quer mais saber de var_dump() ou print_r() com aqueles: &#8216;estou aqui&#8217; para verificar o que pegou na aplicação.</p>
<p>Como o PHP é baseado em Web, seria fundamental ele poder ser debugado como se estivesse sendo carregamento pelo browser, não ? E é exatamente isso que permite o Zend Debugger &#8211; o Xdebug também =~</p>
<p>Ambas engines de debug podem ser integradas ao Zend Studio, porém, no pacote do Studio já vem a versão mais recente do Zend Debugger e tudo já meio que ajustado para rodar com ele <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>É possível debugar um script PHP Modo terminal e claro, o PHP Web Debug. Para este último você fornece a URL que quer debugar e ele abre a sessão de debugging parando na primeira linha.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug1.PNG"><img class="aligncenter size-medium wp-image-404" title="Zend Debugger + Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug1-300x267.PNG" alt="Zend Debugger + Studio" width="300" height="267" /></a></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug2.PNG"><img class="aligncenter size-medium wp-image-405" title="Zend Debugger + Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug2-300x225.PNG" alt="Zend Debugger + Studio" width="300" height="225" /></a></p>
<p>Utilizando os breakpoints você pode acompanhar o fluxo da aplicação, valores das variáveis, propriedades dos objetos instanciados e etc.</p>
<p>Claro que nossas aplicações vão muito além de uma simples URL. Temos chamadas com POST, GET e até chamadas em <em>Ajax</em>. O Zend Studio provê uma extension para o Firefox chamada <strong>Zend Toolbar</strong>. Essa toolbar, permite que você diga ao browser para chamar a sessão de Debug ou Profiling do Studio na próxima página; página atual; Qualquer submit POST ou ainda em qualquer ação no browser. E o pior: funciona !</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug3.PNG"><img class="aligncenter size-medium wp-image-406" title="Zend Studio + Zend Toolbar" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug3-300x242.PNG" alt="Zend Studio + Zend Toolbar" width="300" height="242" /></a></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug4.PNG"><img class="aligncenter size-medium wp-image-407" title="Zend Studio - Debug Perpective" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug4-300x119.PNG" alt="Zend Studio - Debug Perpective" width="300" height="119" /></a></p>
<p>A configuração do Zend Debugger na sua máquina é simples, mas acho ser digna de um post inteiro sobre isto. Vou tentar preparar um material e publico aqui a configuração e uso dele no Zend Studio.</p>
<p><strong>4. PHP Profile</strong></p>
<p>Além de debuggar, seria interessante analisarmos o desempenho da aplicação. Ok, segue:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile.PNG"><img class="aligncenter size-medium wp-image-408" title="PHP Profile Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile-300x201.PNG" alt="PHP Profile Zend Studio" width="300" height="201" /></a></p>
<p>Chamadas, quantas vezes chamou; quem demora mais; quem é mais rápido; quem chama quem;</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile2.PNG"><img class="aligncenter size-medium wp-image-409" title="PHP profile - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile2-300x254.PNG" alt="PHP profile - Zend Studio" width="300" height="254" /></a></p>
<p>E ele, o fluxo da aplicação:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile3.PNG"><img class="aligncenter size-medium wp-image-410" title="PHP Profile - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile3-300x256.PNG" alt="PHP Profile - Zend Studio" width="300" height="256" /></a></p>
<p>A Zend Toolbar também provê acesso simples ao Profiling. Basta clicar em Profile na toolbar e pronto. O Studio é chamado e o profile da página é feito.</p>
<p><strong>5. Database Management</strong></p>
<p>Para fechar, gerenciamento dos databases. Possui ponte para vários databases incluindo Oracle, MySQL, PostgreSQL e MSSQL.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/database.PNG"><img class="aligncenter size-medium wp-image-411" title="Database - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/database-181x300.PNG" alt="Database - Zend Studio" width="181" height="300" /></a></p>
<p>Por ele é possível adicionar valores, editar, remover, rodar <em>Queries SQL</em>, backup de estrutura e valores e ele também armazena suas Queries para re-executá-las com um clique quando quiser.</p>
<p><strong>6. Outros</strong></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/svn.png"><img class="aligncenter size-medium wp-image-412" title="SVN - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/svn-242x300.png" alt="SVN - Zend Studio" width="242" height="300" /></a></p>
<p>SVN, projetos remotos &#8211; incluindo acesso SMB ou FTP; WebServices; Históricos locais, SVN, diff, suporte a Git e suporte a quaisquer plugins que rodem no Eclipse, afinal o Zend Studio tem como base o Eclipse.</p>
<p>Já o configurei no Ubuntu lá na Vex, Windows 7 e Arch Linux aqui no escritório pessoal. Tudo muito tranquilo, sempre.</p>
<p><strong>7. Preços e licença</strong></p>
<p>O custo da licença eu acho alto demais para uma IDE de desenvolvimento. Atualmente são US$ 400,00 por ano para ter suporte e atualização sempre. Caso queira, pode comprar a licença por um ano e depois não comprar mais. Neste caso você ficaria com a última versão antes da expiração de seu suporte ilimitado. Em miúdos: enquanto você paga, recebe atualização da versão.</p>
<p>Comprei em setembro, na versão 7. Em Setembro de 2010, vamos imaginar que esteja na versão 9. Terei as licenças para 7, 8 e 9. Expirou e não renovei, mas saiu update da versão 9, a 9.1, por exemplo. Tenho update dela, pois a licença é a mesma da 9. Porém, no lançamento da 10, eu precisaria comprar uma nova licença para ter direito de baixar e usar a o v10.</p>
<p><strong>Minha opinião final:</strong> gostei e tenho usado apenas ele desde quando comecei a testá-lo em meados de Setembro de 2009. Tem muita coisa boa e que ajuda muito e mesmo com o alto custo, vale cada centavo pago até o presente momento.</p>
<p><em>#notamental não é post patrocinado, tão pouco trabalho na Zend, certo ? <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/zend-studio-7-review/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Exceptions. Pois nem tudo é perfeito</title>
		<link>http://programe.me/exceptions-pois-nem-tudo-e-perfeito/</link>
		<comments>http://programe.me/exceptions-pois-nem-tudo-e-perfeito/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 14:44:10 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=313</guid>
		<description><![CDATA[Salve ! Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente. E qual é a forma que você utiliza para retornar estes erros ? Veja, eu [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente.</p>
<p>E qual é a forma que você utiliza para retornar estes erros ? Veja, eu posso ajudar a recordar você:</p>
<div class="igBar"><span id="lcode-5"><a href="#" onclick="javascript:showPlainTxt('code-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-5">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -<span style="color:#800000;color:#800000;">1</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -<span style="color:#800000;color:#800000;">2</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;echo $nome;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;return <span style="color:#800000;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Com isso lá na sua Action você fica fazendo malabarismo para encontrar o erro retornado e gerar a mensagem para o usuário. Não demorará muito para você criar sua tabela de erro:</p>
<ul>
<li>-1 para erros de entrada</li>
<li>-2 para erros de máscara</li>
<li>-3 para calcúlos errados</li>
<li>-4 para usuário não logado</li>
<li>-5 ....</li>
<li>-7634 ....</li>
</ul>
<p>Realmente, bem simples assim né ? Só consultar a tabela e mandar bala.</p>
<p>Eu realmente não entendo o motivo de muitos não utilizarem a<a href="http://br.php.net/exception" target="_blank"> classe nativa de exceções do PHP</a>. É simples, é funcional e<em> de grátis</em> você não precisa montar sua tabelinha de códigos de erro.</p>
<p>Veja o mesmo código reescrito utilizando a tal classe:</p>
<div class="igBar"><span id="lcode-6"><a href="#" onclick="javascript:showPlainTxt('code-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-6">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new Exception <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome não é válido !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; throw new Exception<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome precisa conter foo, cara !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;echo $nome;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Com isso na sua Action, simplesmente:</p>
<div class="igBar"><span id="lcode-7"><a href="#" onclick="javascript:showPlainTxt('code-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-7">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">include <span style="color:#CC0000;">"function_foobar.php"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">try <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; foobar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"ab"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> catch <span style="color:#006600; font-weight:bold;">&#40;</span>Exception $e<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; $var_template_sem_merchan_pro_smarty-&gt;<span style="">assign</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'retorno_de_erro'</span>,$e-&gt;<span style="">getMessage</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Assim, você pode ter 1, 2, 3, <em>n</em> mensagens de erro em <em>n</em> camadas da aplicação sem a necessidade de se preocupar em tratar uma a uma também na Action. Fica ultra-transparente na Action além de economizar seus dedos refazendo coisas que já estavam prontas camadas a dentro.</p>
<p><strong>Nota</strong>: Não esqueça disso <strong>nunca</strong> : <span style="color: #ff0000;">jamais</span> lance como exception uma mensagem de erro do PHP. Isso é feio - porque vem em inglês -, você será xingado por 3 gerações futuras de programadores além de permitir que os usuários vejam detalhes sobre sua aplicação.</p>
<h5>Como detectar os erros sem lança-los ao usuário ?</h5>
<p>Bem simples. Persista-os - eita mania - em arquivos de log. Mas calma, antes de sair criando algo com fopen(), leia isto: o PHP também traz o cara que salva - persiste - erros ! Ah sim, o PHP é excelente eu sei. Voltando ao exemplo...</p>
<p>
<div class="igBar"><span id="lcode-8"><a href="#" onclick="javascript:showPlainTxt('code-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-8">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O cara forneceu "</span>. $nome . <span style="color:#CC0000;">" e isto é inválido <span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">"seu_arquivo_de_log.txt"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new Exception <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome não é válido !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O cara forneceu "</span>. $nome . <span style="color:#CC0000;">" porém sem o foo !<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">"seu_arquivo_de_log.txt"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// #notamental não há motivos para logar &quot;erros&quot; deste tipo. Estou apenas ilustrando seu funcionamento <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp;throw new Exception<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome precisa conter foo, cara !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; echo $nome;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Sim, ele, o <a href="http://br.php.net/error_log" target="_blank">error_log()</a> salva o log para ti. E pior, digo, melhor: caso queira ele pode enviar a notificação no seu e-mail. Certo, em boa parte dos casos isto definitivamente não é uma boa ideia. Mas pode ser útil algum dia, penso.</p>
<p>Resumo do dia: use ao máximo as <a href="http://br.php.net/exception" target="_blank">Exceptions</a> e as <a href="http://br.php.net/manual/pt_BR/ref.errorfunc.php" target="_blank">funções para tratamento de erros do php</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/exceptions-pois-nem-tudo-e-perfeito/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Indentação de códigos</title>
		<link>http://programe.me/indentacao-de-codigos/</link>
		<comments>http://programe.me/indentacao-de-codigos/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 15:43:04 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Organização]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/identacao-de-codigos/</guid>
		<description><![CDATA[É fato que cada programador tem suas técnicas e formas de trabalhar: preferências por Frameworks - ou preferência por trabalhar sem uma - preferências na plataforma (Linux, OSX, Windows, Solaris, *BSD...), preferências por IDEs de desenvolvimento (Eclipse, Zend Studio, Aptana, NetBeans, Kdevelop, Anjuta...) e isso não seria diferente quando o assunto é indentação de códigos. [...]]]></description>
			<content:encoded><![CDATA[<p>É fato que cada programador tem suas técnicas e formas de trabalhar: preferências por Frameworks - ou preferência por trabalhar sem uma - preferências na plataforma (Linux, OSX, Windows, Solaris, *BSD...), preferências por IDEs de desenvolvimento (Eclipse, Zend Studio, Aptana, NetBeans, Kdevelop, Anjuta...) e isso não seria diferente quando o assunto é <strong>indentação de códigos</strong>.</p>
<p>Pensando rapidamente parece um absurdo tratar sobre isto, mas acredite, assim como temos os Freetards - pessoas que têm amor ao Software Livre e critica todo o resto - Mactards, Wintards temos os programadores que <strong>descutem</strong> sobre indentação do código ! E acredite, tem "grupos" de programadores, cada qual defendendo um lado ! Loucura ? Continue lendo !</p>
<p><strong>Nosso ponto de partida..</strong><br />
Como eu não sei exatamente onde que teve inicio isto, tomaremos como ponto de partida a publicação do livro <em>The C Programming Language</em>, escrito por Brian Kernighan e Dennis Ritchie. No livro você percebe que eles indentam o código da seguinte forma:</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_krstyle.png' alt='Kernighan and Ritchie Style Identing' /></p>
<p>Porém, há uma exclusão aí ! Quando temos funções, a indentação desta é diferenciada, veja:</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_krstyle_function.png' alt='Kernighan and Ritchie - Function Style Identing' /></p>
<p>Repare que nestes casos, a abertura de chaves fica abaixo da linha que indentifica a função. Em todo o resto, a chave de abertura ficará na mesma linha.</p>
<p><strong>Nota:</strong> vale lembrar que a mesma dupla que definiu que <em>"Os nomes de variáveis e funções tem que expressar o significado do que ela armazena/executa, entretando o nome não pode ser extenso demais."</em></p>
<p><strong>Em desacordo, nascem outras formas...</strong></p>
<p><strong>1. Eric Paul Allman - "Allman Style"</strong><br />
Vejamos a forma que ele usa e defende(defendia) :</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_allman.png' alt='Eric Allman Identing code' /></p>
<p>A explicação é clara, assim como o código: isso evita que tenhamos linhas cheia de "tabs" apenas com chaves lá no final. Uma vez que as chaves sempre ficariam antes do conteúdo do bloco de código. É, até que tem sentido...</p>
<p><strong>2. Whitesmiths Style</strong><br />
Esse estilo é usado pela <a href="http://www.symbian.com/">Symbian</a> ao desenvolver as aplicações em C++ para seus dispositivos móveis.</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_whitesmiths.png' alt='Whitesmiths - Code Style' /></p>
<p>As chaves do bloco ficam abaixo da última letra do nome do método/construtor da linguagem. Ao que me parece, era usado nos primórdios do Windows também. (Carece de fontes confiáveis)</p>
<p><strong>3. GNU Emacs</strong><br />
Sim, o guru do Software Livre também entrou nessa e criou seu estilo. Ele nada mais é do que a mistura do Allman com a Whitesmiths.</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_gnu.png' alt='Gnu Code Style' /></p>
<p>O código é indentado da seguinte forma: após o *if* você vai para linha debaixo e dá 2 espaços, e então coloca a abertura da chave do bloco. Vai para a linha debaixo novamente, e dê mais 2 espaços avançando dentro dos dois anteriores. Aí agora pode colocar seu código <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Analisando alguns códigos...</strong><br />
Vejamos alguns códigos por aí a fora para ver o que a galera acha "pop".</p>
<p><strong>- Código fonte Kernel do Linux (arquivo proc.c)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_kernellinux.png' alt='Identação do Kernel do Linux' /></p>
<p><strong>- Código fonte Mozilla Firefox (GranParadiso Alpha8) (arquivo nsBrowserApp.cpp)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_firefox.png' alt='Identação de código do Mozilla Firefox GranParadiso Alpha8' /></p>
<p><strong>- Código fonte The Vim Editor (arquivo edit.c)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_vi72.png' alt='Identação de código do VI Editor 7.2' /></p>
<p><strong>- Código fonte Zend Framework 1.5 (arquivo Action.php)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_zendphp.png' alt='Identação de código do Zend PHP Framework' /></p>
<p><strong>- E claro, a "minha" forma de indentação</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_hlegius.png' alt='Identação de códigos de hlegius' /></p>
<p><strong>Resumindo....</strong><br />
Pegando emprestado o resumo do <a href="http://www.emacswiki.org/cgi-bin/wiki/IndentingC#toc4">EmacsWiki.org</a>, temos:</p>
<blockquote><p>“gnu”<br />
    The default style for GNU projects<br />
“k&#038;r”<br />
    What Kernighan and Ritchie, the authors of C used in their book<br />
“bsd”<br />
    What BSD developers use, aka “Allman style” after Eric Allman.<br />
“stroustrup”<br />
    What Stroustrup, the author of C++ used in his book<br />
“linux”<br />
    What the Linux developers use for kernel development<br />
“python”<br />
    What Python developers use for extension modules<br />
“java”<br />
    The default style for java-mode (see below)<br />
“user”<br />
    When you want to define your own style</p></blockquote>
<p>Para fechar o post, deixo aqui uma frase que encontra-se no livro <em>The Programming C Language</em>:</p>
<blockquote><p>The position of braces is less important, although people hold passionate beliefs. We have chosen one of several popular styles. Pick a style that suits you, then use it consistently.</p></blockquote>
<p><strong>Veja também:</strong> (Links em inglês)<br />
<a href="http://www.emacswiki.org/cgi-bin/wiki/IndentingC">http://www.emacswiki.org/cgi-bin/wiki/IndentingC</a><br />
<a href="http://en.wikipedia.org/wiki/Symbian_OS">http://en.wikipedia.org/wiki/Symbian_OS</a><br />
<a href="http://en.wikipedia.org/wiki/Indent_style">http://en.wikipedia.org/wiki/Indent_style</a><br />
<a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=446444">http://www.gamedev.net/community/forums/topic.asp?topic_id=446444</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/indentacao-de-codigos/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Design Patterns e o PHP</title>
		<link>http://programe.me/design-patterns-e-o-php/</link>
		<comments>http://programe.me/design-patterns-e-o-php/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 10:40:10 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[artigos]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/design-patterns-e-o-php/</guid>
		<description><![CDATA[Salve! Quem já ouviu falar de design patterns e que programa em PHP ? Melhor: quem que programa em PHP e está utilizando qualquer uma das patterns mais conhecidas ? Isso não é nada espantoso! Os programadores PHP em sua grande parcela ainda não acordaram para a nova realidade: código mais extensível e pensado. Nunca [...]]]></description>
			<content:encoded><![CDATA[<p>Salve!</p>
<p>Quem já ouviu falar de design patterns e que programa em PHP ? Melhor: quem que programa em PHP e está utilizando qualquer uma das patterns mais conhecidas ?</p>
<p>Isso não é nada espantoso! Os programadores PHP em sua grande parcela ainda não acordaram para a nova realidade: código mais extensível e pensado. Nunca falei aqui, mas acho que o PHP tem um defeito grave: ser super simples. Isso estragou, em partes a fama da linguagem.</p>
<p>Vamos a um exemplo: duelo. Java Vs PHP.</p>
<p>Java: Hello world no shell</p>
<div class="igBar"><span id="ljava-14"><a href="#" onclick="javascript:showPlainTxt('java-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVA:</span>
<div id="java-14">
<div class="java">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">class</span> HelloWorld <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"Hello World!"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>PHP procedural</p>
<div class="igBar"><span id="lphp-15"><a href="#" onclick="javascript:showPlainTxt('php-15'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-15">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#FF0000;">'Hello world'</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>PHP O.O</p>
<div class="igBar"><span id="lphp-16"><a href="#" onclick="javascript:showPlainTxt('php-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-16">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">class</span> HelloWorld <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;public <span style="color:#000000; font-weight:bold;">function</span> __construct<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#FF0000;">'HelloWorld'</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$hw</span> = <span style="color:#000000; font-weight:bold;">new</span> HelloWorld<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>O que é mais fácil ? PHP ou Java ? PHP procedural ou PHP O.O ? Essa facilidade fez com que várias aplicações inseguras e mal pensadas infestassem a rede, causando uma rejeição do PHP por parte de vários Clientes e com isso, empresas de desenvolvimento de software. Isso é ruim para a linguagem, ruim para o profissional sério e ruim para o cliente que terá que pagar mais caro por uma tecnologia como o Java.</p>
<p>Hélio, tá, mas onde entra os design patterns nessa sua conversa mole ? Ok, até o momento eu tangenciei o tema, mas veja que para existir Pattern é ideal que haja Programação Orientada a objetos com tudo que temos direito.</p>
<p>Design patterns nada mais é que um conjunto de conceitos que visa auxiliar na resolução de um problema comum entre os programadores de verdade.</p>
<p><strong>E dale exemplos</strong></p>
<p><strong>MVC (Model View Control - Modelo Visualização Controle) ::</strong> essa Pattern foi desenvolvida para resolver o problema da lambança de códigos, ou seja, um arquivo faz tudo: conecta no banco, traz dados, exibe na tela, pega retorno do cliente, aplica regra de negócio e salva no banco.<br />
Imagine uma aplicação como E-commerce feita desta forma! Loucura hein! Falando em lambança, encontrei recentemente em um dos projetos que assumi, um arquivo <em>executa.php</em>. Já ouviu falar dele ? O "faz tudo" ? Não ? Assunto para outro post!</p>
<p>Então, como eu ia dizendo: para resolver o problema de manter tudo nas "costas" de uma mesma aplicação, foi pensado e desenvolvido esse <strong>modelo MVC</strong> onde a aplicação fica separada em camadas. Na camada mais baixa, fica o modelo, que faz a interação com o servidor de banco de dados, sistema de arquivos e etc.; Depois temos a classe que processa os dados recebidos pelo usuário e se passar por checagens simples é entregue a "Model"; e por fim, temos a View que nada mais é do que o HTML que o usuário vê, sem PHP, sem CSS sem Javascript misturado.</p>
<p>Criando um diagrama bobo temos:</p>
<blockquote><p>Banco de dados -> Model -> Controller -> View</p></blockquote>
<p><strong>View:</strong> Usuário clica no botão submit com o campo Nome preenchido.<br />
<strong>Controller </strong> recebe esse formulário. Verifica se o nome tá setado (sem checar seu valor). Setado ? Ok, manda para a model.<br />
<strong>Model</strong> recebe e aplica a regra de negócio: no exemplo, o nome precisa ter pelo menos 3 caracteres. Tem ? Ok, pega o poll de conexão com o banco de dados e salva.<br />
Retorna "true" para a <strong> Controller</strong> que exibe uma mensagem de "Sucesso" na <strong>View</strong></p>
<p><strong>DAO: (Data Access Object) </strong>:: Essa Pattern tem como objetivo separar a <em>Model</em> em dois: regra de negócio do acesso ao banco de dados. No nosso exemplo anterior, a <em>Usuario.php</em> receberia da <em>UsuarioController.php</em> o dado e a mesma aplicaria a regra de negócio. Após estar ok, a <em>Usuario.php</em> enviaria o status de "ok, pode gravar" para o UsuarioDao.php e este gravaria a informação no banco (verificando se o nome não existe por exemplo) e retornaria a informação de "true" para nosso <em>Usuario.php.</em><br />
Veja que ela tem como objetivo deixar a <em>Model</em> mais limpa e legível à manter regra de negócio e acesso ao banco tudo junto.</p>
<p><strong>Factory Pattern (Fábrica)</strong> :: tem por objetivo englobar vários recursos dentro de um mesmo método usando os blocos de condição "if" ou "switch". Exemplo:</p>
<div class="igBar"><span id="lphp-17"><a href="#" onclick="javascript:showPlainTxt('php-17'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-17">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">class</span> Usuario <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;public <span style="color:#000000; font-weight:bold;">function</span> Pesquisa<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">switch</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$p</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#616100;">case</span> <a href="http://www.php.net/is_numeric"><span style="color:#000066;">is_numeric</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$p</span>-&gt;<span style="color:#006600;">Id</span><span style="color:#006600; font-weight:bold;">&#41;</span>:</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// Faz a pesquisa tomando como base o ID do cliente</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">break</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#616100;">case</span> <span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/strlen"><span style="color:#000066;">strlen</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$p</span>-&gt;<span style="color:#006600;">Nome</span><span style="color:#006600; font-weight:bold;">&#41;</span>&gt; <span style="color:#CC66CC;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span>:</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// Faz a pesquisa tomando como base o Nome do cliente</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">break</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Veja que no exemplo o método <em>Pesquisa()</em> é um só mas dependendo do tipo de informação que ele recebe, executa uma ação diferente. Isso é a <strong>Pattern Factory</strong>, novamente resolvendo outro problema usando conceitos simples. Uma outra forma de resolver o mesmo problema seria criando vários métodos<em> PesquisaId() PesquisaNome()</em>, porém, estariamos deixando de lado a Pattern Factory.</p>
<p><strong>Singleton ::</strong> essa Pattern tem como objetivo evitar que uma mesma variável, poll de conexão e etc., ocupe mais espaço na memória. Vamos a um exemplo:</p>
<p><a href='http://www.hlegius.pro.br/wp-content/uploads/2007/11/singleton.jpg' title='Singleton - Pattern'><img src='http://www.hlegius.pro.br/wp-content/uploads/2007/11/singleton.jpg' alt='Singleton - Pattern' /></a></p>
<p>No desenho que criei no Gimp, ao conectar com o banco é alocado certo endereço da memória para ele. Caso eu faça outra requisição de conexão, ao invés de alocar outro endereço de memória, ele vai usar o mesmo endereço. Pense em algo fixo. Posso fazer "n" requisições que ele sempre usará o mesmo espaço que foi alocado inicialmente.</p>
<p>A mágina está no <strong>public static $Con</strong>. Estou definindo que o <strong>$Con</strong> será estático.<br />
Abaixo, o script que está na imagem:</p>
<div class="igBar"><span id="lphp-18"><a href="#" onclick="javascript:showPlainTxt('php-18'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-18">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">&lt;?php</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">class</span> BancoDados <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; public <a href="http://www.php.net/static"><span style="color:#000066;">static</span></a> <span style="color:#0000FF;">$Con</span> = <span style="color:#000000; font-weight:bold;">null</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;private <span style="color:#000000; font-weight:bold;">function</span> __construct<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#008000;">/**</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">&nbsp; &nbsp;&nbsp; * Abre uma conexão com o MySQL</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">&nbsp; &nbsp;&nbsp; */</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; public <span style="color:#000000; font-weight:bold;">function</span> Conecta<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>self::<span style="color:#0000FF;">$Con</span> instanceof PDO<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#616100;">return</span> self::<span style="color:#0000FF;">$Con</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; self::<span style="color:#0000FF;">$Con</span> = <span style="color:#000000; font-weight:bold;">new</span> PDO<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">"mysql:host="</span> . SERV . </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF0000;">";dbname="</span> . NAME . <span style="color:#FF0000;">""</span>,</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; USER,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PASS</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#616100;">return</span> self::<span style="color:#0000FF;">$Con</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">?&gt;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Caso tenha interessado o assunto, você poderá pesquisar outras diversas Patterns que propõem solução para vários outros "problemas" que temos diariamente. Esse foi apenas um panorama geral sobre Design Patterns.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/design-patterns-e-o-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

