<?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; Boa prática</title>
	<atom:link href="http://www.refatorandopadroes.com.br/category/boa-pratica/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>Como uma mudança de cor me ajudou na usabilidade e a não refazer um layout</title>
		<link>http://www.refatorandopadroes.com.br/2007/08/09/como-uma-mudanca-de-cor-me-ajudou-na-usabilidade-e-a-nao-refazer-um-layout/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/08/09/como-uma-mudanca-de-cor-me-ajudou-na-usabilidade-e-a-nao-refazer-um-layout/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 13:09:40 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/2007/08/09/como-uma-mudanca-de-cor-me-ajudou-na-usabilidade-e-a-nao-refazer-um-layout/</guid>
		<description><![CDATA[Quem diria que um layout pré-aprovado pelo cliente seria sumariamente rejeitado na entrega do layout final. Atônito, já pensava em refazê-lo. É dura a vida de freelancer, nem posso pedir a um estagiário que refaça =D.
Antes de recomeçar, é sempre importante parar e pensar: "Onde está o erro, qual o problema desse layout ?", pense [...]]]></description>
			<content:encoded><![CDATA[<p>Quem diria que um layout pré-aprovado pelo cliente seria sumariamente rejeitado na entrega do layout final. Atônito, já pensava em refazê-lo. É dura a vida de freelancer, nem posso pedir a um estagiário que refaça =D.</p>
<p>Antes de recomeçar, é sempre importante parar e pensar: "Onde está o erro, qual o problema desse layout ?", pense como seu cliente, como ele gosta de ver sites e como é o seu público. Foi exatamente o que fiz, percebi que o meu cliente e também o público alvo do website possuem pelo menos mais de 45 anos e segundo suas próprias palavras "Este site parece coisa de gente jovem!"</p>
<p>Voltando no tempo, nas aulas de <a href="http://pt.wikipedia.org/wiki/Ihc" title="Interface Humano Computador">IHC</a> da faculdade, minha professora já tinha dito "Com o passar dos anos as pessoas vão ficando mais sensíveis às cores, portanto o vermelho que vemos hoje não é o mesmo que veremos amanhã, por isso os idosos acabam preferindo cores mais opacas", claro que há exceções, sempre existem idosos radicais =D</p>
<p>Na verdade o website não parecia muito de gente jovem, o problema foram as cores usadas que tinham tonalidades fortes para alguém mais velho.</p>
<p>Pois bem, lembrando disso minha alteração foi apenas abrir o <abbr title="Cascading Style Sheets">CSS</abbr> e diminuir as tonalidades das cores, deixa-as mais opacas e enviei ao cliente.</p>
<p>SUCESSO! Layout aprovado com honras. Nem perceberam que era o mesmo layout...</p>
<p>Portanto entendam seu cliente, pensem como ele, somente o cliente é capaz de fornecer dicas valiosas sobre o público alvo, depois disso façam o website pensando nesse público alvo. O conteúdo é a parte mais importante de um website, dedique sempre muito mais horas a isto mas não se esqueça da embalagem. Pensar em uma cor parece uma coisa boba, mas me salvou horas de retrabalho.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/08/09/como-uma-mudanca-de-cor-me-ajudou-na-usabilidade-e-a-nao-refazer-um-layout/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Deixe que o Apache processe todos os recursos estáticos</title>
		<link>http://www.refatorandopadroes.com.br/2007/08/06/deixe-que-o-apache-processe-todos-os-recursos-estaticos/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/08/06/deixe-que-o-apache-processe-todos-os-recursos-estaticos/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 12:02:25 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/2007/08/06/deixe-que-o-apache-processe-todos-os-recursos-estaticos/</guid>
		<description><![CDATA[Pagamos barato ao contratar um serviço de hospedagem em servidor compartilhado, mas também pagamos caro se não criarmos um aplicação enxuta. Por mais simples que seja cada requisição no servidor utiliza ciclos do processador e memória, se não tomarmos cuidado o servidor irá gentilmente matar nosso processo para o bem das demais aplicações.
Recentemente tive problemas [...]]]></description>
			<content:encoded><![CDATA[<p>Pagamos barato ao contratar um serviço de hospedagem em servidor compartilhado, mas também pagamos caro se não criarmos um aplicação enxuta. Por mais simples que seja cada requisição no servidor utiliza ciclos do processador e memória, se não tomarmos cuidado o servidor irá gentilmente matar nosso processo para o bem das demais aplicações.</p>
<p>Recentemente tive problemas com um website na <a href="http://www.dreamhost.com/r.cgi?287823/hosting.html" target="_blank">Dreamhost</a>, o processo estava sendo sumariamente assassinado, a princípio estranhei, por ser uma aplicação simples em Rails e era feito cache de boa parte das páginas. Uma conversa com o suporte técnico e me disseram que o website em questão estava gastando muita memória.</p>
<p>Cinco minutos depois o Google (sempre ele <img src='http://www.refatorandopadroes.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) já tinha uma solução para o meu caso. Eu simplesmente esqueci que existe o <a href="http://pt.wikipedia.org/wiki/Servidor_Apache" target="_blank">Apache</a> para servir minha aplicação web. Para variar, bastaria alterar o bom e velho .htaccess. Estava acontecento o seguinte: todas as requisições de imagens, pdfs, htmls estáticos, rhtml, etc,... tudo que fosse estático ou dinâmico era processado pelo fastcgi em Ruby, que é claro fica dedicado a minha aplicação e possui um limite de memória para não prejudicar o servidor.</p>
<p>Com isso bastou algumas alterações no .htaccess para dizer ao Apache que cuide de processar todas as requisições de recursos estáticos:</p>
<p>RewriteCond %{REQUEST_URI} ^/images/(.*)$<br />
RewriteCond %{REQUEST_URI} ^/javascripts/(.*)$<br />
RewriteCond %{REQUEST_URI} ^/stylesheets/(.*)$<br />
RewriteCond %{REQUEST_URI} ^/*.txt$<br />
RewriteCond %{REQUEST_URI} ^/*.xml$<br />
RewriteCond %{REQUEST_URI} ^/*.pdf$</p>
<p>E o problema foi resolvido, acompanhei os processos no servidor via ssh durante alguns dias e o uso de memória tinha diminuido assustadoramente, com isso tive tempo para estudar alguns outros detalhes para melhorar a aplicação.</p>
<p>Não tenho muita experiência em fazer melhorias no .htaccess, estejam a vontade para apontar outras melhorias.</p>
<p>E é isso, vou aproveitar e fazer uma propaganda da <a href="http://www.dreamhost.com/r.cgi?287823/hosting.html" target="_blank">Dreamhost</a> a qual até hoje só tenho elogios, muito eficientes e gentis no suporte, além do preço camarada e muita banda. A quem estiver interessado em criar uma conta por lá e ganhar um desconto de até 97 dólares, podem utilizar meu código de promoção: <a href="http://www.dreamhost.com/r.cgi?287823/hosting.html" target="_blank"><strong>REFATORANDO</strong></a>. Que me desculpem aqueles que acham que blog não deveria ter propaganda, nada na vida é de graça ^_^</p>
<p>Uma boa semana a todos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/08/06/deixe-que-o-apache-processe-todos-os-recursos-estaticos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Separando Javascript do HTML até demais</title>
		<link>http://www.refatorandopadroes.com.br/2007/06/18/separando-javascript-do-html-ate-demais/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/06/18/separando-javascript-do-html-ate-demais/#comments</comments>
		<pubDate>Mon, 18 Jun 2007 14:02:04 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=22</guid>
		<description><![CDATA[É interessante notar como alguns programadores seguem padrões com afinco, até as últimas consequências, onde houver código lá está ele impondo todos os padrões possíveis. Existe a boa prática em separar comportamento e apresentação, no caso de páginas HTML, os arquivos javascript são o comportamento e os arquivos CSS a apresentação, e o HTML faz [...]]]></description>
			<content:encoded><![CDATA[<p>É interessante notar como alguns programadores seguem padrões com afinco, até as últimas consequências, onde houver código lá está ele impondo todos os padrões possíveis. Existe a boa prática em separar comportamento e apresentação, no caso de páginas HTML, os arquivos javascript são o comportamento e os arquivos CSS a apresentação, e o HTML faz uso de ambos, como pode ser observado <a href="http://www.standardsforlife.com/standards-in-a-nutshell">aqui</a>.</p>
<p>Observem o exemplo:</p>
<div class="igBar"><span id="lhtml-6"><a href="#" onclick="javascript:showPlainTxt('html-6'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-6">
<div class="html">
<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: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"botão"</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"meuBotao"</span> <span style="color: #000066;">onclick</span>=<span style="color: #ff0000;">"meuEventoAqui()"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Algo que tem-se pregado por aí é retirar o totalmente o Javascript do HTML, ou seja, o exemplo acima ficaria assim:</p>
<div class="igBar"><span id="lhtml-7"><a href="#" onclick="javascript:showPlainTxt('html-7'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-7">
<div class="html">
<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: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"button"</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"meuBotao"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"botão"</span><span style="color: #000000; font-weight: bold;">&gt;</span></a></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>E teríamos um arquivo .js com o seguinte código para ligar o evento onclick do button:</p>
<div class="igBar"><span id="ljavascript-8"><a href="#" onclick="javascript:showPlainTxt('javascript-8'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVASCRIPT:</span>
<div id="javascript-8">
<div class="javascript">
<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: #003366; font-weight: bold;">function</span> ligacaoDeEventos<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <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: #003366; font-weight: bold;">var</span> botao = document.<span style="color: #006600;">getElementById</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'meuBotao'</span><span style="color: #66cc66;">&#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; botao.<span style="color: #006600;">onclick</span> = <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <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; &nbsp; &nbsp; finalmenteMeuEventoAqui<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#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; <span style="color: #66cc66;">&#125;</span></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: #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;">&nbsp; &nbsp;window.<span style="color: #000066;">onload</span> = ligacaoDeEventos; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Puxa vida, toda essa volta só para não usar a propriedade onclick no HTML e se livrar totalmente do Javascript, isso vale a pena ?</p>
<p>Há vários motivos para que eu não concorde com isso:</p>
<ul>
<li>Mais código para dar manutenção, foram criadas várias linhas de javascript para algo que funcionaria no primeiro exemplo usando a propriedade onclick da tag input.</li>
<li>E quando eu quiser saber qual evento o button aciona, será fácil de achar ? Podem haver vários objetos na página, todos com seus eventos ligados apenas no momento do onload da página. Vários objetos é igual a várias linhas de código javascript com as ligações, se você estiver usando um editor de textos comum, bem... boa sorte, e mesmo com uma IDE não é tão simples assim.</li>
<li>A propriedade onclick, onkeypress, etc faz parte da especificação HTML, justamente para facilitar isso, porque iria deixar de usá-los ?</li>
</ul>
<p>Então muito cuidado ao seguir padrões ao extremo, questione-os, cada um tem o seu lugar e hora certa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/06/18/separando-javascript-do-html-ate-demais/feed/</wfw:commentRss>
		<slash:comments>8</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>Classloader: como utilizar</title>
		<link>http://www.refatorandopadroes.com.br/2007/02/16/classloader-como-utilizar/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/02/16/classloader-como-utilizar/#comments</comments>
		<pubDate>Sat, 17 Feb 2007 01:46:44 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=10</guid>
		<description><![CDATA[É incrível como aprendemos algo novo todo dia, mesma que a lição venha de forma lenta e dolorosa... recentemente, em uma empresa onde presto serviços em Java, tivemos um problema com o DWR (tenho enorme paixão por este componente, o modo como fizeram a ponte entre Java e Javascript chega a ser mágico, é o [...]]]></description>
			<content:encoded><![CDATA[<p>É incrível como aprendemos algo novo todo dia, mesma que a lição venha de forma lenta e dolorosa... recentemente, em uma empresa onde presto serviços em Java, tivemos um problema com o <a href="http://getahead.ltd.uk/dwr" title="Componente AJAX" target="_blank">DWR</a> (tenho enorme paixão por este componente, o modo como fizeram a ponte entre Java e Javascript chega a ser mágico, é o estado da arte em uso de Javascript, mas isso fica pra outro 'post'... =D)</p>
<p>Pois bem, o problema foi ocasionado durante testes de migração pra o JBoss 4.x, a inicialização do DWR  estava falhando, não conseguia de forma alguma encontrar as classes informadas em seu arquivo de configuração xml, o famigerado <a href="http://java.sun.com/javase/6/docs/api/java/lang/NoClassDefFoundError.html" title="Exception classe não encontrada" target="_blank">NoClassDefFoundError</a>, algo que não apresentava problemas no JBoss 3.x. Após olhar em empacotamento, meta-infs, jars, configurações do JBoss, nada, nenhuma pista, nem o Google ajudou. O jeito foi descer mais fundo, ler o código fonte do DWR. A linha onde o erro ocorre, executa apenas um carregamento de classe:</p>
<p>this.classDefinition = Class.forName(className) ;</p>
<p>A classe é guardada para que possa ser instanciada por reflexão posteriormente, o interessante é que tudo isso ocorre na inicialização do JBoss, depois que a aplicação levanta, tentamos via debugger, executar o mesmo comando e voilá... funcionava perfeitamente... o que raios estava acontecendo ? Não sabíamos....</p>
<p>Bom, não teve jeito, a classe do DWR  teve de ser alterada para testar outra possibilidade de carregamento. Com isso trocamos a linha para:</p>
<p>this.classDefinition = Thread.currentThread().getContextClassLoader().loadClass(className);</p>
<p>Linha monstruosa.... mas funcionou!</p>
<p>Boa prática aprendida: o Class.forName() não sobe na hierarquia de ClassLoader, fica apenas no ClassLoader local, enquanto o ClassLoader.loadClass() sim, ou seja, por questão de robustez e boa prática, sempre utilize a segunda forma, para não ficar com cara de "ué", quando este tipo de problema surgir.</p>
<p>Mas por que no JBoss 3.x funcionava e no 4.x não ? A resposta é que o ClassLoader o 4.x foi reescrito para ficar mais aderente as especificações, com isso o Class.forName() pegou todo mundo desprevinido, houve claras reclamações da comunidade, mas temos que viver com isso..., existem práticas a serem seguidas.</p>
<p>Ainda bem que não tivemos que usar o código alterado do DWR, estávamos na versão 1.1.3, por curiosidade, baixei a versão estável mais recente (1.1.4) e pra minha grata surpresa essa linha já havia sido alterada do mesmo modo que fizemos <img src='http://www.refatorandopadroes.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , só fiquei chateado por essa alteração não estar presente no release notes, teria me economizado tempo durante busca por pistas...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/02/16/classloader-como-utilizar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
