<?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 &#187; orientação à objetos</title>
	<atom:link href="http://www.aniche.com.br/tag/orientacao-a-objetos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aniche.com.br</link>
	<description>Pensamentos sobre desenvolvimento de software</description>
	<lastBuildDate>Mon, 17 Oct 2011 00:59:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>É &#8220;Test-Driven Design&#8221; e não &#8220;Design Done by Tests&#8221;</title>
		<link>http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/</link>
		<comments>http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 21:52:39 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[design ágil]]></category>
		<category><![CDATA[experiência do programador]]></category>
		<category><![CDATA[orientação à objetos]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[tdd não faz milagre]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=304</guid>
		<description><![CDATA[Muitos códigos legados possuem graves problemas de design. Classes gigantes que fazem tudo ou classes altamente acopladas são exemplos reais de código presentes no dia-a-dia de muitos desenvolvedores. E isso não é uma exceção: as leis da evolução do software mostram que o código de um software tende a degradar. O trabalho do programador é <a href='http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Muitos códigos legados possuem graves problemas de design. Classes gigantes que fazem tudo ou classes altamente acopladas são exemplos reais de código presentes no dia-a-dia de muitos desenvolvedores. E isso não é uma exceção: <a href="http://en.wikipedia.org/wiki/Software_evolution">as leis da evolução do software</a> mostram que o código de um software tende a degradar. O trabalho do programador é evitar que isso aconteça ou, no pior caso, diminuir a velocidade desse processo de apodrecimento do design.</p>
<p>A busca por um design perfeito, que esteja preparado para aceitar mudanças e evoluir de forma simples, é difícil. Por esse motivo, a prática de TDD tem sido muito comentada pois, segundo seus praticantes, ela ajuda o programador a criar um design melhor.</p>
<p>Mas, a mais famosa frase da área de engenharia de software já nos diz que <em>não existe bala de prata</em>. Nenhuma prática garante o sucesso de um projeto ou um código de qualidade. As práticas estão lá para tentar manter o programador nessa direção.</p>
<p>E é a mesma coisa com TDD: a prática não resolverá todos os problemas de design que um programador enfrentará. O programador, na verdade, utiliza os testes para guiar o design. É através dele que o programador sabe se está indo no caminho certo ou não. Isso não quer dizer que TDD faz o design sozinho para o programador. É óbvio que o programador precisa ter experiência e conhecimento necessários para que o design saia realmente com qualidade.</p>
<p>Mas um programador que tenha alto conhecimento e experiência em desenvolvimento também pode criar um design com a mesma qualidade. A diferença é que TDD (e os testes gerados) dão feedback muito mais rápido sobre a qualidade. O gráfico abaixo, feito pelo Gleen Vanderburg, mostra o <a href="http://portal.acm.org/citation.cfm?id=1103845.1094854">tempo de feedback de várias práticas ágeis</a>. Veja que TDD dá feedback em minutos, ou seja, em alguns minutos o programador tem informações sobre o seu design. Através dos testes ele pode obter informações como a coesão da classe, o acoplamento, a simplicidade, etc. Novamente, o programador usa sua experiência para receber e entender esse feedback.</p>
<p style="text-align: center;"><img class="alignnone" src="http://www.aniche.com.br/wp-content/uploads/2010/12/PráticaságeisefeedbackVanderburg.jpg" alt="" width="428" height="352" /></p>
<p style="text-align: center;"><strong>Figura 1. </strong>Práticas e tempo de feedback</p>
<p>Essa é na verdade a grande diferença para o design feito pelo arquiteto-astronauta, famoso no modelo Waterfall, para os designs ágeis. O arquiteto pode ter muita experiência, mas o design que ele faz leva tanto tempo para ser validado e receber feedback que, quando isso acontece, o custo de mudança é altíssimo.</p>
<p>Além disso, o programador ao usar TDD (e por consequência guiar seu design através dos testes) é &#8220;forçado&#8221; a utilizar bons princípios de orientação a objetos. Os tão falados <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">princípios SOLID</a> passam a fazer mais sentido no momento em que o programador precisa escrever um código que seja fácil de testar. Parafraseando Feathers, <a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html">existe uma grande sinergia entre código fácil de testar e código bom</a>. Esses bons padrões facilitam o programador a escrever um código mais fácil de testar, <a href="http://blog.ploeh.dk/2010/12/22/TheTDDApostate.aspx">apesar do Mark Seemann discordar</a>.</p>
<p>Novamente, a experiência do programador conta. O programador experiente sabe que deve gerenciar as dependências entre classes (DIP), sabe que as classes devem ser coesas (SRP), sabe que elas devem evoluir sem a necessidade de reescrevê-la (OCP), e etc. Programadores que não usam TDD também podem fazer uso desses bons princípios. A diferença é que TDD dá feedback quase instantâneo: a necessidade da utilização dessas ideias aparece após alguns minutos programando, o que não é verdade quando o programador não faz TDD.</p>
<p>Enfim, TDD não faz milagre. Mas ele fica lembrando o programador constantemente sobre a necessidade de manter o código limpo. E a necessidade disso é evidente. Com certeza outros programadores irão encontrar outras práticas que também dão feedback sobre qualidade de design ao desenvolvedor. Mas, enquanto isso não acontece, eu recomendo a utilização de TDD.</p>
<p><em>Mas lembre-se: é <strong>design guiado pelos testes (Test-Driven Design)</strong> e não design feito pelos testes!</em></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F12%2Feh-tdd-e-nao-ddt%2F&amp;title=%C3%89%20%26%238220%3BTest-Driven%20Design%26%238221%3B%20e%20n%C3%A3o%20%26%238220%3BDesign%20Done%20by%20Tests%26%238221%3B" id="wpa2a_2"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

