<?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; Design Patterns</title>
	<atom:link href="http://www.milfont.org/tech/category/engenharia-de-software/design-patterns/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>Palestra BDD &#8211; Unifor 2010</title>
		<link>http://www.milfont.org/tech/2010/05/28/palestra-bdd-unifor-2010/</link>
		<comments>http://www.milfont.org/tech/2010/05/28/palestra-bdd-unifor-2010/#comments</comments>
		<pubDate>Fri, 28 May 2010 17:49:21 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[domain driven design]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=941</guid>
		<description><![CDATA[Ontem [27/05/2010] palestrei no evento da JavaCE na Unifor, abaixo estão os slides. Para quem não participou do evento, provavelmente os slides não farão muito sentido por si, mas creio que dá para entender o contexto. O objetivo dessa palestra foi desmistificar um pouco o entendimento sobre Domain Driven Design. O foco foi demonstrar que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/0321125215?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321125215"><img class="alignleft" style="margin: 5px;" title="Domain Driven Design na Amazon" src="http://ecx.images-amazon.com/images/I/31ywgz51v-L._SL160_.jpg" alt="" width="120" height="160" /></a>Ontem [27/05/2010] <a href="http://www.javace.org/evento-javace-especializacao-unifor/">palestrei no evento</a> da <a href="http://www.javace.org/">JavaCE</a> na Unifor, abaixo estão os <a href="http://www.slideshare.net/cmilfont/domain-driven-design-4344612">slides</a>. Para quem não participou do evento, provavelmente os slides não farão muito sentido por si, mas creio que dá para entender o contexto.</p>
<p>O objetivo dessa palestra foi desmistificar um pouco o entendimento sobre <a href="http://en.wikipedia.org/wiki/Domain_driven_design">Domain Driven Design</a>. O foco foi demonstrar que essa abordagem não é sobre padrões, como bem me aconselhou o <a href="http://twitter.com/rodrigoy/status/14864670811">Rodrigo Yoshima</a>. Enfatizei a comunicação como fator importante e comparei arquiteturas existentes por má compreensão não só da &#8220;Orientação a Objetos&#8221;, mas por dogmatismo e ignorância.</p>
<p>Como eu conheço bem o mercado local, enfatizei algumas más práticas que considero o empecilho aos projetos, principalmente as &#8220;arquiteturas de referências&#8221; que se proliferam aqui e impactam na modelagem.</p>
<p>Fizemos um &#8220;Hands On&#8221; rapidinho e não tem como não falar sobre <a href="http://www.amazon.com/gp/product/0321146530?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321146530">TDD</a>, afinal, modelagem ágil passa invariavelmente pelo <a href="http://c2.com/cgi/wiki?TestFirstProgramming">Test First</a>. &#8220;Fizemos&#8221;, porque tive a ajuda do <a href="http://twitter.com/rponte/status/14878430610">@rponte</a>.</p>
<p><a title="27052010265 por chrismilfont, no Flickr" href="http://www.flickr.com/photos/cmilfont/4647510289/"><img src="http://farm5.static.flickr.com/4033/4647510289_b9b0460d69.jpg" alt="27052010265" width="500" height="375" /></a></p>
<div id="__ss_4344612" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Domain driven design" href="http://www.slideshare.net/cmilfont/domain-driven-design-4344612">Domain driven design</a></strong><object id="__sse4344612" 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=domaindrivendesign-100528120249-phpapp01&amp;stripped_title=domain-driven-design-4344612" /><param name="name" value="__sse4344612" /><param name="allowfullscreen" value="true" /><embed id="__sse4344612" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=domaindrivendesign-100528120249-phpapp01&amp;stripped_title=domain-driven-design-4344612" name="__sse4344612" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/cmilfont">Christiano Milfont</a>.</div>
</div>
<p><a href="http://www.submarino.com.br/produto/1/21576488/domain-driven+design?franq=170940"><img class="alignleft" title="Domain Driven Design" src="http://i.s8.com.br/images/books/cover/img8/21576488.jpg" alt="" width="180" height="180" /></a>Descobri só ontem que existe<a href="http://www.submarino.com.br/produto/1/21576488/domain-driven+design?franq=170940"> tradução do livro Domain Driven Design</a> do <a href="http://domaindrivendesign.org/about">Eric Evans</a>, eu recomendo comprarem o original na Amazon, mas se forem comprar em português que seja pelo <a href="http://www.submarino.com.br/produto/1/21576488/domain-driven+design?franq=170940">meu link</a>. <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A <a href="http://www.infoq.com">InfoQ</a> publicou um <a href="http://www.infoq.com/minibooks/domain-driven-design-quickly">minibook sobre o tema</a>.</p>
<p>Vou subir a aplicação que codificamos ontem para o <a href="http://github.com/cmilfont">github</a> e atualizo essa página quando estiver disponível. Algumas fotos que foram tirados <a href="http://www.flickr.com/photos/cmilfont/sets/72157624154994090/">voces conferem aqui</a>.</p>
<p>Algumas referências importantes sobre o que falei ontem:</p>
<p><a href="http://blog.aspercom.com.br/2009/08/11/repositorios-ddd/">http://blog.aspercom.com.br/2009/08/11/repositorios-ddd/</a></p>
<p><a href="http://fragmental.tw/2010/02/24/everyday-tales-anatomy-of-a-refactoring/">http://fragmental.tw/2010/02/24/everyday-tales-anatomy-of-a-refactoring/</a></p>
<p><a href="http://fragmental.tw/2010/03/10/everyday-tales-anatomy-of-a-refactoring-%E2%80%93-part-2/">http://fragmental.tw/2010/03/10/everyday-tales-anatomy-of-a-refactoring-%E2%80%93-part-2/</a></p>
<p><a href="http://fragmental.tw/2010/03/10/everyday-tales-anatomy-of-a-refactoring-%e2%80%93-part-3/">http://fragmental.tw/2010/03/10/everyday-tales-anatomy-of-a-refactoring-%e2%80%93-part-3/</a></p>
<p><a href="http://fragmental.tw/2010/03/22/nevermind-domain-driven-design/">http://fragmental.tw/2010/03/22/nevermind-domain-driven-design/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/05/28/palestra-bdd-unifor-2010/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Slides do Maré de Agilidade Fortaleza &#8211; 2009</title>
		<link>http://www.milfont.org/tech/2009/08/09/slides-do-mare-de-agilidade-fortaleza-2009/</link>
		<comments>http://www.milfont.org/tech/2009/08/09/slides-do-mare-de-agilidade-fortaleza-2009/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 11:57:15 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Behaviour Driven Development]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[behaviour driven development]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[maredeagilidade]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ruby rails]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[teste]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=735</guid>
		<description><![CDATA[Mare de Agilidade &#8211; BDD e TDD View more presentations from Christiano Milfont.]]></description>
			<content:encoded><![CDATA[<div style="width:425px;text-align:left" id="__ss_1832390"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/cmilfont/mare-de-agilidade-bdd-e-tdd" title="Mare de Agilidade - BDD e TDD">Mare de Agilidade &#8211; BDD e TDD</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=maredeagilidademilfont-090809062633-phpapp01&#038;stripped_title=mare-de-agilidade-bdd-e-tdd" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=maredeagilidademilfont-090809062633-phpapp01&#038;stripped_title=mare-de-agilidade-bdd-e-tdd" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<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/08/09/slides-do-mare-de-agilidade-fortaleza-2009/feed/</wfw:commentRss>
		<slash:comments>0</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>Recomendação sobre TDD</title>
		<link>http://www.milfont.org/tech/2009/06/01/recomendacao-sobre-tdd/</link>
		<comments>http://www.milfont.org/tech/2009/06/01/recomendacao-sobre-tdd/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 11:05:25 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Behaviour Driven Development]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[behaviour driven development]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=644</guid>
		<description><![CDATA[O Bruno Pereira comentou em post passado sobre a dificuldade que ele teve em adotar TDD: &#8220;Já tentei algumas vezes escrever os testes unitários no começo, mas simplesmente prefiro a abordagem de escrever os testes posteriormente, preferencialmente acompanhando o desenvolvimento das funcionalidades de negócio.&#8221; Notei em diversas consultorias que isso é muito comum por diversos [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://brunopereira.org/">Bruno Pereira</a> <a href="http://www.milfont.org/tech/2009/02/03/pair-programming-vs-code-review/#comment-2176">comentou em post passado</a> sobre a dificuldade que ele teve em adotar TDD:</p>
<blockquote><p>&#8220;Já tentei algumas vezes escrever os testes unitários no começo, mas simplesmente prefiro a abordagem de escrever os testes posteriormente, preferencialmente acompanhando o desenvolvimento das funcionalidades de negócio.&#8221;</p></blockquote>
<p>Notei em diversas consultorias que isso é muito comum por diversos motivos, o principal a meu ver é justamente entender como começa o código do teste, em dois extremos: se depois que definiu o fluxo de processo de negócio de alguma forma [como UML, <a href="http://www.c2.com/doc/crc/draw.html">CRC</a> ou mesmo apenas com UC] ou se já começa algum esboço em código sem ter discutido bem como funciona totalmente o negócio.</p>
<p>A primeira abordagem, definir todo o processo primeiro, deixa a grande maioria dos desenvolvedores confortáveis já que é algo tradicional que vinhamos fazendo, mas o problema é que invariavelmente descamba para <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">BDUF</a>.</p>
<p>A segunda abordagem, que está ligada ao desenvolvimento iterativo e incremental, já deixa um sentimento de que &#8220;algo está faltando&#8221; em grande parte dos times que tenho trabalhado. A resistência maior é deixar um sentimento de que não preparamos a arquitetura adequadamente e essa pode sofrer um revés num futuro próximo, claro que isso é uma bobagem para quem conhece como TDD funciona, mas é algo comum que tenho notado e precisa ser desmistificado.</p>
<p>Note que não estou falando aqui do sistema inteiro, apenas uma funcionalidade, mesmo assim a mudança cultural de quebrar uma funcionalidade em tarefas e ir desenvolvendo com &#8220;<a href="http://improveit.com.br/xp/principios/passos_bebe">passos de bebê</a>&#8221; é algo que dificulta a adoção.</p>
<h3>Como sanar essas deficiências?</h3>
<p>Precisamos de uma forma que conversassemos sobre a funcionalidade inteira mas que me permita ir avançando e atualizando conforme eu vá entendendo melhor como funciona.</p>
<p>Tenho trabalhado essas deficiências nos últimos times que peguei com <a href="http://dannorth.net/introducing-bdd">BDD</a> [Behaviour Driven Development] , iniciando a escrita das histórias [descrição daquela funcionalidade na visão de uma pessoa] seguindo o modelo de template que o <a href="http://dannorth.net/whats-in-a-story">Dan North sugeriu</a>. O resultado é que os times avançaram porque eles notaram como iniciar satisfatoriamente com testes sem comprometer a velocidade do desenvolvimento.</p>
<p>O BDD nos trouxe os testes para o inicio de qualquer código, praticamente sem distinguir que se está testando antes e associado com outras práticas como &#8220;<a href="http://improveit.com.br/xp/praticas/programacao_par">Programação em Par</a>&#8221; facilitou a <a href="http://c2.com/cgi/wiki?UbiquitousLanguage">linguagem ubíqua</a> do time.</p>
<p>Independente se é ágil ou tradicional eu tenho notado uma deficiência na coleta de informações, seja como User Stories ou Use Cases, onde os analistas de negócio, ou seja lá como são chamados nos times, não sabem pensar em negócio. Uma das coisas mais ridículas que vejo é o sujeito explicar para seu time uma funcionalidade com base em um DER ou outra estrutura técnica, dizendo coisas como: &#8220;a tabela tal, associada a entidade x&#8221;.</p>
<p>Tenho tentado corrigir isso nos times que enfrento como princípio básico, antes de qualquer coisa eu tento disciplinar a pensarem em negócio. Faço exercícios simples como questioná-los com &#8220;esqueçam de qualquer termo técnico&#8221; e &#8220;como essa funcionalidade é no papel?&#8221; ou &#8220;se não tivesse computador, como fariam isso?&#8221;, perguntas simples para instigar o raciocínio sobre a funcionalidade. Após esse exercício, escrevemos essa história em um arquivo e partimos para sua implementação.</p>
<p>Em março desse ano eu palestrei no primeiro encontro da <a href="http://groups.google.com.br/group/xpce/">XPCE</a> sobre BDD, <a href="http://www.milfont.org/tech/2009/03/29/palestra-behaviour-driven-development/">vejam os slides</a>. Em termos de ferramentas você pode conferir como temos trabalhado em um projeto recente seguindo os posts do Jefferson Girão:</p>
<p>Parte 1 <a href="http://jefferson.eti.br/?p=96" target="_blank">http://jefferson.eti.br/?p=96</a><br />
Parte 2 <a href="http://jefferson.eti.br/?p=105" target="_blank">http://jefferson.eti.br/?p=105</a><br />
Parte 3 <a href="http://jefferson.eti.br/?p=139" target="_blank">http://jefferson.eti.br/?p=139</a></p>
<p>Enfim, acredito que BDD seja um caminho natural para adoção de TDD por seu time já que eles terão código de teste, antes de qualquer coisa, na forma de negócio e o TDD já florescerá quando forem testar o modelo criado ou sugerido pelo código BDD. Ainda tem uma vantagem adicional, terão a documentação do sistema executável e comprovável.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/06/01/recomendacao-sobre-tdd/feed/</wfw:commentRss>
		<slash:comments>7</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>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>SCEA com design patterns errados</title>
		<link>http://www.milfont.org/tech/2008/10/28/scea-com-design-patterns-errados/</link>
		<comments>http://www.milfont.org/tech/2008/10/28/scea-com-design-patterns-errados/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 10:00:33 +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[JSE]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JCP]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSR]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[SUN]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=346</guid>
		<description><![CDATA[Once upon a time&#8230; &#8230; A comunidade em volta da JCP adotou a aberração proposta pela SUN chamada EJB e o mecanismo de persistência seria uma JSR especialista chamada JDO. JDO seria a solução deifnitiva onde não importaria se você usa um txt, um xml ou um Banco de dados parrudo. Com esse modelo de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Once_upon_a_time">Once upon a time</a>&#8230;</p>
<p>&#8230; A comunidade em volta da JCP adotou a aberração proposta pela SUN chamada EJB e o mecanismo de persistência seria uma JSR especialista chamada <a href="http://java.sun.com/jdo/index.jsp">JDO</a>. JDO seria a solução deifnitiva onde não importaria se você usa um txt, um xml ou um Banco de dados parrudo.</p>
<p>Com esse modelo de desenvolvimento foi criado <a href="http://java.sun.com/blueprints/patterns/">um catálogo</a> de <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/">Design Patterns</a>[?] que serviria de &#8220;tábua dos 10 mandamentos&#8221; para a comunidade. Nasceu a prova de certificação em Arquiteto java com base nessa arquitetura.</p>
<p>Por fora da JCP uma turma se dedicou a criar uma forma de persistência específica para bancos de dados relacionais [Hibernate] onde não estavam preocupados se você guardava seus dados em um xml, queriam apenas resolver os problemas clássicos do mapeamento objeto-relacional. Outro pessoal jogava fora o modelo EJB e criava sua própria JEE [Spring] com técnicas e abordagens que surgiam como <a href="http://en.wikipedia.org/wiki/Inversion_of_control">IoC</a>, <a href="http://en.wikipedia.org/wiki/Dependency_injection">DI</a>, <a href="http://en.wikipedia.org/wiki/Aspect_programming">Aspect Programming</a>.</p>
<p>Com esse modelo de desenvolvimento, baseado sobretudo no conjunto de Design Patterns [<a href="http://martinfowler.com/eaaCatalog/">PoEAA</a>] da turma do <a href="http://martinfowler.com/">Fowler</a>, aposentaram o modelo da SUN apreciado pelos membros da JCP e redirecionaram o comitê para a aprovação de especificações copiadas desse outro modelo.</p>
<p>&#8230; <a href="http://en.wikipedia.org/wiki/Happy_ending">and they lived happily ever after</a>.</p>
<p>&#8230;</p>
<p>Opa, faltaram atualizar a prova de <a href="http://www.sun.com/training/certification/java/scea.xml">Arquiteto Enterprisey</a> para adequar aos Patterns corretos. Ainda leio na <a href="http://www.sun.com/training/catalog/courses/CX-310-052.xml">ementa da prova</a> no capítulo sobre Patterns:</p>
<ul>
<li>From a list, select the most appropriate pattern for a given scenario. Patterns are limited to those documented in the book &#8211; Alur, Crupi and Malks (2003). Core J2EE Patterns: Best Practices and Design Strategies 2nd Edition and named using the names given in that book.</li>
<li>From a list, select the most appropriate pattern for a given scenario. Patterns are limited to those documented in the book &#8211; Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software and are named using the names given in that book.</li>
<li>From a list, select the benefits and drawbacks of a pattern drawn from the book &#8211; Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software.</li>
<li>From a list, select the benefits and drawbacks of a specified Core J2EE pattern drawn from the book – Alur, Crupi and Malks (2003). Core J2EE Patterns: Best Practices and Design Strategies 2nd Edition.</li>
</ul>
<div>Aonde se lê: &#8220;Core J2EE Patterns&#8221;, troquem para Patterns of Enterprise Application Architecture (A.K.A  PofEAA). Sabemos que foi somente por desatenção do estagiário que ficou de atualizar a página, perdoamos esse erro primário, agora sim:</div>
<div>&#8230; <a href="http://en.wikipedia.org/wiki/Happy_ending">and they lived happily ever after</a>.</div>
<div> <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/10/28/scea-com-design-patterns-errados/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Estudar para que se eu já sei o que fazer</title>
		<link>http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/</link>
		<comments>http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 19:52:41 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/</guid>
		<description><![CDATA[Tenho severas cr&#237;ticas ao modelo educacional, principalmente o superior. Vou e volto para a faculdade de tempos em tempos, minha escola real est&#225; nos livros, a faculdade &#233; pelo diploma porque a falta dele as vezes fecha portas que n&#227;o tem como serem abertas e em determinados momentos precisam serem ultrapassadas. Minhas cr&#237;ticas derivam principalmente [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho severas cr&iacute;ticas ao modelo educacional, principalmente o superior. Vou e volto para a faculdade de tempos em tempos, minha escola real est&aacute; nos livros, a faculdade &eacute; pelo diploma porque a falta dele as vezes fecha portas que n&atilde;o tem como serem abertas e em determinados momentos precisam serem ultrapassadas.</p>
<p>Minhas cr&iacute;ticas derivam principalmente da fal&aacute;cia e do sofismo, as pessoas acreditam que possuir um n&iacute;vel superior  as credita para a qualifica&ccedil;&atilde;o necess&aacute;ria a uma determinada tarefa simplesmente. Quantos alunos est&atilde;o se formando esse ano em Ci&ecirc;ncia da Computa&ccedil;&atilde;o sem a necess&aacute;ria qualifica&ccedil;&atilde;o? A maioria? Todos? Nenhum? Como saber se n&atilde;o existe um mecanismo eficiente de provar isso?</p>
<p>Na aus&ecirc;ncia de um mecanismo eficiente, o mercado sempre adota pontos factuais para basear suas contrata&ccedil;&otilde;es, e uma delas &eacute; o porte de um diploma de curso superior.</p>
<p>Fiz quase todas as cadeiras que envolvem desenvolvimento de software: Estrutura de dados, laborat&oacute;rio 1 e 2, t&eacute;cnicas de programa&ccedil;&atilde;o 1 e 2, l&oacute;gica matem&aacute;tica, teoria da computa&ccedil;&atilde;o, entre outras que n&atilde;o lembro no momento. Em todas essas cadeiras nunca ouvi o professor(a) sequer mencionar coisas como: <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Closure</a>, <a href="http://en.wikipedia.org/wiki/Currying">Currying</a>, <a href="http://en.wikipedia.org/wiki/Continuation">Continuation</a>, <a href="http://en.wikipedia.org/wiki/Design_by_contract">Design By Contract</a>, <a href="http://en.wikipedia.org/wiki/Actor_model">Actor model</a>, <a href="http://en.wikipedia.org/wiki/Lazy_evaluation">Lazy evaluation</a>, <a href="http://en.wikipedia.org/wiki/Tail_recursion">Tail recursion</a>, <a href="http://en.wikipedia.org/wiki/Quine_%28computing%29">Quine</a>, <a href="http://en.wikipedia.org/wiki/Engine_%28computer_science%29">Engine</a>, <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov substitution principle</a>, &#8230; mais algumas coisas que n&atilde;o lembrei no momento &#8230;</p>
<p>O b&aacute;sico de orienta&ccedil;&atilde;o a objetos &eacute; ensinado, o aluno consegue at&eacute; responder o que &eacute; heran&ccedil;a e encapsulamento, mas eu nunca vi sequer mencionarem Orienta&ccedil;&atilde;o a Objetos <a href="http://en.wikipedia.org/wiki/Prototype-based_programming">Prototype-based</a>, a&iacute; tenho que me deparar com gente dizendo que Javascript ou Lua fede porque simplesmente n&atilde;o entende como funciona os conceitos e acha estranho a sintaxe das linguagens. </p>
<p>Eu mesmo passei a faculdade inteira  sem discutir <a href="http://en.wikipedia.org/wiki/Design_pattern">design patterns</a>, com exce&ccedil;&atilde;o de <a href="http://en.wikipedia.org/wiki/Data_Access_Object">DAO</a>, que eventualmente pula na frente dos alunos em alguma cadeira obscura de &quot;desenvolvimento web&quot; (sic). Hoje um amigo estava impressionado com as recomenda&ccedil;&otilde;es que o pessoal da SUN passou sobre o GoF na <a href="http://www.cejug.org/display/cejug/Caravana+Sun+2007">caravana de ontem</a>, e eu falei para ele que isso &eacute; naftalina, s&eacute;rio, se em 2007, o GoF &eacute; novidade para voc&ecirc;, algo de muito s&eacute;rio aconteceu com sua forma&ccedil;&atilde;o. </p>
<p>Tive um professor muito bom, H&eacute;lio Moura, que usava na &eacute;poca a primeira edi&ccedil;&atilde;o do livro &quot;<a href="http://www.amazon.com/Applying-UML-Patterns-Craig-Larman/dp/0137488807/ref=sr_1_3/103-8969754-9514222?ie=UTF8&amp;s=books&amp;qid=1193944157&amp;sr=1-3">Applying UML and Patterns</a>&quot;(que &eacute; de 1997 e faz portanto 10 anos) do <a href="http://en.wikipedia.org/wiki/Craig_Larman">Craig Larman</a>, refer&ecirc;ncia na &eacute;poca para RUP, e passou alguns princ&iacute;pios legais como <a href="http://en.wikipedia.org/wiki/GRASP_%28Object_Oriented_Design%29">GRASP</a>, <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a>, <a href="http://en.wikipedia.org/wiki/Open/closed_principle">Open/closed principle</a>, entre mais algumas coisas legais que n&atilde;o lembro agora. Mas isso foi uma exce&ccedil;&atilde;o, e esse professor n&atilde;o ministra mais aulas na faculdade onde estudo. Isso era coisa de 99 ou 2000, in&iacute;cio do mil&ecirc;nio, vi que os professores de l&aacute; ainda usam a mesma vers&atilde;o do livro do <a href="http://www.craiglarman.com">Craig</a>. Detalhe, j&aacute; estamos na <a href="http://www.amazon.com/Applying-UML-Patterns-Introduction-Object-Oriented/dp/0131489062/ref=sr_1_2/103-8969754-9514222?ie=UTF8&amp;s=books&amp;qid=1193944157&amp;sr=1-2">terceira edi&ccedil;&atilde;o</a> e com mudan&ccedil;as significativas. </p>
<p>Agora <a href="http://martinfowler.com/books.html#eaa">PoEAA</a> do <a href="http://martinfowler.com/">Martin Fowler</a> que &eacute; bom, voce vai passar batido, nem tenha <a href="http://martinfowler.com/eaaCatalog">esperan&ccedil;a de discutir isso</a> em sala de aula. </p>
<p><a href="http://en.wikipedia.org/wiki/Domain_model">Domain Model</a>? isso &eacute; anos-luz da academia brasiliana, v&aacute; <a href="http://martinfowler.com/eaaCatalog/domainModel.html">estudar</a> que &eacute; melhor. <a href="http://domaindrivendesign.org/">Domain Driven Design</a> tamb&eacute;m &eacute; assunto inexistente, procure <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">outra freguesia</a>. </p>
<p><a href="http://en.wikipedia.org/wiki/Agile_software_development">Metodologias &aacute;geis</a>, enquanto a academia est&aacute; descobrindo XP (timidamente claro), o mercado j&aacute; discute a fus&atilde;o entre <a href="http://en.wikipedia.org/wiki/Extreme_Programming">XP</a>, <a href="http://en.wikipedia.org/wiki/Scrum_(development)">Scrum</a>, <a href="http://en.wikipedia.org/wiki/Feature_Driven_Development">FDD</a>, <a href="http://en.wikipedia.org/wiki/Crystal_Clear_(software_development)">Crystal</a>, <a href="http://en.wikipedia.org/wiki/Dynamic_Systems_Development_Method">DSDM</a>. At&eacute; a Microsoft tem m&eacute;todos &aacute;geis enquanto a academia consolida UPs como novidade. </p>
<p>A maioria sai da faculdade monoglota, com apenas o conhecimento espec&iacute;fico de uma linguagem de programa&ccedil;&atilde;o, enquanto deveriam estudar princ&iacute;pios, est&atilde;o estudando linguagem. <a href="http://en.wikipedia.org/wiki/Functional_programming">Programa&ccedil;&atilde;o funcional</a> at&eacute; pode ser vista, talves raramente em uma cadeira de calculo, ou IA (com LISP) se der tempo, alguns confundem senten&ccedil;as com paradigmas, tinha um professor que falava que por a linguagem ter senten&ccedil;a condicional como um &quot;IF&quot;, ela n&atilde;o poderia ser considerada 100% Orientada a objetos, entre outras sandices bizarras. DSL? bah! </p>
<p>Conversando com um amigo dia desses l&aacute; na faculdade, entramos no assunto banco de dados, sem querer surgiu no meio da discuss&atilde;o sobre <a href="http://en.wikipedia.org/wiki/Database_normalization">formas normais</a>, para minha surpresa ele disse que n&atilde;o sabia do que eu estava falando, achei estranho porque o professor de banco de dados 1, cadeira respons&aacute;vel por esse conte&uacute;do, &eacute; um excelente professor, <a href="http://paginas.terra.com.br/informatica/fsiqueira/">Fernando Siqueira</a>, e conhecendo ele eu sabia que n&atilde;o passaria ningu&eacute;m sem ensinar formas normais. Depois esse meu amigo voltou e falou que deu uma &quot;olhada&quot; no livro e &quot;lembrou&quot;. Ora, isso me causa apreens&atilde;o, mesmo eu sabendo que o professor tem a compet&ecirc;ncia sobre uma mat&eacute;ria e tenho certeza que a aplicou, porque um aluno simplesmente esquece o principal conte&uacute;do de uma determinada mat&eacute;ria?</p>
<p>S&atilde;o mist&eacute;rios, mas mist&eacute;rio mesmo &eacute; uma menina que se forma esse ano e n&atilde;o sabe ainda para que serve um banco de dados, mesmo evidentemente ter cursado todas as cadeiras de banco de dados. Isso sim merece estudo, tese, trabalhos cient&iacute;ficos e tudo que n&oacute;s pudessemos descobrir.</p>
<h3>Livros </h3>
<p>A minha escola real s&atilde;o os livros, tive e tenho alguns bons professores, uns poucos excelentes, mas os autores cl&aacute;ssicos s&atilde;o os mestres dos meus mestres. N&atilde;o procure livro espec&iacute;fico, procure autor, e toda a cultura por volta desse autor.</p>
<p>Posso indicar alguns que s&atilde;o a base da carreira de qualquer desenvolvedor que se preze: Alan S. Koch, Alistair Cockburn, Bertrand Meyer, Craig Larman, Eric Evans, Joshua Kerievsky, Kent Beck, Martin Fowler, Rod Johnson, Ron Jeffries, Steve McConnell, Robert C. Martin, &#8230; isso s&oacute; dando uma olhadela aqui na minha &quot;biblioteca&quot;. Sei que esqueci nomes importantes, mas se voc&ecirc; seguir essa lista, vai acabar caindo neles.</p>
<p>O pior disso tudo &eacute; que o pessoal fica empolgado com t&iacute;tulo aqui, o cara virou doutor j&aacute; se acha semi-deus, s&atilde;o praticamente inacess&iacute;veis, &eacute; muito mais facil voc&ecirc; falar com Martin Fowler do que falar com um Doutor brasileiro. </p>
<p> Ent&atilde;o voce tem duas alternativas, estudar ou frequentar a faculdade, d&aacute; para conciliar as duas, mas a prefer&ecirc;ncia ser&aacute; sempre para o estudo, ele que pagar&aacute; o leite de cada dia, ali&aacute;s&#8230; leite n&atilde;o que esse est&aacute; matando ultimamente, e ei que pensei que era a cerveja <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Mais história em slides -XP</title>
		<link>http://www.milfont.org/tech/2007/10/31/mais-historia-em-slides-xp/</link>
		<comments>http://www.milfont.org/tech/2007/10/31/mais-historia-em-slides-xp/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 09:35:29 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2007/10/31/mais-historia-em-slides-xp/</guid>
		<description><![CDATA[Essa palestra apesar de ter o foco em eXtreme Programming, foi um momento especial, se observarem, havia slides sobre domain model e outras coisas não relacionadas diretamente com métodos ágeis, porque o material foi preparado para combater o famoso anti-pattern BOLOVO (termo criado pelo Shoes) que misturado ao RUP e dosado com muita incompetência, estava [...]]]></description>
			<content:encoded><![CDATA[<p>Essa palestra apesar de ter o foco em eXtreme Programming, foi um momento especial, se observarem, havia slides sobre domain model e outras coisas não relacionadas diretamente com métodos ágeis, porque o material foi preparado para combater o famoso anti-pattern BOLOVO (termo criado pelo <a href="http://blog.fragmental.com.br/">Shoes</a>) que misturado ao RUP e dosado com muita incompetência, estava no auge nessa época e representava toda a cultura de atraso que passávamos.</p>
<p>Nessa época passavamos pelo treinamento da Evolução com uma figura que ministrava tudo que havia de mais insano nesse campo, BOLOVO na vêia, e com essa palestra consegui abrir muitos olhos. Essa talves foi a palestra mais importante da minha vida em termos de eficiência na mensagem passada e nos objetivos alcançados.</p>
<iframe src="http://www.slideshare.net/slideshow/embed_code/148802" width="425" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2007/10/31/mais-historia-em-slides-xp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bridge para encapsular o Cross Browser</title>
		<link>http://www.milfont.org/tech/2007/10/05/bridge-para-encapsular-o-cross-browser/</link>
		<comments>http://www.milfont.org/tech/2007/10/05/bridge-para-encapsular-o-cross-browser/#comments</comments>
		<pubDate>Fri, 05 Oct 2007 11:51:04 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Melhores práticas]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2007/10/05/bridge-para-encapsular-o-cross-browser/</guid>
		<description><![CDATA[No rastro do meu último post, aproveitando a deixa de detecção otimizada trabalhando junto com o Design Pattern Bridge, aproveitaremos esse conceito para encapsularmos a complexidade de se trabalhar com códigos que tenham que rodar em múltiplos Browsers. O padrão Bridge define o desacoplamento da abstração (interface) com suas implementações e cada implementação possa variar [...]]]></description>
			<content:encoded><![CDATA[<p>No rastro do meu <a href="http://www.milfont.org/tech/2007/10/04/deteccao-otimizada-com-javascript/">último post</a>, aproveitando a deixa de <a href="http://www.milfont.org/tech/2007/10/04/deteccao-otimizada-com-javascript/">detecção otimizada</a> trabalhando junto com o Design Pattern <a href="http://en.wikipedia.org/wiki/Bridge_pattern">Bridge</a>,  aproveitaremos esse conceito para encapsularmos a complexidade de se trabalhar com códigos que tenham que rodar em múltiplos Browsers.</p>
<p>O padrão Bridge define o desacoplamento da abstração (interface) com suas implementações e cada implementação possa variar independentemente.</p>
<p>No código passado vimos isso implementado na função addEvent como segue:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> addEvent <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    el<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'on'</span><span style="color: #339933;">+</span>type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> fn<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    addEvent <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span> fn<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: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    addEvent <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'on'</span><span style="color: #339933;">+</span>type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nesse código o método addEvent é uma forma genérica de adicionar eventos a um elemento DOM na página e encapsula o comportamento implementado pelos Browsers. Essa estratégia pode e deve ser adotada em todo o código que necessite de implementação diferente dependendo do navegador, o chamado Cross Browser.</p>
<p>Cross Browser é a técnica de implementar uma construção que rode em múltiplos navegadores sem diferença perceptível ao usuário. O custo de aplicar essa técnica é diminuir a performance da aplicação como um todo, aumentar a complexidade do código mantido, propiciar um ambiente mais sujeito a falhas de implementação e cair em bugs do próprio navegador (como o Memory-Leak no IE).</p>
<p>Instanciar o objeto XMLHttpRequest é outra situação que possui diferença entre o líder de mercado e os demais navegadores. Aplicando essa técnica, faríamos o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> getXHR <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: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">http</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> XMLHttpRequest<span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">http</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">var</span> isIE <span style="color: #339933;">=</span> <span style="color: #339933;">!!</span>document.<span style="color: #660066;">attachEvent</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>isIE<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> msxml <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>
        <span style="color: #3366CC;">'MSXML2.XMLHTTP.3.0'</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">'MSXML2.XMLHTTP'</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">'Microsoft.XMLHTTP'</span>
      <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> len <span style="color: #339933;">=</span> msxml.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> len<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
          http <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ActiveXObject<span style="color: #009900;">&#40;</span>msxml<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #006600; font-style: italic;">//cria nova implementação</span>
          getXHR <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: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">new</span> ActiveXObject<span style="color: #009900;">&#40;</span>msxml<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
          <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <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: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dei a dica no artigo passado de criar um arquivo para cada implementação de navegador diferente e aplicar o conceito de Lazy Loading para carregar sob demanda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2007/10/05/bridge-para-encapsular-o-cross-browser/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

