<?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>Mauricio Aniche</title>
	<atom:link href="http://www.aniche.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aniche.com.br</link>
	<description>Clean code that works!</description>
	<lastBuildDate>Mon, 12 Jul 2010 15:03:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Restfulie 0.5.0 has been released!</title>
		<link>http://www.aniche.com.br/2010/07/restfulie-0-5-0-has-been-released/</link>
		<comments>http://www.aniche.com.br/2010/07/restfulie-0-5-0-has-been-released/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 15:03:21 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[restfulie]]></category>
		<category><![CDATA[asp.net mvc 2]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=178</guid>
		<description><![CDATA[Mauricio Aniche with contributions from Pedro Reys and Felipe Seixas have released the Restfulie&#8217;s C# Server 0.5  support on top of Asp.Net Mvc 2.
As new versions of Restfulie come up, it becomes more clear which extension points are important and should be easy to be used, the media type and http results are two of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.twitter.com/mauricioaniche">Mauricio Aniche</a> with contributions from <a href="http://www.twitter.com/pedroreys">Pedro Reys</a> and <a href="http://www.twitter.com/seixasfelipe">Felipe Seixas</a> have released the Restfulie&#8217;s C# Server 0.5  support on top of Asp.Net Mvc 2.</p>
<p>As new versions of Restfulie come up, it becomes more clear which extension points are important and should be easy to be used, the media type and http results are two of those aspects that Restfulie C# tries to help the developers by allowing them to write classes focused on one task only as we shall see here.</p>
<p>A simple C# Item model can be rendered in your controller as in ruby and java:</p>
<pre class="csharp">[ActAsRestfulie]
public class ItemsController : Controller
{
private MemoryDatabase database;

public ItemsController()
{
  database = new MemoryDatabase();
}

public virtual ActionResult Index()
{
  return new Ok(database.List());
}

public virtual ActionResult Get(int id)
{
  var item = database.List().Where(i =&gt; i.Id == id).SingleOrDefault();
  if (item == null) return new NotFound();
  return new OK(item);
}
}
</pre>
<p>If you want to add some link relations to any resource, simply let your model implement IBehaveAsResource and add the SetRelations method:</p>
<pre class="csharp">public class Item : IBehaveAsResource
{
public void SetRelations(Relations relations)
{
  relations.Named("self").Uses().Get(Id);
  relations.Named("origin").At("http://www.some-fabric.com/");
}
}
</pre>
<p>The http GET request to an item with application/json in the accept header will now return:</p>
<pre class="javascript">{"Id":1,"Name":"Pencil","Price":"1.50",
"links":[{"rel":"self","href":"http://localhost:1198/Items/1"},
{"rel":"origin","href":"http://www.some-fabric.com/"}]}
</pre>
<p>But we know relations work in different ways with different media types (and the Link header) so you might want to add your own media type marshaller/unmarshaller, which is capable of understanding a new media type. Restfulie C# comes with support for application/json, application/xml and application/atom+xml.</p>
<p>If you want to add your own result, simply implement a RestfulieResult using a series of decorators to your new result:</p>
<pre class="csharp">public class OK : RestfulieResult
{
public OK() { }
public OK(object model) : base(model) { }

public override ResultDecorator GetDecorators()
{
  return new StatusCode((int)HttpStatusCode.OK,
    new ContentType(MediaType.Synonyms.First(),
    new Content(BuildContent())));
}
}
</pre>
<p>This <a href="http://wiki.github.com/mauricioaniche/restfulie.net/">release documentation is already out</a> and the <a href="http://github.com/mauricioaniche/restfulie.net/downloads">download</a> can also be done at github.</p>
<p>Restfulie C# requires the dot net framework 3.5+, and uses castle in order to create dynamic proxy for setting up relations.﻿</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/07/restfulie-0-5-0-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minha apresentação na Agile Brazil 2010</title>
		<link>http://www.aniche.com.br/2010/06/minha-apresentacao-na-agile-brazil-2010/</link>
		<comments>http://www.aniche.com.br/2010/06/minha-apresentacao-na-agile-brazil-2010/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 21:33:46 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[Agile Brazil 2010]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[desvios]]></category>
		<category><![CDATA[engenharia de software empirica]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=176</guid>
		<description><![CDATA[Olá pessoal,
Obrigado a quem compareceu na apresentação! Os slides estão aqui!
Desvios comuns em TDD
View more presentations from mauricioaniche.
Qualquer dúvida, sugestão, crítica, por favor me mandem!  

]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>Obrigado a quem compareceu na apresentação! Os slides estão aqui!</p>
<div id="__ss_4607459" style="width: 425px;"><strong><a title="Desvios comuns em TDD" href="http://www.slideshare.net/mauricioaniche/desvios-comuns-em-tdd">Desvios comuns em TDD</a></strong><object id="__sse4607459" 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=agilebrazil2010-100624162444-phpapp02&amp;stripped_title=desvios-comuns-em-tdd" /><param name="name" value="__sse4607459" /><param name="allowfullscreen" value="true" /><embed id="__sse4607459" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agilebrazil2010-100624162444-phpapp02&amp;stripped_title=desvios-comuns-em-tdd" name="__sse4607459" 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/mauricioaniche">mauricioaniche</a>.</div>
<div style="padding: 5px 0 12px;">Qualquer dúvida, sugestão, crítica, por favor me mandem! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/06/minha-apresentacao-na-agile-brazil-2010/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eu faço TDD. Preciso testar?</title>
		<link>http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/</link>
		<comments>http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 15:00:35 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[software design]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=173</guid>
		<description><![CDATA[Claro que sim.
TDD é uma atividade de design. O teste de unidade que você escreve serve basicamente para definir suas expectativas em relação ao código que você vai escrever. E, ao fazer isso, você pensa não só no nível da implementação do algoritmo, mas em um nível um pouco mais alto: no nível de design. [...]]]></description>
			<content:encoded><![CDATA[<p>Claro que <strong>sim</strong>.</p>
<p>TDD é uma atividade de design. O teste de unidade que você escreve serve basicamente para definir suas expectativas em relação ao código que você vai escrever. E, ao fazer isso, você pensa não só no nível da implementação do algoritmo, mas em um nível um pouco mais alto: no nível de design. TDD permite que você brinque e experimente diferentes possíveis designs, dando feedback rápido sobre o resultado obtido, até que você encontre o design ideal para aquela situação.</p>
<p>Ou seja, quando você faz TDD, você pensa exclusivamente em design e não em testes. É uma prática de suporte para <strong>design</strong> de software.</p>
<p>Mas&#8230; É claro que você precisa testar! Você não apaga os testes que você produziu usando TDD, óbvio. Mas muito provavelmente eles não testam todas as possibilidades possíveis. E é aí que outras técnicas entram em cena, e você pode encontrar muita informação sobre elas em [1][2].</p>
<p>Resumindo, use TDD quando você precisa trabalhar no design de determinada classe ou módulo. Quando você estiver satisfeito com design, é hora de testar! Aí você pode fazer test-first, test-last, ou que você preferir, mas teste de verdade!</p>
<p>[1] The Art of Software Testing &#8211; Myers<br />
[2] Introdução ao Teste de Software &#8211; Maldonado, Delamaro, Jino</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>1st International Workshop on Test-Driven Development (TDD 2010)</title>
		<link>http://www.aniche.com.br/2010/04/1st-international-workshop-on-tdd-2010/</link>
		<comments>http://www.aniche.com.br/2010/04/1st-international-workshop-on-tdd-2010/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 02:35:59 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[TDD2010]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[atdd]]></category>
		<category><![CDATA[common mistakes in tdd]]></category>
		<category><![CDATA[paris]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=154</guid>
		<description><![CDATA[No dia 11 de abril participei do 1st International Workshop on Test Driven Devevelopment (TDD2010), realizado em Paris. Fui apresentar meu paper entitulado &#8220;Most Common Mistakes in TDD Practice: Results From An Online Survey With Developers&#8221; (que pode ser baixado aqui). A plateia contava com pessoas de renome na comunidade como Michael Feathers, Steve Freeman, [...]]]></description>
			<content:encoded><![CDATA[<p>No dia 11 de abril participei do 1st International Workshop on Test Driven Devevelopment (<a href="http://agile.csc.ncsu.edu/tdd/">TDD2010</a>), realizado em Paris. Fui apresentar meu paper entitulado <em>&#8220;Most Common Mistakes in TDD Practice: Results From An Online Survey With Developers&#8221; </em>(que pode ser baixado <a href="http://www.ime.usp.br/~aniche/tdd-survey">aqui</a>). A plateia contava com pessoas de renome na comunidade como Michael Feathers, Steve Freeman, Laurie Williams, David Janzen, John Clements, entre outros.</p>
<p>O keynote foi feito pelo Steve Freeman, autor de um dos melhores livros de OO e TDD que já li (<a href="http://www.amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/0321503627">Growing Object-Oriented Software, Guided by Tests</a>). Ele basicamente mostrou seu ponto de vista sobre TDD. Segundo ele, &#8220;programação comum está para TDD assim como programação procedural está para programação orientada à objetos&#8221;. Foco bem definido, bom feedback e progredir sem medo também foram citados como vantagens. Uma citação muito interessante, e que venho pensando há muito tempo sobre como transmitir essa idéia é a de que &#8220;o programador deve entender o porquê TDD funciona; caso contrário, é apenas burocracia&#8221;.</p>
<p>Em seguida, o aluno de mestrado Theodore Hellman nos apresentou a ferramenta que seu grupo desenvolve em Calgary, Canadá. Ela testa interfaces de uma maneira muito interessante: antes de desenvolver cada interface, o programador faz protótipos na ferramenta, desenhando caixas de texto, botões (parecidos com os que desenhamos no papel). A mágica acontece depois que o protótipo está pronto: você testa o protótipo, clicando nos botões e digitando valores nas caixas de texto fictícias, e a aplicação os executa na aplicação real! O problema é que funciona apenas para aplicações .NET Windows Forms.</p>
<p>Em seguida a apresentação do John Clements (um dos criadores do Dr. Scheme) e do David Janzen (professor da Politecnica da California, possui muitas publicações relacionadas a experimentos com TDD) sobre o quão difícil é ensinar TDD para os alunos. Apresentaram algumas técnicas de ensino e problemas que já tiveram nas primeiras aulas sobre o assunto.</p>
<p>O alemão Florian Barth, da Universidade de Manheim, mostrou a ferramenta para testes de aceitação que seu grupo trabalha. É uma mistura de Fitnesse com linguagem de programação, onde você escreve não só os casos de testes como a implementação do teste em planilhas. É bem interessante, já que basicamente elimina o trabalho de codificação dos testes. O problema é que algumas coisas ainda são um pouco complicadas e exigem um trabalho extra na planilha. Mas sem dúvida é um projeto para ficar de olho.</p>
<p>Robert Chatney apresentou seu framework LiFT, uma DSL para testes de aceitação em Java, inspirada no Cucumber. Ela faz com que seus testes em Java fiquem muito fluentes. Totalmente extensível, é um projeto que pretendo colaborar em breve. O código pode ser encontrado no Google Code.</p>
<p>Em seguida, apresentei meu paper sobre erros (ou desvios) que os programadores cometem quando praticam TDD. Apesar de algumas críticas em relação à metodologia (problemas esses que já eram conhecidos e estavam na seção de &#8220;ameaças a validar&#8221; do paper), as ideias ali foram elogiadas e todos concordaram com os problemas levantados pelo artigo. Lembrando que esse artigo é apenas um trabalho em andamento, parte da minha dissertação de mestrado. Espero postar partes dela em breve.</p>
<p>Chris Agmen-Smith apresentou sua experiência em um projeto real com ATDD, e fez questão de mostrar que é possível fazer ATDD sem grandes custos, mas com muitos benefícios.</p>
<p>No final do dia, Raj Mudhar solicitou ajuda para pesquisar na área de ATDD em projetos de grande porte. Qualquer empresa que tenha projetos grandes pode participar, divulgando seus dados e juntos publicarem os resultados em conferências de peso.</p>
<p>Resumindo, o evento foi muito muito bom. Um dia inteiro com riquíssimas discussões sobre as mais variadas pesquisas em TDD. Além disso, pude validar muitas ideias com pessoas realmente influentes na área. Um ponto muito interessante é que não estamos tão longe do que eles praticam no dia-a-dia, mas ainda temos um longo caminho a percorrer!</p>
<p>Até a TDD2011, em Berlin! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/04/1st-international-workshop-on-tdd-2010/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>TDD realmente ajuda?</title>
		<link>http://www.aniche.com.br/2010/04/tdd-realmente-ajuda/</link>
		<comments>http://www.aniche.com.br/2010/04/tdd-realmente-ajuda/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 13:43:17 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[experimentos]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=120</guid>
		<description><![CDATA[Geralmente um programador que nunca praticou TDD tem essa dúvida: será que TDD realmente ajuda na qualidade do código? E na redução de defeitos? Ele aumenta ou diminui a produtividade, afinal? Mas como toda e qualquer prática em engenharia de software, é muito difícil avaliar e chegar a uma conclusão exata sobre seus ganhos e [...]]]></description>
			<content:encoded><![CDATA[<p>Geralmente um programador que nunca praticou TDD tem essa dúvida: será que TDD realmente ajuda na qualidade do código? E na redução de defeitos? Ele aumenta ou diminui a produtividade, afinal? Mas como toda e qualquer prática em engenharia de software, é muito difícil avaliar e chegar a uma conclusão exata sobre seus ganhos e benefícios.</p>
<p>Nos últimos anos, a comunidade acadêmica vem rodando diversos experimentos para tentar mostrar de maneira empírica que TDD realmente ajuda no processo de desenvolvimento de software. Alguns desses estudos são feitos por professores bastante conhecidos na comunidade, como a prof. Laurie Williams (North Carolina State University) e o prof. David Janzen (California Polytechnic State University).</p>
<p>Algumas dessas pesquisas investigam o fato de TDD reduzir o número de defeitos de um software; já outros investigam o fato de TDD produzir código de melhor qualidade. Alguns até pesquisam por indícios de aumento de produtividade.<strong></strong></p>
<p><strong>Estudos na indústria</strong></p>
<p>Janzen [5] mostrou que programadores usando TDD na indústria produziram código que passaram em aproximadamente 50% mais testes caixa-preta do que</p>
<p>o código produzido por grupos de controle que não usavam TDD. Além do mais, o grupo que usava TDD gastou menos tempo debugando. Janzen também mostrou que a complexidade dos algoritmos era muito menor e a quantidade e cobertura dos testes era maior nos códigos escritos com TDD.</p>
<p>Um estudo feito pelo Maximillien e Williams [6] mostrou uma redução de 40-50% na quantidade de defeitos e um impacto mínimo na produtividade quando programadores usaram TDD.</p>
<p>Outro estudo feito por Lui e Chan [7] comparando dois grupos, um utilizando TDD e o outro escrevendo testes apenas após a implementação, mostrou uma redução significante no número defeitos. Além do mais, os defeitos que foram encontrados eram corrigidos mais rapidamente pelo grupo que utilizou TDD. O estudo feito por Damm, Lundberg e Olson [8] também mostra uma redução significante nos defeitos.</p>
<p>O estudo feito por George e Williams[9] mostrou que, apesar de TDD poder reduzir inicialmente a produtividade dos desenvolvedores mais inexperientes, o código produzido passou entre 18% a 50% mais em testes caixa-preta do que códigos produzidos por grupos que não utilizavam TDD. Esse código também apresentou uma cobertura entre 92% a 98%. Uma análise qualitativa mostrou que 87.5% dos programadores acreditam que TDD facilitou o entendimentos dos requisitos e 95.8% acreditam que TDD reduziu o tempo gasto com debug. 78% também acreditam que TDD aumentou a produtividade da equipe. Entretanto, apenas 50% acreditam que TDD ajuda a diminuir o tempo de desenvolvimento. Sobre qualidade, 92% acreditam que TDD ajuda a manter um código de maior qualidade e 79% acreditam que ele promove um design mais simples.</p>
<p>Nagappan [12] mostrou um estudo de caso na Microsoft e na IBM e os resultados indicaram que o número de defeitos de quatro produtos diminuir entre 40% a 90% em relação à projetos similares que não usaram TDD. Entretanto, o estudo mostrou também TDD aumentou o tempo inicial de desenvolvimento entre 15% a 35%.</p>
<p>Langr [10] mostrou que TDD aumenta a qualidade código, provê uma facilidade maior de manutenção e ajuda a produzir 33% mais testes comparados a abordagens tradicionais.</p>
<p><strong>Estudos na academia</strong></p>
<p>Um estudo feito por Erdogmus et all [11] com 24 estudos de graduação mostrou que TDD aumenta a produtividade. Entretanto nenhuma diferença de qualidade no código foi encontrada.</p>
<p>Outro estudo feito por Janzen[13] com três diferentes grupos de alunos (cada um deles usando uma abordagem diferente: TDD, test-last, sem testes), mostrou que o código produzido pelo time que fez TDD usou melhor conceitos de orientação a objetos e as responsabilidades foram separadas em 13 diferentes classes enquanto que os outros times produziram um código mais procedural. O time de TDD também produziu mais código e entregou mais features. Os testes produzidos por esse time teve duas vezes mais asserções que os outros e cobriu 86% mais branches do que o time test-last.  Além do mais, as classes testadas tinham valores de acoplamento 104% menor do que as classes não testadas e os métodos eram, na média, 43% menos complexos do que os não-testados.</p>
<p>O estudo de Müller e Hagner [17] mostrou que TDD não resulta em melhor qualidade ou produtividade. Entretanto, os estudantes perceberam um melhor reuso dos códigos produzidos com TDD.</p>
<p>Steinberg [15] mostrou que código produzido com TDD é mais coeso e menos acoplado. Os estudantes também reportaram que os defeitos eram mais fáceis de serem corrigidos.</p>
<p>O estudo do Edwards [16] com 59 estudantes mostrou que código produzido com TDD tem 45% menos defeitos e faz com que o programador se sinta mais a vontade com ele.</p>
<p><strong>Conclusão</strong></p>
<p>A maioria dos experimentos feitos tanto na indústria quanto na academia mostram que TDD melhora o processo de desenvolvimento de software, aumentando a qualidade do código, reduzindo o número de defeitos, diminuindo o tempo gasto com depuração e até aumentando a produtividade dos desenvolvedores.</p>
<p>Entretanto, mais experimentos devem ser conduzidos, levando em consideração diferentes fatores de influência que existem em um ambiente de desenvolvimento de software.</p>
<p><strong>Referências</strong></p>
<p>Podem ser encontradas <a href="http://www.aniche.com.br/2010/04/referencias-sobre-tdd/" target="_self">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/04/tdd-realmente-ajuda/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Referências sobre TDD</title>
		<link>http://www.aniche.com.br/2010/04/referencias-sobre-tdd/</link>
		<comments>http://www.aniche.com.br/2010/04/referencias-sobre-tdd/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 02:47:18 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=139</guid>
		<description><![CDATA[Essas são as referências utilizadas no meu artigo &#8220;Most Common Mistakes in Test-Driven Development Practice: Results from an Online Survey with Developers&#8221;, publicado no 1st International Workshop on Test-Driven Development 2010 (TDD2010).
&#8211;
[1] Beck, K., Extreme Programming Explained, Second Edition: Embrace Change. Boston, Massachusetts, USA, Addison-Wesley, 2004.
[2] Beck, K., Beedle, M., et al., Manifesto for Agile [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">Essas são as referências utilizadas no meu artigo<em> &#8220;Most Common Mistakes in Test-Driven Development Practice: Results from an Online Survey with Developers&#8221;</em>, publicado no 1st International Workshop on Test-Driven Development 2010 (TDD2010).</div>
<div>&#8211;</div>
<div>[1] Beck, K., Extreme Programming Explained, Second Edition: Embrace Change. Boston, Massachusetts, USA, Addison-Wesley, 2004.</div>
<div id="_mcePaste">[2] Beck, K., Beedle, M., et al., Manifesto for Agile Software Development, 01.12.2010, http://www.agilemanifesto.org.</div>
<div id="_mcePaste">[3] Freeman, S., Pryce, N., Growing Object-Oriented Software, Guided by Tests. First edition, Addison-Wesley Professional, 2009.</div>
<div id="_mcePaste">[4] Siniaalto, M. Test-Driven Development: Empirical Body of Evidence. Technical report, ITEA, Information Technology for European Advancement, 2006.</div>
<div id="_mcePaste">[5] Janzen, D., Software Architecture Improvement through Test-Driven Development. Conference on Object Oriented Programming Systems Languages and Applications, ACM, 2005.</div>
<div id="_mcePaste">[6] Maximilien, E. M. and L. Williams. Assessing test-driven development at IBM. IEEE 25th International Conference on Software Engineering, Portland, Orlando, USA, IEEE Computer Society, 2003.</div>
<div id="_mcePaste">[7] Lui, K. M. and K. C. C. Chan. Test-driven development and software process improvement in China. 5th International Conference XP 2004, Garmisch-Partenkirchen, Germany, Springer-Verlag, 2004.</div>
<div id="_mcePaste">[8] Damn, L.-O., Lundberg, L., et al. Introducing Test Automation and Test-Driven Development: An Experience Report. Electronic Notes in Theoretical Computer Science 116: 3 – 15, 2005.</div>
<div id="_mcePaste">[9] George, B., Williams, L., An Initial Investigation of Test- Driven Development in Industry. ACM Symposium on Applied Computing. Melbourne, Florida, USA, 2003.</div>
<div id="_mcePaste">[10] Langr, J., Evolution of Test and Code Via Test-First Design, 02.12.2010, http://www.objectmentor.com/resources/ articles/tfd.pdf</div>
<div id="_mcePaste">[11] Erdogmus, H., Morisio, M., et al. On the effectiveness of the test-first approach to programming. IEEE Transactions on Software Engineering 31(3): 226 – 237, 2005.</div>
<div id="_mcePaste">[12] Nagappan, N., Bhat, T. Evaluating the efficacy of test- driven development: industrial case studies. Proceedings of the 2006 ACM/IEEE international symposium on Empirical software engineering.</div>
<div id="_mcePaste">[13] Janzen, D., Saiedian, H. On the Influence of Test-Driven Development on Software Design. Proceedings of the 19th Conference on Software Engineering Education &amp; Training (CSEET&#8217;06).</div>
<div id="_mcePaste">[14] Pancur, M., Ciglaric, M., et al. Towards Empirical Evaluation of Test-Driven Development in a University Environment. EUROCON 2003, Ljubljana, Slovenia, IEEE.</div>
<div id="_mcePaste">[15] Steinberg, D. H. The Effect of Unit Tests on Entry Points, Coupling and Cohesion in an Introductory Java Programming Course. XP Universe, Raleigh, North Carolina, USA, 2001.</div>
<div id="_mcePaste">[16] Edwards, S. H. Using Test-Driven Development in a Classroom: Providing Students with Automatic, Concrete Feedback on Performance. International Conference on Education and Information Systems: Technologies and Applications, Orlando, Florida, USA, 2003.</div>
<div id="_mcePaste">[17] Müller, M. M., Hagner, O. Experiment about test-first programming. IEE Proceedings 149(5): 131 – 136, 2002.</div>
<div id="_mcePaste">[18] Beck, K. Test-Driven Development: By Example. Addison-Wesley Professional, 2002.</div>
<div id="_mcePaste">[19] Astels, D. Test-Driven Development: A Practical Guide. Upper Saddle River, New Jersey, USA, Prentice Hall, 2003.</div>
<div id="_mcePaste">[20] Kerievsky, J. Refactoring to Patterns. Addison-Wesley Professional, 2004.</div>
<div id="_mcePaste">[21] Fowler, M., Beck, K., Brant, J., Opdyke, W., Roberts D. Refactoring: Improving the Design of the Existing Code. Addison-Wesley Professional, 1999.</div>
<div id="_mcePaste">[22] Begel, A., Simon, B. Struggles of New College Graduates in Their First Software Development Job. SIGCSE Bulletin, 40, n° 1, 226-230, ACM, 2008.</div>
<div id="_mcePaste">[23] Meszaros, G. xUnit Test Patterns: Refactoring Test Code. Addison-Wesley Professional, 2007.</div>
<div id="_mcePaste">[24] Gamma, E., Helm, R., Johnson, R., Vlissides, J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional, 1994.</div>
<div id="_mcePaste">[25] Beck, K. Aim, fire. IEEE Software 18, page 87-89, 2001. [26] Benner, P. From novice to expert. The American Journal</div>
<div id="_mcePaste">of Nursing, 1982.</div>
<div id="_mcePaste">[27] Test Driven Development Discussion List.Yahoo! Groups, 07.01.2010. http://tech.groups.yahoo.com/group/ testdrivendevelopment/.</div>
<div id="_mcePaste">[28] Agile Testing Discussion List. Yahoo! Groups, 07.01.2010.	http://tech.groups.yahoo.com/group/agile- testing/.</div>
<div id="_mcePaste">[29] Alt.NET Discussion List. Yahoo! Groups, 07.01.2010. http://tech.groups.yahoo.com/group/altdotnet/.</div>
<div id="_mcePaste">[30] .NET Architects Brazilian Discussion List. Google Groups, 07.01.2010. http://www.dotnetarchitects.net/.</div>
<div id="_mcePaste">[31] Microblog. Twitter, 07.01.2010. http://twitter.com/mauricioaniche/status/7493800359.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/04/referencias-sobre-tdd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Survey on TDD feelings and experiences</title>
		<link>http://www.aniche.com.br/2010/01/survey-on-tdd-feelings-and-experiences/</link>
		<comments>http://www.aniche.com.br/2010/01/survey-on-tdd-feelings-and-experiences/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 23:18:56 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[survey]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=82</guid>
		<description><![CDATA[I am working on article about TDD (which is the subject of my master thesis as well) and I just created a survey about your TDD feelings and experiences. If you have a free time, please, fill it out; it should not take too long.
You can find the survey at http://spreadsheets.google.com/viewform?formkey=dFlITDZfSTNkVmd5bEVQSFl4cTB3cHc6MA
I also twitted about it [...]]]></description>
			<content:encoded><![CDATA[<p id="_mcePaste">I am working on article about TDD (which is the subject of my master thesis as well) and I just created a survey about your TDD feelings and experiences. If you have a free time, please, fill it out; it should not take too long.</p>
<p id="_mcePaste">You can find the survey at <a href="I am working on article about TDD (which is the subject of my master thesis as well) and I just created a survey about your TDD feelings and experiences. If you have a free time, please, fill it out; it should not take too long. You can find the survey at http://spreadsheets.google.com/viewform?formkey=dFlITDZfSTNkVmd5bEVQSFl4cTB3cHc6MA I also twitted about it (http://twitter.com/mauricioaniche/status/7493800359), so it would nice if you re-tweet! :) ">http://spreadsheets.google.com/viewform?formkey=dFlITDZfSTNkVmd5bEVQSFl4cTB3cHc6MA</a></p>
<p>I also twitted about it (<a href="http://twitter.com/mauricioaniche/status/7493800359">http://twitter.com/mauricioaniche/status/7493800359</a>), so it would nice if you re-tweet! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/01/survey-on-tdd-feelings-and-experiences/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Caelum Day In Rio 2009</title>
		<link>http://www.aniche.com.br/2009/11/caelum-day-in-rio-2009/</link>
		<comments>http://www.aniche.com.br/2009/11/caelum-day-in-rio-2009/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 00:56:30 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[caelum]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[persistencia]]></category>
		<category><![CDATA[vraptor]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=78</guid>
		<description><![CDATA[No último fim de semana estive no Rio de Janeiro para participar do Caelum Day In Rio 2009, organizado pela Caelum.
A primeira palestra foi dada pelo Phillip Calçado, consultor da ThoughtWorks. &#8220;Tudo o que eu gostaria de saber antes de virar líder técnico&#8221; são um conjunto de dicas que ele aprendeu ao longo do tempo. [...]]]></description>
			<content:encoded><![CDATA[<p>No último fim de semana estive no Rio de Janeiro para participar do <a href="http://www.caelum.com.br/caelumday">Caelum Day In Rio 2009</a>, organizado pela <a href="http://www.caelum.com.br" target="_blank">Caelum</a>.</p>
<p>A primeira palestra foi dada pelo <a href="http://www.fragmental.com.br" target="_blank">Phillip Calçado</a>, consultor da ThoughtWorks. &#8220;Tudo o que eu gostaria de saber antes de virar líder técnico&#8221; são um conjunto de dicas que ele aprendeu ao longo do tempo. Uma das lições foi sobre <strong>ENTREGAR VALOR</strong> o tempo todo, no momento exato e antes que fosse tarde demais! Outra lição interessante foi que <strong>IMPREVISTOS ACONTECEM</strong>, então ajude a evitá-los! Outras dicas importantes, como TDD, builds rápidos, integração contínua, criação de ambiente de testes parecido (o máximo possível) com o ambiente de produção, cliente sempre por perto, domain-driven design e entregas incrementais e frequentes foram citadas como &#8220;barreiras&#8221; para ajuda a evitar os imprevistos. Outra dica é para não se desesperar caso a barreira quebre (apenas garanta que você saiba quando ela quebrar). Ele disse uma frase que achei bastante interessante sobre isso: <em>&#8220;Não é ser a prova de falhas, e sim tornar seguro falhar&#8221;</em>.</p>
<p>A próxima palestra foi do <a href="http://www.fabiokung.com">Fábio Kung</a>, sobre Cloud Computing. O Fábio parecia bem animado com o problema que tem em mãos! Foi bastante interessante, mostrando as possíveis diferentes classificações para uma cloud (IaaS, PaaS, SaaS). Explicou muito bem a diferença de cada uma delas, de maneira clara. Além disso mostrou dois vídeos engraçadíssimos sobre um tal de Dr. Cloud (ou algo assim)! Não peguei o link, assim que conseguir coloco aqui!</p>
<p>O <em>lightning talk</em> do Rafael Martinelli sobre Flex também foi bastante interessante. Mostrou vários exemplos de aplicações RIA feitos pela DClick, realmente impressionantes. Ele comentou também que RIA não é apenas &#8220;deixar bonito&#8221;; há um propósito por trás disso. Uma boa experiência do usuário traz mais retorno para a empresa.</p>
<p>A palestra sobre RESTful Web Services do Luiz Costa e do Sérgio Junior começou com eles contando uma história de uma aplicação que precisava se integrar com outras. E a partir dessa história, mostraram cada tentativa de integração até se chegar em web services. Quando chegaram em REST, explicaram bem as idéias e conceitos. Terminaram falando algumas das vantagens e desvantagens do uso de REST. Os slides estão em <a href="http://www.slideshare.net/sergiorjunior/rest-teoria-e-pratica">http://www.slideshare.net/sergiorjunior/rest-teoria-e-pratica</a></p>
<p>O <a href="http://guilhermesilveira.wordpress.com/">Guilherme Silveira</a> e o Filipe Sabella falaram sobre o novo <a href="http://www.vraptor.com.br">VRaptor3</a>, framework  MVC Java para Web, criado pela Caelum. Contaram a evolução do framerowk desde sua primeira versão em 2004 até agora. Mostraram como é fácil integrar o VRaptor com outros frameworks famosos no mercado como Spring, DWR, Flex. Uma característica interessante é que ele é refactor friendly (se você refatorar um método de um controller, não é necessário alterar XMLs para arrumar os redirecionamentos!). Você pode construir suas aplicações utilizando conceitos de REST também, de maneira fácil (basta utilizar algumas anotações e está pronto). Além de um monte de funcionalidades que já vem de graça com ele, como uploads e downloads de arquivos de maneira fácil, views em JSON, XML, e etc. Enfim, sugiro você avaliar o VRaptor como seu próximo framework para Web. (Ah, detalhe da palestra foi a foto do Filipe dormindo no sofá!).</p>
<p>O <a href="http://www.caueguerra.com" target="_blank">Cauê Guerra</a> falou sobre &#8220;O Ano do Rails no Brasil&#8221;. Mostrou as diversas facilidades do desenvolvimento Rails e mostrou uma série de empresas que já o utilizam. E pra quem pensa que só empresas pequenas usam, ele mostrou uma lista de empresas de grande porte que já utilizam Rails em algumas de suas aplicações! No final, mostrou que já existem boas vagas para profissionais Rails (detalhe para a foto das meninas procurando por Railers!). Os slides da palestra dele estão em <a href="http://www.slideshare.net/caueguerra/2009-o-ano-do-ruby-on-rails-no-brasil-caelumday-2009">http://www.slideshare.net/caueguerra/2009-o-ano-do-ruby-on-rails-no-brasil-caelumday-2009</a>.</p>
<p>O <em>lightning talk</em> do <a href="http://www.ime.usp.br/~peas/" target="_blank">Paulo Silveira</a> sobre Persistência Java foi bastante interessante. Ele mostrou a evolução do processo de persistência de dados em Java, indo desde a conexão direta com o banco até JP, discutindo os prós e contras de cada abordagem. Muito legal o link que ele fez no final com todas as outras palestras do evento.</p>
<p>A última palestra entitulada NoSQL (Not Only SQL) do <a href="http://twitter.com/steppat" target="_blank">Nico Steppat</a> comentou sobre banco de dados não-relacionais. Mostrou como é realmente difícil escalar bancos de dados relacionais, comentou sobre banco de dados como CouchDB, Project Voldemort, Bigtable, e etc,  e discutiu sobre técnicas que eles usam para distribuir. Mostrou que conseguimos controlar apenas dois elementos desses três: Consistência, Disponibilidade e Tolerância à Partição (Brewer, 2000). E cada um deve fazer sua escolha dependendo da sua necessidade.</p>
<p>O evento acabou aí, e eu tive que correr pro aeroporto, pois meu avião saia do Galeão! Resumindo, o evento foi muito bom e valeu muito a pena! Espero ir de novo ano que vem! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por fim, gostaria de agradecer ao Paulo Silveira pelo convite!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2009/11/caelum-day-in-rio-2009/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Encontro Ágil 2009</title>
		<link>http://www.aniche.com.br/2009/10/encontro-agil-2009/</link>
		<comments>http://www.aniche.com.br/2009/10/encontro-agil-2009/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 22:07:24 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[xp]]></category>
		<category><![CDATA[encontro agil]]></category>
		<category><![CDATA[usp]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=75</guid>
		<description><![CDATA[O Encontro Ágil já está entre os maiores eventos de métodos ágeis do Brasil. Este ano serão dois dias de encontro, com a participação de centenas de profissionais e estudantes. O evento reunirá alguns dos principais nomes brasileiros do desenvolvimento ágil de software, e desta vez com convidados internacionais de destaque mundial na comunidade ágil.
O [...]]]></description>
			<content:encoded><![CDATA[<p>O <strong>Encontro Ágil</strong> já está entre os maiores eventos de métodos ágeis do Brasil. Este ano serão dois dias de encontro, com a participação de centenas de profissionais e estudantes. O evento reunirá alguns dos principais nomes brasileiros do desenvolvimento ágil de software, e desta vez com convidados internacionais de destaque mundial na comunidade ágil.</p>
<p>O evento acontecerá dentro da Universidade de São Paulo (USP). Os dias 10 e 11 de outubro estão reservados para discussões, trocas de experiências e palestras de especialistas em Programação eXtrema, Scrum, Crystal e nas metodologias mais produtivas do mercado.</p>
<p>Conheça os profissionais que já usam métodos ágeis. Junte-se ao grupo que está revolucionando a maneira de produzir software. Participe das discussões mais atuais do mercado, tire suas dúvidas e descubra como as técnicas ágeis podem ajudá-lo a aumentar a produtividade da sua equipe e a qualidade do seu software.</p>
<p>Este ano, nossos convidados especiais são Jutta Eckstein e Joe Yoder, que ministrarão keynotes e tutoriais durante o evento.</p>
<p>Mais informações em <a href="http://www.encontroagil.com.br">http://www.encontroagil.com.br</a></p>
<p>Espero vocês lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2009/10/encontro-agil-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como gerenciar a dependência entre entidades e repositórios?</title>
		<link>http://www.aniche.com.br/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/</link>
		<comments>http://www.aniche.com.br/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 15:26:00 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">/post/2009/09/26/Como-gerenciar-a-dependencia-entre-entidades-e-repositorios.aspx</guid>
		<description><![CDATA[Engraçado que esse é um assunto onde há sempre mais um &#8220;ponto&#8221; a acrescentar. Motivados pelo excelente post da Caelum e discussão do GUJ (onde ambos não são tão recentes assim), eu e o Eduardo Amuri discutimos mais alguns pontos&#8230; Alguns deles podem já ter sido abordados nos links anteriores, mas vale a revisão.
Eu ia [...]]]></description>
			<content:encoded><![CDATA[<p>Engraçado que esse é um assunto onde há sempre mais um &#8220;ponto&#8221; a acrescentar. Motivados pelo excelente <a id="xyw7" title="post da Caelum" href="http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/">post da Caelum</a> e <a id="wcnf" title="discussão do GUJ" href="http://www.guj.com.br/posts/list/60916.java">discussão do GUJ</a> (onde ambos não são tão recentes assim), eu e o <a id="lnsm" title="Eduardo Amuri" href="http://www.linkedin.com/pub/eduardo-amuri-antunes/12/8a6/828">Eduardo Amuri</a> discutimos mais alguns pontos&#8230; Alguns deles podem já ter sido abordados nos links anteriores, mas vale a revisão.</p>
<p>Eu ia pular a questão inicial, mas vou revisar para que facilite o entendimento do resto do post para quem não leu os links acima. <em>Uma entidade pode conhecer/utilizar um repositório? </em>Acho que a resposta é óbvia: Sim. Repositórios são conceitos de negócios, fazem parte do domínio, e por isso não há nada de errado em uma entidade conhecer um repositório. Não vou entrar no mérito de como o repositório deve ser implementado, não é o meu interesse no momento. Mas vamos lá&#8230; Ok, podemos ter entidades que <strong>dependem </strong>de um repositório, e o problema é: como gerenciar essa dependência?</p>
<p>A seguir, discutimos algumas abordagens para resolver esse problema e chegamos em algumas conclusões, das quais gostaria de compartilhar.</p>
<p><strong>Sugestão I: </strong><em>Receber o repositório pelo construtor</em><br />
A entidade deve possuir um construtor que receba a dependência.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>A dependência fica explícita, ou seja, não há como criar uma entidade sem entregar a dependência já resolvida.</li>
</ul>
<p><strong>Problemas:</strong></p>
<ul>
<li>Torna o código menos legível, afinal sempre que for instanciar uma entidade, deve-se injetar seu repositório.<br />
Ex: <em>Pessoa mauricio = new Pessoa ( repositorioDePessoas );</em></li>
<li>Imagine uma entidade que depende de mais de um repositório (por quê não?). Imagine passar os diversos repositórios no construtor. Menos legível ainda&#8230;<br />
Ex: <em>Pessoa mauricio = new Pessoa ( repositorioDePessoas, repositorioDeXPTO, repositorioDeXYZ );</em></li>
<li>Isso fica pior ainda quando definimos um construtor que receba algum atributo, por exemplo.</li>
<li>Ex: <em>Pessoa mauricio = new Pessoa ( &#8220;mauricio&#8221;, &#8220;aniche&#8221;, repositorioDePessoas, repositorioDeXPTO );</em></li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>É fácil injetar um mock no lugar da dependência, para facilitar o teste unitário da entidade.</li>
</ul>
<p><strong>Sugestão II:</strong> <em>Definir um setter para a dependência</em><br />
A entidade deve ter um método setDependencia() que receba a dependência.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Elimina o problema de resolver a dependência no momento da criação do objeto.</li>
</ul>
<p><strong>Problemas:</strong></p>
<ul>
<li>Você precisa setar a dependência sempre que for utilizar, e isso pode ser um problema. Você precisará fazer todo o tempo algum tipo de validação no código da entidade para saber se a dependência já foi injetada ou não.<br />
Ex: <em>public List&lt;XPTO&gt; pegaXpto(int abc) { if(repositorio!=null) repositorio.pegaX(abc); }</em></li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Também é fácil injetar um mock no lugar da dependência.</li>
</ul>
<p><strong>Sugestão III:</strong> <em>Utilizar o próprio repositório para injetar repositórios nas entidades<br />
</em>Conforme sugerido pelo Paulo Silveira e pelo Fabio Kung no post, sempre que um objeto for recuperado pelo seu repositório, o mesmo deve se &#8220;auto-injetar&#8221; antes de devolver o objeto.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>A complexidade do gerenciamento desse dependência fica escondida no código do repositório.</li>
<li>O código a ser implementado, de maneira geral, é simples.</li>
</ul>
<p><strong>Problemas:<br />
</strong></p>
<ul>
<li>Apesar de ser simples, deve ser replicado em todos os métodos do repositório. Se o método do repositório retornar uma lista, por exemplo, deve-se repetir o processo em todos os elementos dessa lista.</li>
<li>Apenas as entidades que são recuperadas pelo repositório recebem a dependência. Entidades criadas em qualquer outro ponto do projeto não recebem essa dependência de forma automática. Isso pode causar o problema levantado na sugestão II.</li>
<li>Caso a entidade mude e venha a depender de um outro repositório, você terá muito código para alterar.</li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Da mesma maneira que o repositório injeta a dependência (através de um <em>setter</em>), pode-se injetar um mock.</li>
</ul>
<p><strong>Sugestão IV:</strong> <em>Injetar o repositório por AOP<br />
</em>Uma idéia bastante interessante seria injetar a dependência por AOP. Dessa maneira não importaria como o bean é instanciado, seja ele feito pelo JPA<em>, </em>Hibernate, etc, ou pelo programador. Essa foi uma sugestão levantada pelo Alessandro Lazarotti, <a id="rg1g" title="nesse post do GUJ" href="http://www.guj.com.br/posts/list/70275.java">nesse post do GUJ</a>.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>O código fica bastante claro.</li>
</ul>
<p><strong>Problemas:</strong></p>
<ul>
<li>A implementação de um aspecto geralmente não é trivial.</li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Dependendo do modo que o aspecto for implementado, talvez não seja tão trivial injetar a dependência. Para facilitar, pode-se criar um <em>setter</em> exclusivamente para isso, mas não é muito elegante.</li>
</ul>
<p><strong>Sugestão V: </strong><em>Resolver a dependência dentro da própria entidade</em><br />
A idéia seria a própria entidade resolver a sua dependência. No caso, ela mesma invocaria o framework de DI, e recuperaria a instância da dependência. Pode-se até pensar em uma Factory para que a entidade não dependesse diretamente de uma implementação de framework de DI.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Solução bastante simples.</li>
<li>Acaba com o problema da necessidade da entidade validar se a dependência foi injetada ou não, já que ela mesma vai resolver.</li>
</ul>
<p><strong>Problemas:<br />
</strong></p>
<ul>
<li>Não é muito elegante fazer com que a própria classe resolva suas dependências.</li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Como é a própria classe que resolve a dependência, você precisará de um setter para conseguir injetar um mock. Como dito acima, não é muito legal.</li>
</ul>
<p>(*) Além do que foi citado acima, existe um outro problema, ortogonal ao das dependências, e diz respeito diretamente à implementação desse projeto em particular. Por estarmos discutindo uma aplicação web, o contexto do Spring está guardado dentro do contexto web. Para que um POJO qualquer recupere esse contexto, ele precisaria conhecer o <em>servletContext</em>. Ainda não encontrei uma maneira muito clara para resolver isso, mas minha sugestão é criar uma classe <em>singleton </em>que conteria um atributo com uma instância de contexto do Spring, e essa instância seria injetada por um <em>filter </em>ou um <em>listener</em> qualquer, que subiria logo após ao listener do Spring. A partir daí, todas as classes de domínio fariam acesso à esse <em>singleton</em> para capturar o contexto.</p>
<p>Portanto, é possível gerenciar essa dependência de diversas formas, todas elas com suas vantagens e desvantagens. E você, como faz?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
