<?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>Fabrício Lemos &#187; Java</title>
	<atom:link href="http://www.fabriciolemos.org/blog/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fabriciolemos.org/blog</link>
	<description>Blog sobre desenvolvimento de software</description>
	<lastBuildDate>Tue, 10 Nov 2009 18:54:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Template Method e Exceções</title>
		<link>http://www.fabriciolemos.org/blog/2008/template-method-e-excecoes/</link>
		<comments>http://www.fabriciolemos.org/blog/2008/template-method-e-excecoes/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 21:13:32 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Tratamento de Erros]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=65</guid>
		<description><![CDATA[Template Method sempre foi um dos meus padrões favoritos, porém quando aplicado de forma exagerada acho que ele trouxe mais prejuízos do que benefícios.]]></description>
			<content:encoded><![CDATA[<p class="western" style="margin-bottom: 0cm;"><a href="http://en.wikipedia.org/wiki/Template_method_pattern" target="_blank">Template Method</a> sempre foi um dos meus padrões favoritos, porém quando aplicado de forma exagerada acho que ele trouxe mais prejuízos do que benefícios.</p>
<p class="western" style="margin-bottom: 0cm;">A principal razão é que ele acaba dificultando o tratamento de erros da aplicação: ao padronizar o comportamento de alguma operação para uma hierarquia de classes, ele acaba também padronizando as exceções lançadas pelo método, e é aí que está o problema.</p>
<p class="western" style="margin-bottom: 0cm;">Um dos principais problemas que vejo em aplicações legadas é o tratamento de erros feito de forma inapropriada. Já vi algumas pessoas criticando, mas considero um excelente recurso da linguagem Java a existência de <a href="http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions" target="_blank">Checked Exceptions</a>, utilizadas para erros que podem precisar de um tratamento particular.</p>
<p class="western" style="margin-bottom: 0cm;">Na implementação de uma biblioteca ou de um framework, checked exceptions talvez não sejam tão interessantes. Mas, na implementação de aplicações, considero um recurso bem valioso principalmente para aquelas divididas em <a href="http://en.wikipedia.org/wiki/Layer_(object-oriented_design)" target="_blank">camadas</a>.</p>
<p class="western" style="margin-bottom: 0cm;">Template methods não casam bem com checked exceptions pelo seguinte motivo:</p>
<pre class="java">abstract protected void validar(Entidade entidade);

abstract protected void logarOperacao(Object algumaCoisa);

public void salvar (Entidade entidade) {
    this.validar(entidade);
    this.dao.persistir(entidade);
    this.logarOperacao(algumaCoisa);
}</pre>
<p class="western" style="margin-bottom: 0cm;">Um código como esse é comum em frameworks caseiros ou arquiteturas de referência. Geralmente fica em uma classe chamada MeuManagerGenerico, ou algo do tipo, e as diversas classes de negócio, específicas de cada entidade, devem implementar o método de validação e o método de log. O único problema com está abordagem é que você não está &#8220;amarrando&#8221; somente a assinatura e o algorítimo para salvar uma entidade, está também dizendo que nenhuma operação &#8220;salvar&#8221; do sistema lança uma checked exception.</p>
<p class="western" style="margin-bottom: 0cm;">A não ser que sua aplicação seja 100% <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a>, sem nenhuma restrição de unicidade em nenhum atributo, acho que essa é uma restrição muito forte e que não se aplica.</p>
<p class="western" style="margin-bottom: 0cm;">Dessa forma, se alguma regra de validação ou regra de negócio específica não for atendida, como você comunica para a camada superior (provavelmente a camada de visão) sobre o problema ocorrido? A única maneira é lançar unchecked exceptions.</p>
<p class="western" style="margin-bottom: 0cm;">Usando unchecked exception, como as camadas superiores saberão quais exceções lançadas pelas camadas inferiores? A única saída seria a camada inferior antecipar o tratamento dado ao erro, de maneira que a camada superior não precise trata-lo. Já vi muito essa abordagem com a exception tendo como atributo a chave da mensagem que será exibida ao usuário. Dessa forma a camada superior iria somente exibir a mensagem, não importando qual seja a exceção. Isso é um exemplo claro de quebra da divisão de responsabilidade entre as camadas. Se as camadas inferiores tem que antecipar de alguma forma a maneira como as camadas superiores fazem o tratamento de erro, porque você divide sua aplicação em camadas em primeiro lugar?</p>
<p class="western" style="margin-bottom: 0cm;">Esse um bom exemplo de que &#8220;amarração de código&#8221; e antecipação de necessidades podem trazer prejuízos não antecipados. Imagino que desenvolvedores que fazem template methods para operações com algoritmos simples como &#8220;salvar&#8221;, &#8220;atualizar&#8221;, &#8220;deletar&#8221;, etc só podem ter duas coisas em mente:</p>
<p class="western" style="margin-bottom: 0cm;"><strong>1. </strong> Economizar código.</p>
<p class="western" style="margin-bottom: 0cm;">Esse pensamento vem do falso sentimento de que uma aplicação enxuta é uma aplicação com pouco código. Temos que tomar cuidado pra não exagerar nas simplificações e não enxergar abstrações onde elas não existem ou são prejudiciais.</p>
<p class="western" style="margin-bottom: 0cm;"><strong>2.</strong> O desenvolvedor pode esquecer de fazer a validação ou gravar o log ou qualquer coisa do tipo, então &#8220;amarra-se&#8221; esse algoritmo em um template method.</p>
<p class="western" style="margin-bottom: 0cm;">Se seu desenvolvedor não sabe como fazer uma validação correta ou alguma dessas operações, ele não deveria colocar as mãos no código sem que estivesse fazendo <a href="http://www.improveit.com.br/xp/praticas/programacao_par" target="_blank">programação em par</a> com outro mais experiente.</p>
<p class="western" style="margin-bottom: 0cm;">Mesmo com essa armadilha, ainda acho válida a utilização do template method, mas somente nos raros casos onde se pode antecipar os erros de toda a hierarquia de classes e quando a complexidade do algoritmo justifique essa abordagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2008/template-method-e-excecoes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Glassfish ou Jboss + JON</title>
		<link>http://www.fabriciolemos.org/blog/2008/glassfish-ou-jboss-jon/</link>
		<comments>http://www.fabriciolemos.org/blog/2008/glassfish-ou-jboss-jon/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 09:48:27 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Servidores de aplicação]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[Jboss]]></category>
		<category><![CDATA[JON]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=26</guid>
		<description><![CDATA[Iniciamos um processo de decisão sobre qual servidor de aplicação passaremos a utilizar em nosso ambiente. A motivação é que o velho Jboss de guerra não está mais dando conta do recado. Não que o Jboss não seja um ótimo servidor, muito pelo contrário. A questão é que o seu ponto mais criticado, a administração, [...]]]></description>
			<content:encoded><![CDATA[<p>Iniciamos um processo de decisão sobre qual servidor de aplicação passaremos a utilizar em nosso ambiente. A motivação é que o velho Jboss de guerra não está mais dando conta do recado. Não que o Jboss não seja um ótimo servidor, muito pelo contrário. A questão é que o seu ponto mais criticado, a administração, começou a cobrar seu preço. Iremos aumentar consideravelmente o número de servidores em produção (assunto outro post) e uma interface de administração central, mais produtiva e confiável, passou a ser uma necessidade.</p>
<p>Depois de uma análise prévia, vimos que duas soluções poderiam atender nossas necessidades: Glassfish ou Jboss + <a href="http://www.jboss.com/products/jbosson" target="_blank">JON</a>.</p>
<p>O Glassfish é uma promessa que virou realidade, mas confesso que ainda não me convenci, culpa mais pela pouca experiência que tenho com esse servidor do que por sua qualidade, que ele é a melhor solução para o nosso caso. De qualquer maneira, nesses estudos prévios e na <a href="http://www.cejug.org/pages/viewpage.action?pageId=30900360" target="_blank">apresentação do Kohsuke</a>, acabou subindo muito no meu conceito.</p>
<p>O Jboss já é um velho conhecido e ainda está no páreo, levando em consideração a utilização do JON. O JBoss Operations Network me pareceu ser uma ferramenta realmente fantástica que permite a administração e monitoramento de muitos e muitos e muitos pontos, desde o sistema operacional, passando pelo servidor de aplicação e chegando nas aplicações. Seu lado negativo é que é uma ferramenta paga.</p>
<p>Tomcat está fora da jogada. A maioria das nossas aplicações utilizam Spring, mas algumas mais novas já estão em EJB e futuramente iremos para o <a href="http://www.jboss.com/products/seam" target="_blank">Jboss Seam</a> ou <a href="http://jcp.org/en/jsr/detail?id=299" target="_blank">Web Beans</a>, como preferirem (também assunto para outro post). Ainda existem algumas outras alternativas, mas a princípio os principais candidatos são esses dois mesmo.</p>
<p>Bem, a análise ainda está em andamento e os principais pontos ques estamos analisando são:</p>
<p>- <strong>Administração</strong>: facilidade de administrar e monitorar remotamente múltiplas instâncias de servidores.</p>
<p>- <strong>Performance</strong>: para essa avaliação buscaremos análises de instituições independentes.</p>
<p><strong>- Ambiente de desenvolvimento</strong>: facilidades de utilização do servidor de aplicação no ambiente de desenvolvimento:  integração com o Eclipse, tempo de start up e deploy, facilidade de debug, hot deploy, etc.</p>
<p><strong>- Documentação técnica</strong>: disponibilidade e qualidade da documentação técnica disponível: manuais, tutoriais, wiki e fóruns</p>
<p><strong>- Suporte técnico:</strong> disponibilidade de suporte 24&#215;7. Considerando custo, meio (apenas via web e e-mail ou por telefone também), idioma (em português ou inglês) e tempo de resposta.</p>
<p><strong>- Aderência à especificação:</strong> aderência à especificação Java EE 5, incluindo a velocidade em que são lançadas novas versões da ferramenta quando saem novas versões da especificação.</p>
<p><strong>- Custo da migração:</strong> custo associado à migração do ambiente atual para o servidor de aplicação escolhido. Atualmente temos aplicações em produção tanto no Jboss quanto no Glassfish</p>
<p><strong>- Custo do software:</strong> custo de aquisição de ferramentas necessárias para administração ou desenvolvimento no servidor de aplicação.</p>
<p><strong>- Cases de sucesso:</strong> existência de casos de sucesso de sistemas em produção usando o servidor de aplicação.</p>
<p>Estes dois servidores possuem um grande comunidade de usuários, então, caros colegas e recém chegados leitores, sintam-se a vontade e estimulados a deixar algum comentário caso tenham alguma opinião ou experiência relativos a qualquer um desses pontos do Glassfish ou Jboss + JON.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2008/glassfish-ou-jboss-jon/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
