<?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>Blog de desenvolvimento da Milfont Consulting, Client e Server-side &#187; Java</title>
	<atom:link href="http://www.milfont.org/tech/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.milfont.org/tech</link>
	<description>Blog da Comunidade Milfont Consulting, uma empresa especializada em desenvolvimento Web, principalmente Javascript, node.js e muito Javascript.</description>
	<lastBuildDate>Thu, 26 Jan 2012 11:30:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Nodejs vs Rails, ou a ironia de quando apertam no meu calo.</title>
		<link>http://www.milfont.org/tech/2011/11/27/nodejs-vs-rails-ou-a-ironia-de-quando-apertam-no-meu-calo/</link>
		<comments>http://www.milfont.org/tech/2011/11/27/nodejs-vs-rails-ou-a-ironia-de-quando-apertam-no-meu-calo/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 21:52:11 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=1496</guid>
		<description><![CDATA[Por volta de 2007/2008 quando o Rails se popularizou no mundo inteiro, um tema comum em todas as listas de discussões era como o Rails ia matar o Java. Ficavam furiosos os mais exaltados, porém míopes, javeiros. Claro que era uma brincadeira com um fundo de verdade, um alerta para sermos poliglotas e usarmos o melhor [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-vertical"><script type="text/javascript">
			<!-- 
				tweetmeme_url = "http://www.milfont.org/tech/2011/11/27/nodejs-vs-rails-ou-a-ironia-de-quando-apertam-no-meu-calo/";
				tweetmeme_source = "tweetmeme";
				tweetmeme_style = "";
				
			//-->
			</script>
                        <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div></div><p>Por volta de 2007/2008 quando o Rails se popularizou no mundo inteiro, um tema comum em todas as listas de discussões era como o Rails ia matar o Java. Ficavam furiosos os mais exaltados, porém míopes, javeiros.</p>
<p>Claro que era uma brincadeira com um fundo de verdade, um alerta para sermos <a href="http://www.programadorpoliglota.com.br/">poliglotas</a> e usarmos o melhor ambiente/plataforma/ferramenta/etc para resoluções de problemas.</p>
<p>Claro que a comparação era esdrúxula porque comparavam um Framework com uma linguagem, aliás, não só linguagem, mas uma plataforma. Não importa se o Rails poderia ser executado na plataforma Java, a mensagem era o alerta de que não adianta fazer tudo com apenas uma ferramenta. Naquele momento se voce era programador DotNet, voce tentaria fazer tudo com DotNet, se voce fosse programador Java, o mesmo com sua linguagem/plataforma.</p>
<p>Na época Java era Mainstream, Rails um Framework que trazia consigo uma linguagem &#8220;Underground&#8221; com uma comunidade ainda muito pequena, porém vibrante.</p>
<h2>A História se repete</h2>
<p>Hoje em dia <a href="http://rubyonrails.org/">Rails</a> é um Framework muito popular que criou um ecossistema em sua volta, graças a ele que a linguagem Ruby tem uma certa penetração até em <a href="http://www.grupofortes.com.br/">grandes</a> corporações. Ouso dizer que Rails é uma &#8220;plataforma&#8221; e que tudo gira em torno dele, retire esse Framework e a linguagem Ruby dificilmente se mantém no Mainstream.</p>
<p>Em 2009 surgiu uma ferramenta chamada <a href="http://nodejs.org/">Nodejs</a>. Um &#8220;Evented I/O for <a href="http://code.google.com/p/v8/">V8 JavaScript</a>&#8220;, ou seja, uma ferramenta para fazer <a href="http://en.wikipedia.org/wiki/Asynchronous_I/O">IO não-bloqueante</a> usando a VM do Chrome. Em pouco tempo a comunidade em volta do Nodejs repetiu o mesmo processo que o Rails levou de 2004 a 2010 só que em menos tempo. Esse ano (2011), as duas comunidades chamam a mesma atenção do mercado, principalmente as Startups do Vale do Silício.</p>
<p>Nodejs criou uma comunidade em sua volta, apesar de ter um propósito bem definido. Não existe um Framework no ecossistema Nodejs que sequer chegue aos pés do Rails, o máximo é algo similar o <a href="http://www.sinatrarb.com/">Sinatra</a> chamado de <a href="http://expressjs.com/">Express</a>. Mas somente a possibilidade de uma comunidade/ecossistema desviar a atenção e rivalizar no efeito &#8220;Sou foda, estou na crista da onda&#8221; já deixa incomodado muitos Railers.</p>
<p>Pois bem, eu dizia há alguns dias para amigos e clientes que a comunidade Rails iria subir nas tamancas quando o Nodejs crescesse mais do que já cresceu. O motivo que alerto é que a comunidade se tornou tão pedante quão a comunidade Java de 2007/2008. Hoje em dia temos &#8220;Railstards&#8221; que pregam o desenvolvimento somente com Ruby ao ponto de <a href="http://www.milfont.org/tech/2011/07/25/coffeescript/">escreverem Javascript em Ruby</a> por conveniência de não sair da sua zona de conforto.</p>
<p>Há alguns dias a <a href="http://www.nodejitsu.com/">Nodejitsu</a> publicou <a href="http://nodejs-vs-ror.nodejitsu.com/">uma página</a> para acompanhar o momento onde o número de Watchers (observadores) do projeto nodejs no github ultrapassou o mesmo número no projeto Rails.</p>
<p><a href="http://www.milfont.org/tech/wp-content/uploads/2011/11/Captura-de-tela-2011-11-27-às-18.36.50.png"><img class="size-medium wp-image-1499 alignnone" title="Nodejs Vs Rails" src="http://www.milfont.org/tech/wp-content/uploads/2011/11/Captura-de-tela-2011-11-27-às-18.36.50-300x115.png" alt="" width="300" height="115" /></a></p>
<p>A Notícia por si só não deveria ter nenhum significado. Comparar um Framework popular com uma Ferramenta de Evented IO?</p>
<p>Ops, há alguns anos comparamos uma linguagem/plataforma com um Framework, ninguém disse na época que era descabido a comparação, porque seria hoje comparar Nodejs vs Rails?</p>
<p>Não rir dessa piada irônica só demonstra que você deveria subir um alerta, a grande maioria dos Javeiros já calçou a sandália da humildade, acho que ta na hora de nós Railers também <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Como disse o <a href="https://twitter.com/#!/leonardoeloy">@leonardoeloy</a>: Se Java é o novo Cobol, Rails o novo Java, Nodejs o novo Rails, quem é o novo Nodejs?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2011/11/27/nodejs-vs-rails-ou-a-ironia-de-quando-apertam-no-meu-calo/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>JavaCE Social</title>
		<link>http://www.milfont.org/tech/2010/10/27/javace-social/</link>
		<comments>http://www.milfont.org/tech/2010/10/27/javace-social/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 16:24:31 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[javace]]></category>
		<category><![CDATA[JavaCE Social]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=1094</guid>
		<description><![CDATA[Já há tempos eu venho afirmando que eventos gratuitos estão com os dias contados, não vale a pena realizar/organizar/participar de grandes eventos quando não cobramos pelo menos uma taxa simbólica, é impressionante como não é valorizado. Eu e o Handerson Frota da TriadWorks ministramos diversos eventos gratuitos na célula Java da faculdade Lourenço Filho há [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-vertical"><script type="text/javascript">
			<!-- 
				tweetmeme_url = "http://www.milfont.org/tech/2010/10/27/javace-social/";
				tweetmeme_source = "tweetmeme";
				tweetmeme_style = "";
				
			//-->
			</script>
                        <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div></div><p><a href="http://www.javace.org/javace-social/"><img class="alignleft" style="margin-right: 5px; margin-left: 5px; margin-top: 1px; margin-bottom: 1px;" src="http://www.javace.org/wp-content/uploads/2010/08/JavaCE.horizontalbrancoThumbs.png" alt="" width="150" height="68" /></a></p>
<p>Já há tempos eu venho afirmando que eventos gratuitos estão com os dias contados, não vale a pena realizar/organizar/participar de grandes eventos quando não cobramos pelo menos uma taxa simbólica, é impressionante como não é valorizado.</p>
<p>Eu e o <a href="http://www.handersonfrota.com.br/">Handerson Frota</a> da <a href="http://www.triadworks.com.br/">TriadWorks</a> ministramos diversos eventos gratuitos na célula Java da faculdade Lourenço Filho há uns anos, entre esses eventos alguns cursos e pela experiência o curso sempre tende a se deteriorar se for gratuito.</p>
<p>Eis que a <a href="http://www.javace.org/">JavaCE</a> surge com o projeto <a href="http://www.javace.org/javace-social/">JavaCE Social</a> que visa destinar os valores cobrados em cursos para <a href="http://www.javace.org/1o-javace-social-iprede/">instituições de caridade</a>. Esse tipo de ação a Milfont Consulting faz questão de patrocinar,  além disso vou preparar uns cursos para doar ao projeto.</p>
<p>Ajude a melhorar e aperfeiçoar o projeto doando, participando, ministrando e divulgando entre seus amigos, empresas e comunidades que participa.</p>
<p>Já tem uma grade inicial, confira a lista abaixo:</p>
<p><strong>Cursos</strong></p>
<p><strong>Uma Introdução ao SQL + JDBC</strong><br />
30/10/2010 (Sábado, 13h) – <a href="https://spreadsheets.google.com/viewform?formkey=dE5sMEZldXRHbW91cWU2Q3BDUnBaQnc6MQ" target="_blank">Inscrições aqui!</a><br />
<strong>Nível</strong>: Iniciante<br />
<strong>Carga Horária</strong>: 4h<br />
<strong>Instrutor</strong>: <a href="http://www.leonardoeloy.com/" target="_blank">Leonardo Eloy</a> <em>(Participa na Coordenação da JavaCE)</em><br />
<strong>Vagas</strong>: 8<br />
<strong>Doação</strong>: 1 lata de Leite em pó + 2Kg de Arroz ou Feijão<br />
<strong>Pré-requisitos</strong>: Saber criar programas simples com Java.<br />
<strong>Softwares:</strong> JDK 6, Eclipse ou NetBeans e MySQL (qualquer versão).</p>
<p><strong>Iniciando no VRaptor: Framework Ágil para Web</strong><br />
06/11/2010 (Sábado, 9h) – <a href="https://spreadsheets.google.com/viewform?formkey=dEU2RVFvZUNKa2xjTk81S3Z2aVdRc3c6MA" target="_blank">Inscrições aqui!</a><br />
<strong>Nível</strong>: Iniciante<br />
<strong>Carga Horária</strong>: 6hs<br />
<strong>Instrutor</strong>: <a href="http://www.handersonfrota.com.br/" target="_blank">Handerson Frota</a> <em>(Referência em DWR no Brasil)</em><br />
<strong>Vagas</strong>: 8<br />
<strong>Doação</strong>: 2 latas de Leite em pó.<br />
<strong>Pré-requisitos</strong>: Conhecimentos em Java Web, HTML e Banco de Dados.</p>
<p><strong>Iniciando no JSF</strong><br />
20/11/2010 (Sábado, 9h) – <a href="https://spreadsheets.google.com/viewform?formkey=dFU3bFpLR0lYY0FnZ2RUcWJvQ2hIZ0E6MA" target="_blank">Inscrições aqui!</a><br />
<strong>Nível</strong>: Intermediário<br />
<strong>Carga Horária</strong>: 6 a 8h<br />
Instrutor: <a href="http://brunomaomeh.wordpress.com/" target="_blank">Bruno Soares</a> e <a href="http://www.rponte.com.br/" target="_blank">Rafael Ponte</a> <em>(Referências em JSF no Brasil)</em><br />
<strong>Vagas</strong>: 8<br />
<strong>Doação</strong>: 2 latas de Leite em pó.<br />
<strong>Pré-requisitos</strong>: Conhecimentos em Java Web, HTML e Banco de Dados.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/10/27/javace-social/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Transparência inédita na saúde pública</title>
		<link>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/</link>
		<comments>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 11:13:01 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[crowds]]></category>
		<category><![CDATA[DWR]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Model 3]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[crowd]]></category>
		<category><![CDATA[governo]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[reverse ajax]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=872</guid>
		<description><![CDATA[É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará. O governo do estado inaugurou essa semana &#8220;A Conta do Paciente&#8220;, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse [...]]]></description>
			<content:encoded><![CDATA[<p>É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará.</p>
<p>O governo do estado <a href="http://diariodonordeste.globo.com/materia.asp?codigo=745869">inaugurou essa semana</a> &#8220;<a href="http://www.ceara.gov.br/noticias/pacientes-poderao-saber-custos-dos-tratamentos">A Conta do Paciente</a>&#8220;, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse tipo de atuação aproxima o governo da agilidade que a sociedade cobra em relação à transparência nas contas públicas, antes era quase impossível saber o custo real por paciente. Fora que a secretaria vai saber precisamente e em tempo real os custos por unidade, além de facilitar a tomada de decisões que podem salvar vidas.</p>
<p>Esse formulário detalhado com a conta do paciente é possível graças ao <a href="http://pt.wikipedia.org/wiki/Erp">ERP</a> especialista em gestão hospitalar pública da empresa Insystem, nosso cliente e parceiro. A Insytem acreditou em nosso trabalho e é um dos maiores Cases, senão o melhor.</p>
<p>O ERP foi construído 100% com base em <a href="http://www.milfont.org/tech/tag/tdd/">TDD</a> em Java usando DWR, Hibernate e  Spring basicamente. Alguns requisitos necessários de usabilidade utilizam Reverse Ajax com DWR. O sistema é totalmente ajax e utiliza o <a href="http://www.milfont.org/tech/2009/06/29/introducao-ao-ext/">Extjs</a> seguindo a filosofia <a href="http://www.milfont.org/tech/2008/09/08/mvc-model-3-e-camadas/">model 3</a>. Fizemos <a href="http://www.milfont.org/tech/2009/07/02/extjs-e-dwr/">algumas customizações</a> no Extjs para se integrar ao DWR de forma transparente.</p>
<p>Fomos ágeis desde o primeiro momento, mas nunca nos preocupamos em implantação de processo, metodologia ou qualquer coisa que o foco não fosse software saudável. XP foi algo natural, valores e princípios foram assimilados desde o primeiro dia, mas foi e é o software funcionando e livre de erros [o mais livre possível] que nos moveu.</p>
<p>Destaque para o <a href="http://javaneses.wordpress.com/">Felipe Andrade</a>, funcionário da Insystem que se tornou especialista em Extjs com DWR e hoje domina e é talvez o maior conhecedor da união desses Frameworks no estado.</p>
<p>Agradecimentos especiais aos diretores Evando Chaves e Marcelo Meirelles que investiram nessa solução e tiveram a sagacidade de sair na frente da concorrência entendendo que software funcionando é mais importante do que processos bonitos e pomposos, afinal o barco não chega na frente por causa do tambor e sim dos remadores. A Insystem está de parabéns por ter enfrentado todas as correntes contrárias e ter chegado a essa vitória investindo e apostando no fator humano como responsável para a vitória.</p>
<p>Esse é um Case que entrou para a história, estamos procurando outra solução semelhante na saúde pública do Brasil e até agora não encontramos nada.</p>
<p>Orgulhoso por participar dessa conquista.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Extjs e DWR</title>
		<link>http://www.milfont.org/tech/2009/07/02/extjs-e-dwr/</link>
		<comments>http://www.milfont.org/tech/2009/07/02/extjs-e-dwr/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 19:11:42 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[DWR]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Model 3]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=705</guid>
		<description><![CDATA[Nesse artigo eu pretendo trabalhar dois conceitos principais de uso do Extjs, extensão/customização de componentes e acesso a dados server-side com base em experiência recente em um projeto que desenvolvemos. Esse projeto em questão é um ERP que tinha a necessidade de manter a usabilidade similar a sua versão antiga, feita em Delphi, para o [...]]]></description>
			<content:encoded><![CDATA[<p>Nesse artigo eu pretendo trabalhar dois conceitos principais de uso do <a href="http://www.milfont.org/tech/tag/extjs/">Extjs</a>, extensão/customização de componentes e acesso a dados server-side com base em experiência recente em um projeto que desenvolvemos. Esse projeto em questão é um ERP que tinha a necessidade de manter a usabilidade similar a sua versão antiga, feita em Delphi, para o desktop.</p>
<p>Para suprir essa necessidade de usabilidade tivemos que adotar alguns conceitos, como ser totalmente stateless e modificar a arquitetura MVC2 para o <a href="http://www.milfont.org/tech/2008/09/08/mvc-model-3-e-camadas/">MVC3</a>. No server-side trabalhamos com um domain model baseado em Hibernate, Spring e Facades e Services com DWR. Nada de frameworks MVC2, não nos preocupamos com renderização e sim com a API. No lado cliente usamos Extjs com algumas modificações que fiz para integrar de forma suave com o DWR.</p>
<p>Primeiro precisamos entender como o Extjs trabalha com herança. Basicamente há um método no objeto Ext que faz esse trabalho de extensão dos componentes, funciona da seguinte maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Formato:</span>
<span style="color: #003366; font-weight: bold;">var</span> NovoComponente <span style="color: #339933;">=</span> Ext.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>velhoComponente<span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> 
          <span style="color: #009966; font-style: italic;">/* metodos e propriedades que serão reescritas */</span> 
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//Exemplo:</span>
<span style="color: #003366; font-weight: bold;">var</span> MilfontGridPanel <span style="color: #339933;">=</span> Ext.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">//novo construtor</span>
        constructor<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>config<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// Seu preprocessamento vai aqui</span>
        	MilfontGridPanel.<span style="color: #660066;">superclass</span>.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// Seu pos-processamento vai aqui</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
        NovoMethod<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// algum novo método que você queira criar para o novo componente</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para esse projeto, criei um Ext.data.DataProxy (<a href="http://www.milfont.org/tech/2009/06/29/introducao-ao-ext/">como visto no artigo passado</a>) especialista para o DWR, criativamente denominado DWRProxy. A idéia é modificar o comportamento de buscar os dados para usar um <a href="http://www.milfont.org/tech/tag/dwr/">Creator do DWR</a>.</p>
<p>Definimos primeiro o objeto e suas propriedades necessárias:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">DWRProxy</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>dwr_facade<span style="color: #339933;">,</span> dwr_filter<span style="color: #339933;">,</span> dwr_errorHandler<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">DWRProxy</span>.<span style="color: #660066;">superclass</span>.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009966; font-style: italic;">/* Propriedade que receberá a classe Java configurada como Creator */</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data</span> <span style="color: #339933;">=</span> dwr_facade<span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">/*
	 * Propriedade que receberá uma classe java configurada como converter
	 * que servirá como filtro de busca
	 */</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_filter</span> <span style="color: #339933;">=</span> dwr_filter<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">/**
	 *
	 * Propriedade para fazer paginação, indica que deve cachear a consulta de
	 * total de elementos o controlador [fachada] deve implementar a logica de
	 * negocios adequada, quando for false consulta o total, quando for true
	 * consulta apenas a listagem e repete o total
	 */</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_total_cache</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_errorHandler</span> <span style="color: #339933;">=</span> dwr_errorHandler<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Após isso extendemos do Ext.data.DataProxy :</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">DWRProxy</span><span style="color: #339933;">,</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">DataProxy</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">/**
     * Método Load do Ext.data.DataProxy overrided
     */</span>
&nbsp;
    load <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>params<span style="color: #339933;">,</span> reader<span style="color: #339933;">,</span> callback<span style="color: #339933;">,</span> scope<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">/**
	 * Escopo &quot;this&quot; mapeado para a variável &quot;s&quot; porque dentro do callback do
	 * DWR o escopo &quot;this&quot; não pertence ao objeto Ext.ux.data.DWRProxy.
	 */</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">var</span> s <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
        params <span style="color: #339933;">=</span> params <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">cache</span> <span style="color: #339933;">!=</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_total_cache</span> <span style="color: #339933;">=</span> params.<span style="color: #660066;">cache</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span> <span style="color: #339933;">!=</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_filter</span> <span style="color: #339933;">=</span> params.<span style="color: #660066;">filter</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> result<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_filter</span><span style="color: #339933;">,</span> params.<span style="color: #660066;">start</span><span style="color: #339933;">,</span> params.<span style="color: #660066;">limit</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_total_cache</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
			callback<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                <span style="color: #006600; font-style: italic;">//aqui passamos o retorno do DWR </span>
                               <span style="color: #006600; font-style: italic;">// que chamei de response,  para o extjs</span>
				result <span style="color: #339933;">=</span> reader.<span style="color: #660066;">readRecords</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				callback.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>scope<span style="color: #339933;">,</span> result<span style="color: #339933;">,</span> arg<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			errorHandler<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				scope.<span style="color: #660066;">fireEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;loadexception&quot;</span><span style="color: #339933;">,</span> s<span style="color: #339933;">,</span> arg<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				s.<span style="color: #660066;">dwr_errorHandler</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			timeout<span style="color: #339933;">:</span><span style="color: #CC0000;">100000</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">dwr_total_cache</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">fireEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;loadexception&quot;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> arg<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            callback.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>scope<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> arg<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A fachada DWR é uma classe comum, segue um exemplo de uso com Hibernate:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//classe para satisfazer o transporte para o Extjs</span>
<span style="color: #003366; font-weight: bold;">public</span> final <span style="color: #003366; font-weight: bold;">class</span> DataTransferObject <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">private</span> int total<span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;?</span> <span style="color: #003366; font-weight: bold;">extends</span> Object<span style="color: #339933;">&gt;</span> results<span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">//sets e gets</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">class</span> AjaxFacade <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">//injeta um repositorio, whatever</span>
    <span style="color: #003366; font-weight: bold;">private</span> Repository repository <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">public</span> DataTransferObject find<span style="color: #009900;">&#40;</span>Object filter<span style="color: #339933;">,</span> int start<span style="color: #339933;">,</span> int limit<span style="color: #339933;">,</span> boolean cache<span style="color: #339933;">,</span> HttpSession session<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        DataTransferObject dto <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> DataTransferObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #006600; font-style: italic;">//verifica se o Proxy está passando true </span>
        <span style="color: #006600; font-style: italic;">// indicando que está paginando</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cache<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Integer total <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Integer<span style="color: #009900;">&#41;</span> session.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;totalObject&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            dto.<span style="color: #660066;">setTotal</span><span style="color: #009900;">&#40;</span>total<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            session.<span style="color: #660066;">removeAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;totalObject&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Integer total <span style="color: #339933;">=</span> repository.<span style="color: #660066;">count</span><span style="color: #009900;">&#40;</span>filter<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            dto.<span style="color: #660066;">setTotal</span><span style="color: #009900;">&#40;</span>total<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            session.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;totalObject&quot;</span><span style="color: #339933;">,</span> total<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        List<span style="color: #339933;">&lt;</span>Object<span style="color: #339933;">&gt;</span> retorno <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span>Object<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span> repository.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span>filter<span style="color: #339933;">,</span> start<span style="color: #339933;">,</span> limit<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        dto.<span style="color: #660066;">setResults</span><span style="color: #009900;">&#40;</span>retorno<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> dto<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Para o Grid visto no artigo passado, basta instanciar assim no javscript:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> store <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">Store</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    proxy<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">DWRProxy</span><span style="color: #009900;">&#40;</span>
        AjaxFacade.<span style="color: #660066;">find</span><span style="color: #339933;">,</span> 
        <span style="color: #009900;">&#123;</span>$dwrClassName<span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;Project&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
        errorHandler
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    reader<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">JsonReader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
            root<span style="color: #339933;">:</span> <span style="color: #3366CC;">'results'</span><span style="color: #339933;">,</span>totalProperty<span style="color: #339933;">:</span> <span style="color: #3366CC;">'total'</span><span style="color: #339933;">,</span>id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'id'</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'id'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'name'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'manager.name'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'manager.address.country'</span><span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para entender o<em> {$dwrClassName:&#8221;Project&#8221;}</em> <a href="http://www.milfont.org/tech/2008/12/24/dwr-3-release-candidate-1/">visite esse post</a>.</p>
<p>Dessa forma o DWR se torna um proxy para todos os componentes do Extjs.</p>
<p>Código fonte da modificação do javascript eu <a href="http://github.com/cmilfont/MilfontExtjs/tree/master">coloquei aqui no github</a> e uma <a href="https://github.com/cmilfont/example-dwr-extjs/tree">aplicação demo aqui</a>. No próximo vou integrar o DWR com o Rails, aguardem que sai logo&#8230; ou não.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/07/02/extjs-e-dwr/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Frameworks Caseiros 2: A missão</title>
		<link>http://www.milfont.org/tech/2009/06/06/frameworks-caseiros-2-a-missao/</link>
		<comments>http://www.milfont.org/tech/2009/06/06/frameworks-caseiros-2-a-missao/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 19:09:26 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[framework caseiros]]></category>
		<category><![CDATA[framework proprietário]]></category>
		<category><![CDATA[Otimização]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=507</guid>
		<description><![CDATA[Eu participei como desenvolvedor de 4 projetos em Java nos últimos 12 meses, 3 deles tinham algo em comum: tinham uma arquitetura de referência, mais de 4 anos, baseados no struts 1.x, framework caseiro desenvolvido em cima do struts, modicações caseiras em APIs conhecidas sem contribuição com o projeto original [fork antigo ainda por cima], [...]]]></description>
			<content:encoded><![CDATA[<p>Eu participei como desenvolvedor de 4 projetos em Java nos últimos 12 meses, 3 deles tinham algo em comum: tinham uma arquitetura de referência, mais de 4 anos, baseados no struts 1.x, <a href="http://www.milfont.org/tech/2008/01/20/frameworkstools-caseiros-ou-fechados/">framework caseiro</a> desenvolvido em cima do struts, modicações caseiras em APIs conhecidas sem contribuição com o projeto original [fork antigo ainda por cima], código altamente <a href="http://c2.com/cgi/wiki?CouplingAndCohesion">acoplado e sem coesão</a>, arquitetura baseada em <a href="http://www.slideshare.net/peas/justjava-2007-arquitetura-java-ee-paulo-silveira-phillip-calado">BOLOVO</a> e <a href="http://blog.fragmental.com.br/2007/10/31/programadores-profissionais-escrevem-testes-ponto-final/">principalmente sem testes</a> [o último até que estava com uma tentativa de testes de aceitação com o <a href="http://seleniumhq.org/">Selenium</a> mas com grandes dificuldades por conta de todos os problemas].</p>
<p>Em projetos antigos é comum encontrarmos esse tipo de situação, eu mesmo já criei meu framework caseiro em coisa por volta de 6 anos atrás, mas hoje em dia isso não só é algo abominável como um desrespeito pelos profissionais, ainda mais após tanta evolução nos últimos 10 anos.</p>
<p>Conversando com um amigo que trabalha em uma grande empresa de planos de saúde, ele me falou que o &#8220;arquiteto java&#8221; dessa empresa [conhecido por sua fama de criador de "Framearras"] convenceu a diretoria sobre um projeto recente que se baseia no desenvolvimento de um framework específico para a empresa [eles já possuem um framework caseiro que é um terror e bem conhecido por grande parte dos desenvolvedores locais].</p>
<p>É impressionante como não acaba essa tara de desenvolvimento de frameworks caseiros, qual a necessidade de uma empresa que tem TI como meio [e não como fim] de desenvolver um framework para desenvolvimento de software?</p>
<p>Olha que não é de <a href="http://www.milfont.org/blog/archives/137">hoje que eu falo</a> sobre os perigos de frameworks caseiros, mas parece que os defensores desse tipo de abominação se reproduzem como coelhos.</p>
<p>Engraçado que no último projeto que participei eu recebi um treinamento de um dos criadores do framework caseiro que deveríamos usar na construção, alias na continuação de um sistema que está há 5 anos em desenvolvimento sem sinal de algo ir para a produção.</p>
<p>Os argumentos que ele usou foram os seguintes [anotei a frase para não esquecer]:</p>
<blockquote><p>&#8220;Amigos, é importante um framework criado pela propria empresa para padronizarmos o desenvolvimento, diminuindo a curva de aprendizado e ganharmos na produtividade, utilizando padrões consagrados, obtendo reuso nos componentes de negócio e garantindo a manutenibilidade pela fácil criação de código, principalmente CRUD.&#8221;</p></blockquote>
<h2>Segredo do fracasso</h2>
<p>Vou expor algumas considerações sobre essa frase dele:</p>
<h3>Curva de aprendizado</h3>
<p>Se algo é complexo de entender por quem conhece os padrões daquilo que se deseja desenvolver, é porque não serve mesmo. Não há como comparar um software opensource consagrado no mercado onde centenas de milhares de desenvolvedores já aperfeiçoaram com algo feito em casa.</p>
<h3>Ganho na produtividade</h3>
<p>A desculpa número um de todo framework caseiro é a famosa produtividade, sendo que voce sempre perde produtividade porque insere algo fora da normalidade no cotidiano do desenvolvedor. Além do que é insano voce ter uma produtividade no inicio &#8211; se fosse o caso, já que não é &#8211; comprometendo todo o ciclo de vida restante da aplicação por conta disso.</p>
<p>Porque é isso que acontece, todos esses frameworks caseiros são pensados e desenvolvidos para facilitarem a construção de CRUDs no inicio da aplicação e você tem que sacrificar todo o resto para satisfazer esse capricho que pode ser automatizado facilmente com tecnologias atuais.</p>
<h3>Utilização de padrões</h3>
<p>Ninguem pode saber que padrão utilizar antes de saber qual o problema, isso é impossível. Ou vai usar um martelo para furar uma parede ou uma furadeira para pregar um prego.</p>
<h3>Reuso de componentes</h3>
<p>Não existe reuso de objetos de negócios, nenhum processo é semelhante nem que seja na mesma organização ainda mais tentando reusar código por meio ide interface gráfica comum em projetos com dificuldade incial até de separação de pacotes.</p>
<p>Uma alternativa geralmente usada é se comunicar via API ou uma estrutura de serviço como WS, JMS, whatever e não aproveitando uma tela em um sistema distinto.</p>
<h3>Aumento da manutenibilidade</h3>
<p>Sistema como Frameworks caseiros sempre são dificeis de manutenção por que falta documentação, gente que conheça realmente [além dos próprios criadores], código sempre acoplado, falta de testes, maturidade, e principalmente propósito real [como não haver um existente no mesmo segmento].</p>
<p>Em todos os frameworks caseiros que trabalhei e não foram poucos, a manutenção é algo punitivo porque temos que satisfazer o framework e não o negócio.</p>
<h3>Garantia da qualidade</h3>
<p>Não há qualidade alguma em frameworks caseiros, pelo contrário, pelo conjunto de más práticas já expostas, o que acontece na realidade é que os sitemas desenvolvidos com esse tipo de ferramenta apresentam uma qualidade baixíssima.</p>
<h3>Fork em frameworks do mercado</h3>
<p>Problema em fazer um merge no futuro, voce não terá tempo e recurso suficiente para isso. Melhor solução seria submeter patch e codigo para o framework original e acompanhar o desenvolvimento deste. Deixa o desenvolvimento preso a versões antigas.</p>
<h3>Associado a cascata.</h3>
<p>Quase impossível você encontrar um framework caseiro em uma equipe ágeil, até porque isso fere vários dos valores e princípios.</p>
<h3>Menos codificação</h3>
<p>Na verdade duplica a codificação para satisfazer o framework.</p>
<h3>Extensão de classes genericas</h3>
<p>Acoplamento, referencia cíclica, etc&#8230; dá até preguiça de escrever.</p>
<h3>CRUD Driven Design</h3>
<p>Quebra o principio do XP que é fazer o mais importante e crucial primeiro, CRUD nunca é o mais importante. Se voce faz o CRUD primeiro, cria a regra de negócio e refaz todo o CRUD depois.</p>
<p>Geração de codigo sempre reescreve as informações, merge manual.</p>
<p>Frameworks caseiros são #ESFM. Vão complementando com as más práticas&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/06/06/frameworks-caseiros-2-a-missao/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Segundo Encontro XPCE</title>
		<link>http://www.milfont.org/tech/2009/05/12/segundo-encontro-xpce/</link>
		<comments>http://www.milfont.org/tech/2009/05/12/segundo-encontro-xpce/#comments</comments>
		<pubDate>Tue, 12 May 2009 10:31:41 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[integração contínua]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=636</guid>
		<description><![CDATA[XPCE - Grupo de Extreme Programming do Ceará. [http://groups.google.com.br/group/xpce] Local: Faculdade Lourenço Filho [http://www.flf.edu.br/] Endereço: Rua Barão do Rio Branco, 2101 Centro. Localização com o Google Maps. Esquina das ruas Barão do Rio Branco com Domingos Olimpio. Data: Dia 30/05/2009 [sábado] das 09:00h as 11:00h no auditório. Palestra 09:00 &#8211; 11:00 Palestra: Integração Contínua Resumo: [...]]]></description>
			<content:encoded><![CDATA[<p><strong>XPCE </strong>- Grupo de Extreme Programming do Ceará.</p>
<p>[<a href="http://groups.google.com.br/group/xpce">http://groups.google.com.br/group/xpce</a>]</p>
<p><strong>Local</strong>: Faculdade Lourenço Filho [<a href="http://www.flf.edu.br/">http://www.flf.edu.br/</a>]</p>
<p><strong>Endereço</strong>: <span class="text5">Rua Barão do Rio Branco,              2101 Centro</span>. Localização com o <a href="http://maps.google.com.br/maps?f=q&amp;source=s_q&amp;hl=pt-BR&amp;geocode=&amp;q=fortaleza+Rua+Bar%C3%A3o+do+Rio+Branco&amp;sll=-14.179186,-50.449219&amp;sspn=65.426591,113.203125&amp;ie=UTF8&amp;ll=-3.736177,-38.531327&amp;spn=0.017344,0.027637&amp;z=15&amp;iwloc=A">Google Maps</a>. Esquina das ruas Barão do Rio Branco com Domingos Olimpio.</p>
<p><strong>Data</strong>: Dia 30/05/2009 [sábado] das 09:00h as 11:00h no auditório.</p>
<h3>Palestra</h3>
<p>09:00 &#8211; 11:00</p>
<p><em>Palestra</em>: <strong>Integração Contínua</strong><br />
<em>Resumo</em>: Descubra o que projetos ágeis fazem para possibilitar que diversos desenvolvedores trabalhem juntos em um mesmo projeto, integrando suas contribuições de forma harmônica e segura.<br />
<em>Palestrante</em>: <strong>Igo Coelho</strong>, fanático por desenvolvimento de software, novas tecnologias, internet, eletrônicos e tudo mais que um geek pode gostar. Com mais de 9 anos de experiência em desenvolvimento de Software trabalha atualmente na <a href="http://www.fortesinformatica.com.br/" target="_blank">Fortes Informática</a> como arquiteto de software com XP e Java. Casado, pai de dois filhos e mantem um blog em <a href="http://www.igocoelho.com.br/" target="_blank">www.igocoelho.com.br</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/05/12/segundo-encontro-xpce/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Palestra Test Driven Development</title>
		<link>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/</link>
		<comments>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 10:58:46 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[Agilismo]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[behaviour driven development]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=600</guid>
		<description><![CDATA[Palestra realizada no evento do grupo XPCE em 28/03/2009. Test Driven Development View more presentations from Christiano Milfont.]]></description>
			<content:encoded><![CDATA[<p>Palestra realizada no evento do grupo <a href="http://groups.google.com.br/group/xpce">XPCE</a> em <a href="../2009/03/27/primeiro-encontro-xpce-mudancas-na-grade/">28/03/2009</a>.</p>
<div id="__ss_1216427" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Test Driven Development" href="http://www.slideshare.net/cmilfont/test-driven-development-1216427?type=presentation">Test Driven Development</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testdrivendevelopment-rev2-090329051331-phpapp01&amp;stripped_title=test-driven-development-1216427" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testdrivendevelopment-rev2-090329051331-phpapp01&amp;stripped_title=test-driven-development-1216427" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/cmilfont">Christiano Milfont</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introdução ao DWR</title>
		<link>http://www.milfont.org/tech/2009/03/20/introducao-ao-dwr/</link>
		<comments>http://www.milfont.org/tech/2009/03/20/introducao-ao-dwr/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 10:24:04 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[DWR]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=23</guid>
		<description><![CDATA[Material básico que eu usava nos cursos em 2007 para configuração do DWR em uma aplicação web em java, principalmente a partir da página 10. O DWR tem uma vantagem, desde 2005 &#8211; em suas primeiras versões &#8211; que praticamente é a mesma configuração, com mudanças poucos significativas. Esse material continua válido em sua plenitude. [...]]]></description>
			<content:encoded><![CDATA[<p>Material básico que eu usava nos cursos em 2007 para configuração do DWR em uma aplicação web em java, principalmente a partir da página 10.</p>
<p>O DWR tem uma vantagem, desde 2005 &#8211; em suas primeiras versões &#8211; que praticamente é a mesma configuração, com mudanças poucos significativas. Esse material continua válido em sua plenitude.</p>
<div id="__ss_1172050" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Tw Dwr 2007 Ap01" href="http://www.slideshare.net/cmilfont/tw-dwr-2007-ap01?type=powerpoint">Tw Dwr 2007 Ap01</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=twdwr2007ap01-090319212458-phpapp01&amp;stripped_title=tw-dwr-2007-ap01" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=twdwr2007ap01-090319212458-phpapp01&amp;stripped_title=tw-dwr-2007-ap01" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/cmilfont">Christiano Milfont</a>.</div>
</div>
<p><img src="http://www.milfont.org/tech/wp-content/upload/dwrworks.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/03/20/introducao-ao-dwr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retrabalho e prejuízo</title>
		<link>http://www.milfont.org/tech/2009/01/08/retrabalho-e-prejuizo/</link>
		<comments>http://www.milfont.org/tech/2009/01/08/retrabalho-e-prejuizo/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 15:17:07 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Certificações]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[domain driven design]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=488</guid>
		<description><![CDATA[Em todos os projetos que trabalhei até hoje no mercado local [Ceará] existem profissionais mais ou menos qualificados a partir de uma base mínima de qualidade que um profissional tem que possuir dentro do modelo &#8220;Enterprisey&#8221; &#8211; que estamos acostumados e que responde pela quase totalidade dos projetos de software. Essa base mínima eu proponho [...]]]></description>
			<content:encoded><![CDATA[<p>Em todos os projetos que trabalhei até hoje no mercado local [Ceará] existem profissionais mais ou menos qualificados a partir de uma base mínima de qualidade que um profissional tem que possuir dentro do modelo &#8220;Enterprisey&#8221; &#8211; que estamos acostumados e que responde pela quase totalidade dos projetos de software.</p>
<p>Essa base mínima eu proponho que seja &#8211; dentro do modelo exposto -  raciocínio lógico. O resto ele pode aprender.</p>
<p>Raciocínio lógico está ligado diretamente a noção de avaliar a situação, encontrar um padrão, investigar soluções existentes e implementar a solução, além claro de bom senso.</p>
<p>Não adianta pregarmos que os profissionais deveriam ser melhor escolhidos assim ou assado porque a realidade é que as empresas não tem como medir satisfatoriamente quem é ou não competente e mais cedo ou mais tarde você se deparará com indivíduos em sua equipe vindos por diversas nuances administrativas, seja aquele superqualificado cheio de títulos ou o primo do diretor da empresa.</p>
<p>Aonde quero chegar com essa história?</p>
<p>Precisamos avaliar os riscos necessários com bastante antecedência para que toda a equipe e consequentemente o projeto não sejam lesados e paguem o preço da incompetência às vezes de um único elemento. Parece óbvio? Acredite, não é!</p>
<p>Temos um projeto em um cliente &#8211; uma Alfândega &#8211; que precisamos refatorar todo o código criado por um determinado profissional com apenas dois ou três meses pronto. O projeto ainda está no início e já temos que refazer código.</p>
<p>Convenhamos, tudo bem que o código de meia hora atrás já é legado, mas código tão recente não deveria já ser refatorado sem mudança na lógica de negócio ou arquitetural. Algo muito errado aconteceu.</p>
<p>Mudanças não funcionais acontecem, surge um novo paradigma ou framework que reduz o tempo de desenvolvimento e convenientemente é adequado sua mudança, isso é comum durante a manutenção de um software já em produção com um meio século de uso &#8211; que em informática dura cerca de 4 ou 5 anos.</p>
<p>O nosso em questão não há motivos. Projeto novo, sem restrição ou adequação à &#8220;Arquitetura de Referência&#8221;, Frameworks de última milha na plataforma Java como JSF, Spring e Hibernate. Testes unitários &#8211; mas não TDD.</p>
<p>Como dito, separei um exemplo em código para demonstrar aonde quero chegar. Tem uma lógica bastante simples, existe um processo de apreensão de mercadorias na alfândega e liberação dessa mercadoria.</p>
<p>Há 3 tabelas que representam isso no modelo E/R: TB_DEVOLUCAO, TB_ITEM_APREENSAO, TB_ITEM_DEVOLUCAO. Segundo a lógica relacional, a TB_ITEM_DEVOLUCAO é uma tabela de junção entre a devolução e os itens apreendidos para indicar que item será devolvido.</p>
<p>Seguindo minha definição, um profissional com raciocínio lógico encontraria fácil a solução do mapeamento entre essas entidades apenas lendo a documentação, ele saberia que o <a href="http://www.hibernate.org">Hibernate</a> tem um mapeamento de <a href="http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#entity-mapping-association-collections">OneToMany com Join Table Uni ou Bidirecional</a>.</p>
<p>Mas não, ele criou essa bizarrice:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Devolucao <span style="color: #009900;">&#123;</span>
&nbsp;
	@OneToMany<span style="color: #009900;">&#40;</span>fetch<span style="color: #339933;">=</span>FetchType.<span style="color: #006633;">LAZY</span>, cascade<span style="color: #339933;">=</span>CascadeType.<span style="color: #006633;">ALL</span><span style="color: #009900;">&#41;</span>
	@JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
	@Cascade<span style="color: #009900;">&#40;</span>org.<span style="color: #006633;">hibernate</span>.<span style="color: #006633;">annotations</span>.<span style="color: #006633;">CascadeType</span>.<span style="color: #006633;">DELETE_ORPHAN</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>ItemDevolucao<span style="color: #339933;">&gt;</span> itensDevolucao <span style="color: #339933;">=</span> 
		<span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>ItemDevolucao<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_ITEM_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ItemDevolucao <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//Para que essa entidade?</span>
&nbsp;
	@Id
	@GeneratedValue<span style="color: #009900;">&#40;</span>strategy <span style="color: #339933;">=</span> GenerationType.<span style="color: #006633;">IDENTITY</span><span style="color: #009900;">&#41;</span>
	@Column<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_DEVOLUCAO&quot;</span>, columnDefinition<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;NUMERIC&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Integer</span> codigo<span style="color: #339933;">;</span>
&nbsp;
	@OneToOne
	@JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_APREENSAO&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> ItemApreensao itemApreensao<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esse profissional em questão é graduado em computação, tem mestrado em uma federal, certificação como arquiteto Java e diversas outras certificações e pasme, anos de experiência em projetos. Mas não tem o básico, raciocínio lógico. Não investiga e não sabe desenvolver software de qualidade.</p>
<p>O código em questão pode parecer bobagem até mas isso se repete em todo o código criado por esse profissional.</p>
<p>Um profissional responsável em refatorar o código com apenas curso técnico e uma mísera certificação de programador java refatorou assim [como deve ser]:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Devolucao <span style="color: #009900;">&#123;</span>
&nbsp;
	@OneToMany<span style="color: #009900;">&#40;</span>fetch<span style="color: #339933;">=</span>FetchType.<span style="color: #006633;">LAZY</span>, cascade<span style="color: #339933;">=</span>CascadeType.<span style="color: #006633;">ALL</span><span style="color: #009900;">&#41;</span>
	@JoinTable<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_ITEM_DEVOLUCAO&quot;</span>,
		joinColumns <span style="color: #339933;">=</span> @JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>,
		inverseJoinColumns <span style="color: #339933;">=</span> 
				@JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_APREENSAO&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#41;</span>
	@Cascade<span style="color: #009900;">&#40;</span>org.<span style="color: #006633;">hibernate</span>.<span style="color: #006633;">annotations</span>.<span style="color: #006633;">CascadeType</span>.<span style="color: #006633;">DELETE_ORPHAN</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>ItemApreensao<span style="color: #339933;">&gt;</span> itensDevolvidos <span style="color: #339933;">=</span> 
				<span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>ItemApreensao<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ad Hominem da minha parte? Tomar uma exceção pela regra? nada disso, eles são legião! Isso é meu cotidiano.</p>
<p>O prejuízo que esse profissional acarreta a todos os envolvidos é enorme e até difícil de ser mensurado porque envolve custos e humor da equipe que impacta em outros custos imperceptíveis na conta final que é a &#8220;fodisse&#8221; dos caras que tiveram que refatorar, ou seja, fizeram o seu e o trabalho alheio.</p>
<p>Ah, mas XP não prega o código coletivo? ir lá e consertar? Mas quebra o principal valor que é &#8220;Respeito&#8221;. Além do mais o projeto em questão seque o velho Cascata &#8211; mas culpa do cliente que exigiu ser assim, exigiu não, obriga.</p>
<p>Pela minha experiência de nada adianta você jogar um <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a> nas mãos dele e pedir para estudar, ele vai continuar escrevendo nmDesc em uma propriedade ou IRepository em uma Interface. Ele foi treinado assim e sem raciocínio lógico no máximo que voce vão conseguir é retreiná-lo para conseguir comer a banana por outro túnel.</p>
<p>Um projeto sem um líder técnico responsável com aptidão e experiência necessária aliado a método baseado em BDUF sem um processo restritivo [como TDD] com modelagem ultrapassada com papéis de analista de sistemas &#8220;UMLizados&#8221; deixa esse tipo de profissional cometer esses pecados e prejudicar a todos os envolvidos retrabalho desnecessário.</p>
<p>É fácil resolver isso? É! O problema maior é que não podemos simplesmente aceitar que &#8220;o cliente quer assim&#8221;, temos um dever ético com nossa profissão de não permitir que o paciente escolha como ele quer ser operado e ceder médicos que não tenham capacidade de operá-lo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/01/08/retrabalho-e-prejuizo/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>DWR 3 Release Candidate 1</title>
		<link>http://www.milfont.org/tech/2008/12/24/dwr-3-release-candidate-1/</link>
		<comments>http://www.milfont.org/tech/2008/12/24/dwr-3-release-candidate-1/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 15:33:43 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[DWR]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Joe Walker]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=481</guid>
		<description><![CDATA[Joe Walker anunciou que saiu a RC1 do DWR3 com pequeno atraso com novidades interessantes como suporte a Varargs, Method Overloading, entre outras coisas. Mas destaco algo que deveria ter há tempos e sentíamos falta para construções repetitivas como CRUD (principalmente) que é o que chamou de &#8220;Lightweight typed parameters&#8220;. Até a versão 2 temos [...]]]></description>
			<content:encoded><![CDATA[<p>Joe Walker <a href="http://directwebremoting.org/blog/joe/2008/12/16/dwr_version_3_0_release_candidate_1.html">anunciou</a> que saiu a <a href="http://directwebremoting.org/dwr/download">RC1</a> do <a href="http://directwebremoting.org/dwr">DWR3</a> com <a href="http://www.milfont.org/tech/2008/03/11/dwr-3-em-junho/">pequeno atraso</a> com novidades interessantes como suporte a Varargs, Method Overloading, entre outras coisas. Mas destaco algo que deveria ter há tempos e sentíamos falta para construções repetitivas como CRUD (principalmente) que é o que chamou de &#8220;<strong>Lightweight typed parameters</strong>&#8220;.</p>
<p>Até a versão 2 temos que construir métodos no <a href="http://directwebremoting.org/dwr/server/dwrxml/creators">Creator</a> com implementação nos argumentos devido ao DWR não ter como fazer o binding entre o Javascript e o Java sem saber quem é o objeto. Algo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AjaxFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> User teste<span style="color: #009900;">&#40;</span>User param<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		param.<span style="color: #006633;">setDescription</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Teste funcionou&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> param<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No javascript:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">AjaxFacade.<span style="color: #660066;">teste</span><span style="color: #009900;">&#40;</span>
	<span style="color: #009900;">&#123;</span>
		id<span style="color: #339933;">:</span><span style="color: #CC0000;">42</span> <span style="color: #006600; font-style: italic;">//JSON que representa o objeto User</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
	<span style="color: #009900;">&#123;</span>
		callback<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>retorno<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>retorno.<span style="color: #660066;">toSource</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		errorHandler<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>error<span style="color: #339933;">,</span> message<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
		timeout<span style="color: #339933;">:</span><span style="color: #CC0000;">5000</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Agora foi adicionado a propriedade <strong><em>$dwrClassName</em></strong> no <a href="http://directwebremoting.org/dwr/server/dwrxml/converters">Converter</a> onde você pode trabalhar com a interface ao invés da implementação. Vejamos com o Object como argumento no mesmo método:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AjaxFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> teste<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> param<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//puramente ilustrativo não peça fundamentação lógica :)</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>param <span style="color: #000000; font-weight: bold;">instanceof</span> User<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
			<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>User<span style="color: #009900;">&#41;</span> param<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setDescription</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Teste funcionou&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> param<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No javascript:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">AjaxFacade.<span style="color: #660066;">teste</span><span style="color: #009900;">&#40;</span>
	<span style="color: #009900;">&#123;</span>
		id<span style="color: #339933;">:</span><span style="color: #CC0000;">42</span> <span style="color: #006600; font-style: italic;">//JSON que representa o objeto User,</span>
		$dwrClassName<span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;User&quot;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
	<span style="color: #009900;">&#123;</span>
		callback<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>retorno<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>retorno.<span style="color: #660066;">toSource</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		errorHandler<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>error<span style="color: #339933;">,</span> message<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
		timeout<span style="color: #339933;">:</span><span style="color: #CC0000;">5000</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Agora aquelas centenas de classes que fazem a mesma coisa [CRUDzão velho de guerra] podem ser resumidas em uma única Facade que faz suas validações e aciona um Repository ou sua estrutura de persistência.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AjaxFacade <span style="color: #009900;">&#123;</span>
	@Autowired <span style="color: #003399;">Repository</span> repository<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> persistir<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> param<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>param <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> ...
		<span style="color: #006633;">repository</span>.<span style="color: #006633;">persist</span><span style="color: #009900;">&#40;</span>param<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> param<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora não tem como não termos um Feliz Natal!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/12/24/dwr-3-release-candidate-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

