<?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; Anti-patterns</title>
	<atom:link href="http://www.refatorandopadroes.com.br/category/anti-patterns/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>Criando um booleano de três estados</title>
		<link>http://www.refatorandopadroes.com.br/2007/03/25/criando-um-booleano-de-tres-estados/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/03/25/criando-um-booleano-de-tres-estados/#comments</comments>
		<pubDate>Sun, 25 Mar 2007 13:19:47 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=12</guid>
		<description><![CDATA[Antes de tudo este post não vai falar sobre física quântica, o objeto Boolean continua sendo aquele já conhecido por nós, mas vou falar sobre um anti-pattern que com certeza fez o Sr. Boole revirar no túmulo e que pessoalmente ainda me causa pesadelos.
Eu estava trabalhando em um módulo de um projeto, a certa altura [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de tudo este post não vai falar sobre física quântica, o objeto Boolean continua sendo aquele já conhecido por nós, mas vou falar sobre um anti-pattern que com certeza fez o <a href="http://en.wikipedia.org/wiki/Boole" title="George Boole" target="_blank">Sr. Boole</a> revirar no túmulo e que pessoalmente ainda me causa pesadelos.</p>
<p>Eu estava trabalhando em um módulo de um projeto, a certa altura houve necessidade de se criar uma integração com um outro módulo, nós passaríamos algumas informações, dentre elas indicar ou não se um usuário confirmou uma operação durante o processo, até aí tudo bem, combinamos que para esta confirmação seria passado um Boolean.FALSE ou Boolean.TRUE. Integração implementada e testada.</p>
<p>Após um mês, o mesmo pessoal desta integração me avisa que está tudo errado no conceito da confirmação do usuário, o que outro módulo esperava eram três estados diferentes: se o usuário "disse" NÃO, se o usuário "disse" SIM ou se o usuário não indicou nenhuma das duas opções anteriores... sim eu sei... não fez sentido pra mim também na época, mas acreditem fazia sentido para eles. Mas o problema, é que não houve tempo de opinarmos, o outro lado simplesmente já tinha decidido que seria enviado Boolean.TRUE, Boolean.FALSE ou NULL, caracterizando assim caríssimos, um glorioso mega anti-pattern: um Booleano de três estados. Tentei argumentar para mudarmos para um enum ou pelo menos constantes inteiras, mas não houve acordo, tivemos que aceitar o "monstrinho", alegaram problemas de tempo para mudanças em vários lugares no módulo, o que já era um sinal de que havia coisas piores.</p>
<p>Lembrem-se, perder um tempo refatorando agora é um tempo ganho no futuro, ganhei várias dores de cabeça por causa desse anti-pattern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/03/25/criando-um-booleano-de-tres-estados/feed/</wfw:commentRss>
		<slash:comments>1</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>
