<?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; oop</title>
	<atom:link href="http://www.aniche.com.br/category/object-orientation-programming/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>Testando datas (e métodos estáticos)</title>
		<link>http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/</link>
		<comments>http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 19:26:41 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[API de data]]></category>
		<category><![CDATA[métodos estáticos]]></category>
		<category><![CDATA[testabilidade]]></category>
		<category><![CDATA[teste de unidade]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=274</guid>
		<description><![CDATA[Muitas pessoas me perguntam como escrever testes de unidade de classes que lidam com datas. E, geralmente o problema está em como testar classes que usam a data/hora atual. Esse problema acontece pois grande parte das APIs que lidam com datas, tanto no mundo .Net quanto no mundo Java, fazem uso de métodos estáticos. Por <a href='http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Muitas pessoas me perguntam como escrever testes de unidade de classes que lidam com datas. E, geralmente o problema está em como testar classes que usam a data/hora atual.</p>
<p>Esse problema acontece pois grande parte das APIs que lidam com datas, tanto no mundo .Net quanto no mundo Java, fazem uso de métodos estáticos. Por exemplo:</p>
<pre lang="brush:csharp">
DateTime.Now // C#
Calendar.getInstance() // Java
</pre>
<p>Generalizando o problema, a dificuldade nao é testar datas, mas sim qualquer classe que faz uso de métodos estáticos. Por exemplo, como escrever um teste para o método abaixo?</p>
<pre lang="brush:csharp">
public int DiasEntreHjEAData(DateTime data) {
  return (DateTime.Now - data).TotalDays;
}
</pre>
<p>A propriedade <strong>Now</strong> sempre irá devolver a data corrente, dificultando assim a escrita do teste; como escrever um teste onde o cenário muda o tempo todo?</p>
<p>Não conseguir simular o comportamento do método <strong>Now</strong>, e esse eh um dos problemas de usar métodos estáticos: dificulta o teste das classes que os utilizam (além de não permitir o uso decente de polimorfismo, mas isso é uma outra discussão&#8230;)</p>
<p>Para resolver esse problema, precisamos deixar de usar métodos estáticos. Mas e como fazer com as APIs que já existem, e não podemos mudá-las, como é o caso da API de <em>DateTime</em>? </p>
<p>Isso não nos impede de criarmos uma abstração em cima disso! Veja o código abaixo:</p>
<pre lang="brush:csharp">
public interface Relogio {
  DateTime Hoje();
}

public class RelogioDoSistema : Relogio {
  public DateTime Hoje() {
    return DateTime.Now;
  }
}
</pre>
<p>Veja que criamos a interface <em>Relogio</em>, que abstrai o problema de calcular a hora atual. Nosso método acima agora, em vez de invocar o método estático, faz uso da nova abstração:</p>
<pre lang="brush:csharp">
public class Algoritmo {

  // recebido pelo construtor
  private Relogio relogio;

  public int DiasEntreHjEAData(DateTime data) {
    return (relogio.Hoje() - data).TotalDays;
  }
}
</pre>
<p>Pronto. Veja agora que testar essa classe é facil. Basta passarmos um mock e simular o comportamento esperado do <em>Relogio</em>.</p>
<p>Resumindo, métodos estáticos dificultam a escrita de testes de unidade. Para resolver isso podemos: evitar a escrita de métodos estáticos, ou criar abstrações que escondem esses métodos. Nao é feio criar abstrações como a <em>Relogio</em>; feio é não testar! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </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%2F2011%2F09%2Ftestando-datas-e-metodos-estaticos%2F&amp;title=Testando%20datas%20%28e%20m%C3%A9todos%20est%C3%A1ticos%29" 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/2011/09/testando-datas-e-metodos-estaticos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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_4"><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>
		<item>
		<title>Você quer testar métodos privados? Certeza?</title>
		<link>http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/</link>
		<comments>http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 13:30:00 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[coesão]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[métodos privados]]></category>
		<category><![CDATA[srp]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=205</guid>
		<description><![CDATA[Essa é uma discussão frequente, que inclusive apareceu recentemente no .NET Architects: devo ou não devo testar métodos privados? Minha opinião é que não, você nunca precisa testar métodos privados! Se você está escrevendo testes para uma classe, e sente a necessidade de testar um determinado método privado de maneira isolada, isso é bom: você está <a href='http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Essa é uma discussão frequente, que inclusive <a href="http://groups.google.com.br/group/dotnetarchitects/browse_thread/thread/f3753557a6d7827d/e1a4cbbf60a8a9ee?#e1a4cbbf60a8a9ee">apareceu recentemente</a> no .NET Architects: devo ou não devo testar métodos privados? Minha opinião é que <strong>não, você nunca precisa testar métodos privados</strong>!</p>
<p>Se você está escrevendo testes para uma classe, e sente a necessidade de testar um determinado método privado de maneira isolada, isso é bom: você está recebendo <em>feedback</em> do seu teste em relação ao seu design! Afinal, não é isso que todos dizem sobre TDD?</p>
<p>E o que o teste está dizendo? Ele está te dizendo que sua classe <strong>não está coesa</strong>. Quando uma classe não é coesa, ou seja, ela tem mais do que uma responsabilidade (ela faz coisas demais!), geralmente existem um conjunto de métodos nela que são responsáveis por uma das responsabilidades, e um outro conjunto de métodos responsáveis pela outra responsabilidade.</p>
<p><em>Uma situação real:</em> O programador criou uma classe para lidar com uma funcionalidade específica, e para isso criou um método público. A outra necessidade surgiu com o passar do tempo (às vezes nem tanto tempo assim; de repente ela apareceu 3 ou 4 testes depois!), e por ser algo que a funcionalidade inicial precisa, acabou virando um método privado dentro dessa classe. Esse método privado começa a crescer tanto que você quer testá-lo.</p>
<p>O que fazer? <strong>Extraia esse comportamento para uma nova classe</strong>. Essa nova classe será responsável somente por isso. Em seguida, faça a primeira classe depender dessa nova classe. Você conseguirá dar um nome bem significativo para essa nova classe, pois ela muito provavelmente representa um conceito de domínio, que até então estava escondido.</p>
<p>Extrair comportamentos para novas classes é algo muito comum ao se fazer TDD. Conforme o programador vai evoluindo a funcionalidade, novas responsabilidades aparecem e é muito tentador colocar todas elas no mesmo lugar. Que sorte a nossa termos o teste pra nos avisar! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Referências:</strong></p>
<p>Martin, Robert. <em>Principles of OOD</em>. <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod</a></p>
<p>Feathers, Michael. <em>The Deep Synergy between Testability and Good Design</em>. <a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html">http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html</a></p>
<p>Caroli, Paulo. <em>Testing Private Methods, TDD and Test-Driven Refactoring.</em> <a href="http://agiletips.blogspot.com/2008/11/testing-private-methods-tdd-and-test.html">http://agiletips.blogspot.com/2008/11/testing-private-methods-tdd-and-test.html</a>, 2008.</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%2F11%2Fvoce-quer-testar-metodos-privados-certeza%2F&amp;title=Voc%C3%AA%20quer%20testar%20m%C3%A9todos%20privados%3F%20Certeza%3F" id="wpa2a_6"><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/11/voce-quer-testar-metodos-privados-certeza/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

