<?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>Refatorando Padrões &#187; Padrões</title>
	<atom:link href="http://www.refatorandopadroes.com.br/category/padroes/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.refatorandopadroes.com.br</link>
	<description>Programação orientada às melhores práticas</description>
	<lastBuildDate>Mon, 03 Sep 2007 12:40:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Todos os dados na sessão, afinal memória é infinita</title>
		<link>http://www.refatorandopadroes.com.br/2007/09/03/todos-os-dados-na-sessao-afinal-memoria-e-infinita/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/09/03/todos-os-dados-na-sessao-afinal-memoria-e-infinita/#comments</comments>
		<pubDate>Mon, 03 Sep 2007 12:40:10 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/2007/09/03/todos-os-dados-na-sessao-afinal-memoria-e-infinita/</guid>
		<description><![CDATA[O título é brincadeira, mas reflete bem a realidade, é muito comum encontrar aplicações web que simplesmente acreditam que todos os dados podem ser guardados na sessão. Que a medida que os usuários tem sua sessão invalidada, o garbage collector irá cuidar de destruir tudo.
Este tipo de problema não existiria se a aplicação fosse usada [...]]]></description>
			<content:encoded><![CDATA[<p>O título é brincadeira, mas reflete bem a realidade, é muito comum encontrar aplicações web que simplesmente acreditam que todos os dados podem ser guardados na sessão. Que a medida que os usuários tem sua sessão invalidada, o garbage collector irá cuidar de destruir tudo.</p>
<p>Este tipo de problema não existiria se a aplicação fosse usada por alguns poucos usuários. Tentem imaginar centenas de atendentes de telemarketing, trabalhando continuamente, entrando em todas as telas possíveis do sistema, executando todo o tipo de ações, e em cada ação mais e mais dados na sessão que somente serão retirados após 6 horas de jornada de trabalho (ou pelo menos deveriam ser 6 horas perante a lei trabalhista, não vou entras nestes detalhes =D). Mas e aí, nestas condições, quanto tempo até chegarmos a um OutOfMemory ?</p>
<p>É muito fácil colocar algo na sessão, por exemplo a lista de cidades de um estado, se a intenção é ajudar no desempenho, esta é a pior estratégia que se pode escolher. Para isso que existem excelentes técnicas de caching e várias bibliotecas que as implementam, a qual garantirá que existe apenas uma única lista em cache para qualquer usuário, além de implementar o padrão <a href="http://pt.wikipedia.org/wiki/Observer" title="Design pattern Observer">Observer</a> para possíveis alterações na lista.</p>
<p>Claro que não estou dizendo que devemos banir o uso de sessões, muito pelo contrário, devemos usá-la, mas tome o cuidado de gerenciar o conteúdo. Um meio simples de se fazer isso é controlar todas as requisições via <a href="http://java.sun.com/products/servlet/Filters.html" title="Servlet Filter API">Servlet Filter</a> em Java ou <a href="http://api.rubyonrails.com/classes/ActionController/Filters/ClassMethods.html" title="Rails Filter">Filters</a> em Rails, colocando/retirando dados conforme a necessidade.</p>
<p>Tão ruim quanto já colocar tudo na sessão é utilizar péssimas chaves, por exemplo:</p>
<div class="igBar"><span id="ljava-2"><a href="#" onclick="javascript:showPlainTxt('java-2'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVA:</span>
<div id="java-2">
<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;">session.<span style="color: #006600;">setAttribute</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"customerId"</span>, id<span style="color: #66cc66;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Não sabemos de onde veio isso, para onde vai e pior ainda, alguma outra ação pode sobrescrever este valor. Sem uma identificação correta, nem um controle com filtros vai ajudá-lo.</p>
<p>Pensem duas vezes antes de usar o escopo session, em boa parte dos casos usar os escopos page e request é suficiente, analisem cada situação, vai tomar pouquíssimo tempo e cada bit de memória economizado é bem vindo. Há o velho pensamento: "Depois faço um profiling para eliminar alguns gargalos", isto só irá trazer várias dores de cabeça em um código session-macarrônico.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/09/03/todos-os-dados-na-sessao-afinal-memoria-e-infinita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usabilidade em preenchimento de formulário complexos</title>
		<link>http://www.refatorandopadroes.com.br/2007/07/30/usabilidade-em-preenchimento-de-formulario-complexos/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/07/30/usabilidade-em-preenchimento-de-formulario-complexos/#comments</comments>
		<pubDate>Mon, 30 Jul 2007 11:44:09 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=7</guid>
		<description><![CDATA[    Continuando com o assunto do artigo anterior, vou procurar demonstrar como um layout de formulário complexo pode alcançar melhor usabilidade com simples mudanças de posicionamento dos campos e rótulos (labels).
Suponhamos este exemplo de formulário abaixo.

Detalhe importante: o formulário acima não parece complexo pois é um pequeno exemplo com alguns campos para [...]]]></description>
			<content:encoded><![CDATA[<p>    Continuando com o assunto do <a href="http://www.refatorandopadroes.com.br/2007/07/23/usabilidade-em-preencimento-de-pequenos-formularios/" rel="nofollow" title="Usabilidade em preenchimento de pequenos formulários">artigo anterior</a>, vou procurar demonstrar como um layout de formulário complexo pode alcançar melhor usabilidade com simples mudanças de posicionamento dos campos e rótulos (labels).</p>
<p>Suponhamos este exemplo de formulário abaixo.</p>
<p><a href="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-3.png" title="Exemplo de formulário complexo não reestilizado"><img src="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-3.png" alt="Exemplo de formulário complexo não reestilizado" /></a></p>
<p>Detalhe importante: o formulário acima não parece complexo pois é um pequeno exemplo com alguns campos para ajudar no entendimento do artigo, seria inútil criar um enorme cadastro sendo que o importante é o princípio que vou demonstrar =D.</p>
<p>Antes de criar o layout de um formulário desse tipo, devemos nos fazer duas perguntas:</p>
<p><strong>É um formulário que o usuário irá utilizar constantemente ?</strong></p>
<p>Se a resposta for sim então imaginem um típico trabalhador de almoxarifado, ele recebe várias notas fiscais todos os dias para dar entrada no sistema, ele já conhece de cabo a rabo, na sequência, todos os campos a serem digitados. Ou seja, o formulário fica melhor se for cada campo e rótulo em uma linha, exatamente como no <a href="http://www.refatorandopadroes.com.br/2007/07/23/usabilidade-em-preencimento-de-pequenos-formularios/" rel="nofollow" title="Usabilidade em preenchimento de pequenos formulários">artigo anterior</a>, para que ele faça tudo sempre na mesma sequência. Automatize isso na mente dele.</p>
<p>Se a resposta for não então voltemos ao exemplo do formulário acima. Vamos supor que ele esteja disponível ao público. Nesse caso, o formato tem que ser mais defensivo, deixar a pessoa informada sobre o que é preciso para preenchê-lo. Exemplo remodelado:</p>
<p><a href="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-4.png" title="Exemplo de formulário complexo reestilizado"><img src="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-4.png" alt="Exemplo de formulário complexo reestilizado" /></a></p>
<p>Cada rótulo e campo juntos ocupam uma linha sozinhos, todos os rótulos no mesmo alinhamento à esquerda, assim como os campos. O que vai acontecer aqui é o seguinte, o usuário vai prestar atenção primeiro no que está escrito nos rótulos. Indo de cima para baixo ele irá ler "nome, rg, cic, etc" sem dar a mínima atenção para os campos. Por consequência, ele irá se preparar para o preenchimento deles e até mesmo pensar: "preciso dos meus documentos antes de começar". Aí sim, ele volta ao início de tudo, presta atenção no rótulo na esquerda e preenche o campo na direita, desce uma linha e prossegue assim até o fim, na mesma sequência de movimentação dos olhos.</p>
<p>Se tivesse utilizado o esquema de layout do <a href="http://www.refatorandopadroes.com.br/2007/07/23/usabilidade-em-preencimento-de-pequenos-formularios/" rel="nofollow" title="Usabilidade em preenchimento de pequenos formulários">artigo anterior</a>, a pessoa ia ter a leitura dos rótulos atrapalhada pelos campos, e não se "preparia" para o preenchimento, esse "preparo" forçado é bom pois o usuário nunca viu este formulário.</p>
<p>Há um espaço em branco entre cada rótulo e campo, procurem minimizar este espaço não colocando rótulos de comprimento muito desiguais, pois atrapalharia a concentração na leitura da esquerda para direita.</p>
<p><strong>É um formulário que pode ser agrupado em formulários menores ?</strong></p>
<p>No exemplo, observem que podemos agrupar os campos:</p>
<p><a href="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-5.png" title="Exemplo de formulário complexo reestilizado e agrupado"><img src="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-5.png" alt="Exemplo de formulário complexo reestilizado e agrupado" /></a></p>
<p>Em um grupo temos os dados pessoais e em outro grupo temos os dados de usuário. É muito importante fazer essa separação, mantêm o usuário focado em um pequeno assunto dentro do formulário. Procurem colocar uma demarcação visual para separar estes agrupamentos, sem nunca esquecer as regras de posicionamento dos campos, mesmo nestes formulários menores, mantenham um padrão.</p>
<p>Claro que podemos ajudar ainda mais, é imprescindível colocar pequenas dicas e ajudas de preenchimento, mas nosso foco aqui no artigo é posicionamento dos objetos no formulário, fica para um futuro artigo falar sobre estes pequenos auxílios visuais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/07/30/usabilidade-em-preenchimento-de-formulario-complexos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Usabilidade em preencimento de pequenos formulários</title>
		<link>http://www.refatorandopadroes.com.br/2007/07/23/usabilidade-em-preencimento-de-pequenos-formularios/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/07/23/usabilidade-em-preencimento-de-pequenos-formularios/#comments</comments>
		<pubDate>Mon, 23 Jul 2007 12:43:49 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=27</guid>
		<description><![CDATA[Usabilidade para mim era o mesmo que design, nunca me importei com a melhoria delas no sentido de ajudar o usuário. O tempo passou e fui percebendo as dificuldades encontradas até mesmo em preenchimentos de formulários simples. Na minha arrogância, imaginei que fosse problema das pessoas em se adaptarem ao sistema, até que Jakob Nielsen [...]]]></description>
			<content:encoded><![CDATA[<p>Usabilidade para mim era o mesmo que design, nunca me importei com a melhoria delas no sentido de ajudar o usuário. O tempo passou e fui percebendo as dificuldades encontradas até mesmo em preenchimentos de formulários simples. Na minha arrogância, imaginei que fosse problema das pessoas em se adaptarem ao sistema, até que <a href="http://en.wikipedia.org/wiki/Jakob_Nielsen_%28usability_consultant%29" title="Sobre Jakob Nielsen" target="_blank">Jakob Nielsen</a> finalmente <a href="http://www.useit.com/jakob/webusability" title="Designing Web Usability">abriu meus olhos</a>.</p>
<p>Vejamos um exemplo:</p>
<p><a href="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-1.png" title="Exemplo usabilidade"><img src="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-1.png" alt="Exemplo usabilidade" /></a></p>
<p>Parece um inocente formulário, dados simples e fáceis de serem preenchidos, mas por um momento tente mentalmente preencher este formulário. Normalmente nossos olhos vão de cima para baixo, da esquerda para direita, mas por algumas vezes voltamos para  verificar se preenchemos os dados anteriores e quando terminamos essa verificação temos que lembrar onde paramos. Mesmo após preencher tudo não sabemos exatamente onde focar nossa atenção.</p>
<p>É muito comum encontrarmos formulários assim, o designer tenta preencher todos os buracos vazios na tela, criar uma estética simétrica, sem pensar que o usuário irá interagir com esses campos.</p>
<p>As normas da usabilidade recomendam a forma abaixo para expor os campos para preenchimento:</p>
<p><a href="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-2.png" title="Exemplo de usabilidade em formulário (correto)"><img src="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/07/usability-2.png" alt="Exemplo de usabilidade em formulário (correto)" /></a></p>
<p>A mudança é simples, cada campo e rótulo (label) ocupa sozinho uma linha, o usuário fará apenas uma única leitura de cima para baixo, sem chances de dispersar os olhos. Ele lê o rótulo, preenche o campo e segue para o rótulo seguinte até chegar no botão enviar. Muito mais rápido para preenchimento, o usuário foca em uma única informação por vez.</p>
<p>Claro que ficou um buraco branco no formulário, mas se formos criativos no design, o buraco branco será facilmente disfarçado.</p>
<p>Lembrem-se, quanto mais rápido e fácil um usuário preencher um formulário, mais chance temos que ele compre nossos produtos =D. Preencher formulários é tedioso, se o usuário sentir que é difícil continuar com o preenchimento ele não vai pedir ajuda para a atendente online, vai simplesmente comprar no site do concorrente. Sempre que possível procurem fazer um teste com pessoas não técnicas para preenchimento de seus formulários.</p>
<p>O que demonstrei acima é válido para formulários rápidos e comuns, como preenchimento de endereço. Para formulários mais complexos a recomendação é outra, no próximo post vou continuar com esta explicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/07/23/usabilidade-em-preencimento-de-pequenos-formularios/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>The way of Testivus, um pequeno e gratuito ensinamento sobre testes</title>
		<link>http://www.refatorandopadroes.com.br/2007/06/22/the-way-of-testivus-um-pequeno-e-gratuito-ensinamento-sobre-testes/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/06/22/the-way-of-testivus-um-pequeno-e-gratuito-ensinamento-sobre-testes/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 11:30:22 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=24</guid>
		<description><![CDATA[Como de costume estava lendo vários posts via Google Reader (infelizmente também abandonei o Bloglines devido a vários incômodos bugs), quando me deparei com este post
O livro para download gratuito é simplesmente  simples e simpático e o modo como TDD é mostrado encanta.
Não entendo a insistência de muitos programadores em não criar testes, o [...]]]></description>
			<content:encoded><![CDATA[<p>Como de costume estava lendo vários posts via Google Reader (infelizmente também abandonei o Bloglines devido a vários incômodos bugs), quando me deparei com este <a href="http://searchsoftwarequality.techtarget.com/general/0,295582,sid92_gci1261688,00.html" title="The way of Testivus" target="_blank">post</a></p>
<p>O livro para <a href="http://www.refatorandopadroes.com.br/wp-content/uploads/2007/06/thewayoftestivus.pdf" title="The way of Testivus">download gratuito</a> é simplesmente  simples e simpático e o modo como <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank"><acronym title="Test Driven Development">TDD</acronym></a> é mostrado encanta.</p>
<p>Não entendo a insistência de muitos programadores em não criar testes, o tempo que se gasta agora criando testes vai impedir que vários erros e transtornos com o cliente surjam no futuro, o custo é muito menor agora.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/06/22/the-way-of-testivus-um-pequeno-e-gratuito-ensinamento-sobre-testes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Refatorar é melhorar e reaproveitar código, não tenha medo</title>
		<link>http://www.refatorandopadroes.com.br/2007/06/04/refatorar-e-melhorar-e-reaproveitar-codigo-nao-tenha-medo/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/06/04/refatorar-e-melhorar-e-reaproveitar-codigo-nao-tenha-medo/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 15:35:47 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=21</guid>
		<description><![CDATA[Não sei se um dia vou entender qual o medo das pessoas em aceitar mudanças, ainda mais em pessoas da área de informática. Elas são inevitáveis, é a evolução. Quando chega o momento em que deve-se alterar código que já está funcionando, é praticamente um "parto" convencer outros de que isso é bom.
Martin Fowler, em [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei se um dia vou entender qual o medo das pessoas em aceitar mudanças, ainda mais em pessoas da área de informática. Elas são inevitáveis, é a evolução. Quando chega o momento em que deve-se alterar código que já está funcionando, é praticamente um "parto" convencer outros de que isso é bom.</p>
<p><a href="http://www.martinfowler.com">Martin Fowler</a>, em seu famoso livro <a href="http://www.martinfowler.com/books.html#refactoring">Refactoring: Improving the design of Existing Code</a> (em português "Refatoração: Aperfeiçoando o Projeto de Código Existente"), já dizia que refatorar é: "modificar um sistema de modo que seu comportamento não se altere, mas que sua arquitetura melhore, fique mais limpa". Um dos meus livros prediletos, praticamente livro de cabeceira. Inúmeras técnicas de como melhorar seu código.</p>
<p>É muito comum encontrarmos código duplicado, e mais comum ainda observar que o programador não reaproveitou o código porque precisava refatorá-lo, por puro medo de "quebrar" outra parte do  sistema. Oras, pra isso existe <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD (Test Driven Development)</a>, se criássemos testes não haveria nenhum medo em quebrar outras partes do sistema, as quebras seriam imediatamente visíveis. E refatorar ficou ainda muito mais simples com as IDEs atuais, qualquer uma possui mecanismos poderosos para auxiliar esta tarefa.</p>
<p>Refatorar nosso código, mesmo código antigo, constitui menos manutenção no futuro, pois refatorar é também diminuir a complexidade e quantidade de código. As partes duplicadas no sistema, se contiverem quaisquer erro ou necessidade de mudança na regra de negócios, vai realmente tirar seu sono, pois obviamente nunca sabemos onde estão as cópias. Uma regra de negócio ou erro poderia ter sido resolvido com uma única "martelada" no lugar certo em um código "enxuto".</p>
<p>Então sem medo de refatorar, você não está perdendo tempo agora, está na verdade economizando tempo de manutenção.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/06/04/refatorar-e-melhorar-e-reaproveitar-codigo-nao-tenha-medo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uma documentação padronizada garante novos usuários em qualquer framework</title>
		<link>http://www.refatorandopadroes.com.br/2007/05/14/uma-documentacao-padronizada-garante-novos-usuarios-em-qualquer-framework/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/05/14/uma-documentacao-padronizada-garante-novos-usuarios-em-qualquer-framework/#comments</comments>
		<pubDate>Mon, 14 May 2007 14:08:14 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=19</guid>
		<description><![CDATA[Vejo muitos que programam perfeitamente, orientado a objetos, seguindo padrões a risca. Comentam entusiasticamente em fóruns sobre seus novos frameworks, linguagens e bibliotecas, querem é claro, angariar novos adeptos. De fato, boa parte desses projetos são maravilhosos em suas descrições, isso quando há uma descrição...
O ponto onde quero chegar é que na maioria dos projetos [...]]]></description>
			<content:encoded><![CDATA[<p>Vejo muitos que programam perfeitamente, orientado a objetos, seguindo padrões a risca. Comentam entusiasticamente em fóruns sobre seus novos frameworks, linguagens e bibliotecas, querem é claro, angariar novos adeptos. De fato, boa parte desses projetos são maravilhosos em suas descrições, isso quando há uma descrição...</p>
<p>O ponto onde quero chegar é que na maioria dos projetos que vejo, a documentação é escassa, não há tutoriais ou documentação sequer no código fonte.</p>
<p>Quanto a documentação em código, eu reconheço o que <a href="http://blog.interface21.com/main/author/rodj/">Rod Johnson</a>, criador do <a href="http://www.springframework.org/">Spring</a>, sabiamente afirmou em seu célebre livro <a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764543857.html">Expert One-on-One J2EE Design and Development</a>, um código bem escrito, seguindo padrões claros, sem classes, métodos ou variáveis obscuros, não necessita de documentação, o código fala por si, qualquer programador olha e entende sem medo, mas isso serve somente para quem participa do projeto.</p>
<p>O problema é que ninguém está interessado em olhar dúzias e dúzias de classes para entender como usar. São necessários tutoriais e documentação farta para que consigamos manter alguém usando o que criamos, por melhor que ela seja.</p>
<p>O criador se desespera, óbvio que para muitos é maçante documentar código, mas é necessário, e não é preciso escrever duas vezes, uma em código e outra em documentação pública. São muitas as ferramentas que resolvem o problema. Mas lembre-se que é necessário documentar seguindo padrões, para o pessoal de Java, use JavaDoc, embora limitado/criticado por muitos, é muito fácil de ser utilizado, quantos já não recorreram a documentação do JDK, alguém teria a paciência de ter lido o código ? Eu já tive que ler código várias vezes em muitos frameworks sem documentação, sendo que um mero comentário explicativo na documentação da classe teria resolvido o problema rapidamente.</p>
<p>Eu não sou muito fã da Microsoft, mas tenho que dar o braço a torcer, felizes os usuários do <a href="http://msdn2.microsoft.com/en-us/library/aa155073.aspx">MSDN</a>, quando necessito tirar uma dúvida quanto ao uso de CSS, HTML, ou outras áreas relacionadas, vou direto nele, tudo bem explicado e com ótimos exemplos. A Microsoft pode até não abrir o código fonte de suas ferramentas, mas ela compensa muito bem isso fornecendo aos seus usuários toda a documentação necessária para utilizá-la.</p>
<p>Então na próxima vez que alguém reclamar que seu framework é complicado, para e pense um pouco? "Será que tenho bons tutoriais e documentação ? Será que descrevi de forma concisa o que ele faz ?". Não espere que o usuário simplesmente baixe e fique tentando adivinhar como usar, não o chame de estúpido, o código do framework/biblioteca é simples para você que criou.</p>
<p>O usuário terá que perder um tempo precioso estudando, e a não ser que seja algo revolucionário, existem alternativas para vários frameworks/bibliotecas. Temos que aprender a cada dia, cada vez mais, não temos tempo a perder tentando adivinhar o que foi codificado. Queremos algo claro e rápido, bem documentado, para finalmente decidir se vale a pena investir tempo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/05/14/uma-documentacao-padronizada-garante-novos-usuarios-em-qualquer-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como a filosofia de convenção ao invés de configuração do Rails enganou um novato</title>
		<link>http://www.refatorandopadroes.com.br/2007/03/28/como-a-filosofia-de-convencao-ao-inves-de-configuracao-do-rails-enganou-um-novato/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/03/28/como-a-filosofia-de-convencao-ao-inves-de-configuracao-do-rails-enganou-um-novato/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 14:21:06 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=13</guid>
		<description><![CDATA[Há cerca de 3 meses resolvi me aventurar no mundo da linguagem Ruby, embora estivesse curioso há um bom tempo, foi mais por necessidade do que curiosidade, e como não poderia deixar de ser, utilizando o framework Rails. Só tenho a dizer o quanto a dupla Ruby+Rails me surpreende a cada dia, mas não é [...]]]></description>
			<content:encoded><![CDATA[<p>Há cerca de 3 meses resolvi me aventurar no mundo da linguagem Ruby, embora estivesse curioso há um bom tempo, foi mais por necessidade do que curiosidade, e como não poderia deixar de ser, utilizando o framework Rails. Só tenho a dizer o quanto a dupla Ruby+Rails me surpreende a cada dia, mas não é por isso que deixarei de utilizar Java, prefiro trabalhar com ambas as linguagens, escolhendo a que melhor convier ao projeto, prazo, custo e hospedagem, mas esta história fica pra outro post.</p>
<p>Como todo novato, apanhei feio no início, e é claro ainda estou tropeçando, mas o que mais me fez rir foi não ficar atento a filosofia do Rails de "convenção ao invés de configuração", ou seja, seguir padrões de nomes de métodos, classes, estrutura de diretórios, etc. Há um "jeito" certo de se estruturar o código seguindo esta filosofia, e quando você sai dela é que sua dor de cabeça começa, é normal encontrar pessoas zangadas com erros estranhos que só acontecem por não ter seguido as regras. As pessoas ficam bravas pois estão acostumados a seguir um modo rotineiro de estruturação. Bem estas pessoas que se adaptem às coisas novas. Pessoalmente se um framework segue "convenção ao invés de configuração" já consegue me atrair logo de cara pois eu entendo isso como "me faça ter menos trabalho pra utilizar você".</p>
<p>O meu erro foi ter "apenas" criado no modelo uma coluna com nome "type". O que eu não sabia, é que para o Rails, uma coluna "type", é reservada automaticamente para salvar o class-name do objeto na tabela, para caso você necessitar de um <a href="http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html" title="Modelo de herança simples" target="_blank">modelo de herança simples</a>. Vamos supor um objeto Cachorro e outro Gato, ambas descendem do objeto Animal, mas há uma única tabela (Animal) para salvar Cachorro e Gato, a coluna "type" seria automaticamente preenchida com o class-name correspondente do objeto, para que ao consultar o registro, o Rails saiba que objeto deve criar. Óbvio que esta não era minha intenção, após ver sucessivas vezes o erro ":in `instance_eval': compile error" e consultar a documentação, descobri o motivo.</p>
<p>Não posso culpar o Rails, é um padrão dele, assim como outros nomes também são reservados como created_at e id, são os chamados <a href="http://wiki.rubyonrails.org/rails/pages/MagicFieldNames" title="Magic Fields" target="_blank">MagicFieldNames</a>. Resumindo: ao trabalhar com "convenção ao invés de configuração" lembrem-se sempre de olhar quais convenções são estas, vai te prevenir muitos erros e com certeza vai aumentar em muito sua produtividade, afinal o padrão está lá pra ser seguido.</p>
<p>Ah sim, caso você realmente precise de uma coluna chamada type para outros fins, basta sobrescrever o seguinte método no modelo:</p>
<p>def self.inheritance_column<br />
"&lt;nome da coluna a ser utilizada ao invés de type&gt;"<br />
end</p>
<p>Pronto, agora o Rails utilizará esta coluna para salvar o class-name e a type fica livre para fazer o que melhor convier, embora eu não recomende fazer isso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/03/28/como-a-filosofia-de-convencao-ao-inves-de-configuracao-do-rails-enganou-um-novato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nem Java suporta métodos gordinhos</title>
		<link>http://www.refatorandopadroes.com.br/2007/02/25/nem-java-suporta-metodos-gordinhos/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/02/25/nem-java-suporta-metodos-gordinhos/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 08:42:35 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[JSP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=11</guid>
		<description><![CDATA[Fato interessante ocorreu com uma amiga que estava trabalhando em um JSP enorme, bem que poderia haver menos dados a serem mostrados, mas não sou eu quem decido... enfim... lá pelas tantas, o compilador começou a reclamar de "code too large", caramba como assim ? Era inserir mais um caracter e dava erro, tirava o [...]]]></description>
			<content:encoded><![CDATA[<p>Fato interessante ocorreu com uma amiga que estava trabalhando em um JSP enorme, bem que poderia haver menos dados a serem mostrados, mas não sou eu quem decido... enfim... lá pelas tantas, o compilador começou a reclamar de "code too large", caramba como assim ? Era inserir mais um caracter e dava erro, tirava o caracter e funcionava...</p>
<p>Bom não tem jeito, Google ao resgate... minutos depois problema  encontrado e resolvido, o que ocorre é um limitação imposta pelo próprio compilador, um método em Java pode ter um tamanho máximo de 65534 bytes, portanto quando o JSP era convertido em Servlet acabava gerando esse método monstrinho gordinho, mais informações sobre este e outros limites você encontra aqui na <a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html" title="Especificação da VM" target="_blank">especificação da Virtual Machine</a>.</p>
<p>Para resolver o problema foi necessário, adivinhem ? Simmmm, REFATORAR..... basta dividir o JSP em arquivos menores que façam mais sentido e uni-los com &lt;jsp:include&gt;. Para ajudar ainda mais não se esqueça de utilizar padrões web para o HTML gerado, mais tableless, o código fica muito mais enxuto, e quando possível, pense bem antes de criar uma tela com tantos dados, para uma melhor usabilidade.</p>
<p>Claro que, embora seja uma limitação imposta pelo compilador, NUNCA crie um método tão grande, isso vale para qualquer linguagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/02/25/nem-java-suporta-metodos-gordinhos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quando uma imagem vale mais que mil palavras</title>
		<link>http://www.refatorandopadroes.com.br/2007/02/15/quando-uma-imagem-vale-mais-que-mil-palavras/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/02/15/quando-uma-imagem-vale-mais-que-mil-palavras/#comments</comments>
		<pubDate>Thu, 15 Feb 2007 03:14:05 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=9</guid>
		<description><![CDATA[    Certa vez, Nelson, um colega de trabalho, me passou pelo MSN um arquivo entitulado "Standards in a Nutshell.pdf", abri-o, e como de costume para todo o livro que vejo pela primeira vez, tentei ir direto ao índice, nem paro para ver a capa. Qual não foi minha frustração quando vi que [...]]]></description>
			<content:encoded><![CDATA[<p>    Certa vez, Nelson, um colega de trabalho, me passou pelo MSN um arquivo entitulado "Standards in a Nutshell.pdf", abri-o, e como de costume para todo o livro que vejo pela primeira vez, tentei ir direto ao índice, nem paro para ver a capa. Qual não foi minha frustração quando vi que o PDF só tinha uma única página.</p>
<p>"Nelson, acho que aconteceu algum problema, o PDF abriu mas só tem uma página aqui!"</p>
<p>Pensei: "Bom enquanto ele não responde vou dar uma olhada na capa". Pra minha surpresa, ao vislumbrar a imagem abaixo, percebi que nada havia de errado com o arquivo, lá estava tudo o que precisava ser dito, ou no caso mostrado =D, sobre padrões em um página HTML.</p>
<p><a href="http://www.refatorandopadroes.wordpress.com/?attachment_id=7" rel="attachment wp-att-7" title="Standards in a Nutshell"><img src="http://www.refatorandopadroes.wordpress.com/files/2007/02/pattern2.png" alt="Standards in a Nutshell" height="824" width="542" /></a></p>
<p>Simples assim.</p>
<p>Tudo que eu já havia lido sobre padrões nessa área, tudo o que muitas pessoas de bom senso pregam como ideal, está aí. Ao invés de um calhamaço de 600 páginas, uma imagem que é compreendida em alguns segundos.</p>
<p>Javascript, CSS e HTML separados. Quem dera todos os designers fizessem isso, as vantagens são absurdas: menos consumo de banda, afinal os mesmos arquivos de CSS e Javascript serão usados em todos os outros arquivos HTML, reusabilidade e o principal, um padrão de separação entre o comportamento e apresentação da página, maravilhas das maravilhas para futuras manutenções. Basta apenas ligar os arquivos .css e .js com uma tag no arquivo HTML e pronto.</p>
<p>É claro que não poderia deixar de dar crédito a autora pela obra de arte.<a href="http://www.standardsforlife.com/standards-in-a-nutshell" title="Blog Standards For Life" target="_blank"></a></p>
<p><a href="http://www.standardsforlife.com/standards-in-a-nutshell" title="Blog Standards For Life" target="_blank">Standards For Life</a></p>
<p>Preciso criar um cartaz  bem grande com isso, talvez alguém olhe e crie juízo. =D</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/02/15/quando-uma-imagem-vale-mais-que-mil-palavras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O pior anti-pattern de todos: God object</title>
		<link>http://www.refatorandopadroes.com.br/2007/02/11/o-pior-anti-pattern-de-todos-god-object/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/02/11/o-pior-anti-pattern-de-todos-god-object/#comments</comments>
		<pubDate>Sun, 11 Feb 2007 21:19:46 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=5</guid>
		<description><![CDATA[    Nada melhor, quando aprendendo sobre um assunto novo, do que saber o que NÃO fazer. Anti-pattern (Anti-padrões), nada mais são do que programar contra a reusabilidade e flexibilidade.
Óbvio que não é possível programar com a melhor flexibilidade e reusabilidade, aliás nem devemos tentar, como já disse Tony Hoare: "Premature optimization is the root of [...]]]></description>
			<content:encoded><![CDATA[<p>    Nada melhor, quando aprendendo sobre um assunto novo, do que saber o que <strong>NÃO</strong> fazer. Anti-pattern (Anti-padrões), nada mais são do que programar contra a reusabilidade e flexibilidade.</p>
<p>Óbvio que não é possível programar com a melhor flexibilidade e reusabilidade, aliás nem devemos tentar, como já disse <strong><a href="http://en.wikipedia.org/wiki/C._A._R._Hoare" title="Sobre Tony Hoare" target="_blank">Tony Hoare</a>: </strong><em>"Premature optimization is the root of all evil" </em>("Otimização prematura é a raiz de todo mal"). Mas devemos sim estar atentos a código inútil, mal escrito ou ambos. É aí que entra o que considere o pior dos anti-patterns. O <a href="http://en.wikipedia.org/wiki/God_object" title="Definição de God object" target="_blank">God object</a>, o objeto que faz tudo, ele é onisciente, conhece a todos e todos dependem dele, assobia e chupa cana ao mesmo tempo, são classes com milhares de linhas, e o pior de tudo, assim como o próprio Deus, ninguém sabe de onde veio e nem para onde vai, mas com certeza levará todo o sistema junto em colapso.<strong><br />
</strong></p>
<p>Muito cuidado com esse tipo de objeto, se você notar que sua classe ou mesmo um único método está fazendo mais do que uma tarefa, pare... reflita... e RE-FA-TO-RE, nunca tenha medo de mexer no que está feito, lembre-se que alguns instantes refatorando lhe trará muitos benefícios no futuro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/02/11/o-pior-anti-pattern-de-todos-god-object/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
