<?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>AgileZ &#187; TDD</title>
	<atom:link href="http://www.brasiltech.net/agilez/tag/tdd/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brasiltech.net/agilez</link>
	<description>Metodologias e técnicas aplicadas a desenvolvimento e gerenciamento</description>
	<lastBuildDate>Wed, 29 Dec 2010 23:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Programando orientado a interface</title>
		<link>http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/</link>
		<comments>http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 01:44:43 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[código limpo]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/</guid>
		<description><![CDATA[Se você programa em alguma linguagem de programação orientada a objeto, com certeza conhece os termos “Private”, “protected” e “public” e muito provavelmente sabe para que eles servem. Métodos ou membros públicos são aqueles que podem ser acessados por outras classes, os protegidos apenas pelos descendentes e os privados só possuem visibilidade local, ou seja, [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0px 15px 0px 0px; display: inline; border: 0px;" title="transito_confuso" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/08/transito_confuso.jpg" border="0" alt="transito_confuso" width="183" height="240" align="left" /></p>
<p>Se você programa em alguma linguagem de programação orientada a objeto, com certeza conhece os termos “<em>Private”</em>, “<em>protected”</em> e “<em>public”</em> e muito provavelmente sabe para que eles servem. Métodos ou membros públicos são aqueles que podem ser acessados por outras classes, os protegidos apenas pelos descendentes e os privados<em> </em>só possuem visibilidade local, ou seja, dentro da própria classe. Parece simples, porém, é muito comum encontrar programadores que parecem não seguir critério algum ao definir o nível de visibilidade dos membros de suas classes, ou então aplicam alguma metodologia aleatória para este fim. Propriedades que eram protegidas<em> </em>são publicadas<em> </em>durante o desenvolvimento de outras classes clientes, conforme a necessidade. Classes “amigáveis” (class friendly) são criadas para permitir acesso a funções protegidas. Práticas como essas acabam por criar uma arquitetura extremamente confusa, com componentes de difícil entendimento, difíceis de serem testados e expandidos. Qual seria então o melhor critério para evitar esse tipo de problema?</p>
<p><span id="more-148"></span></p>
<p>Ao desenhar uma classe devemos ter uma ideia bem clara de qual a responsabilidade dela, caso contrário, coloque em dúvida a necessidade de criá-la. O raciocínio é simples: se não sabemos o que a classe deve fazer, então não precisamos dela. Após a definição clara de qual é a responsabilidade da classe, levando em consideração a coesão e nível de acoplamento desejado, devemos pensar sobre a sua interface. Para entender melhor, basta imaginar como a classe deve ser vista por suas classes clientes, ou seja, as classes ou componentes que irão utilizá-las. Apenas métodos e propriedades que permitam acesso e manipulação de dados relacionados à responsabilidade da classe devem ser públicos. Você deve fazer isso não para impedir que outros acessem dados internos de suas classes, mas, principalmente, para garantir que elas sejam mais legíveis, inteligíveis e fáceis de usar. O ideal é que qualquer programador do mundo possa, apenas lendo os métodos públicos de sua classe, dizer qual a responsabilidade dela, e quais métodos chamar, e como chamá-los para conseguir usufruir de suas funcionalidades. Se você não se preocupar em publicar apenas o que for necessário, sua classe corre o risco de ficar confusa demais e difícil de utilizar.</p>
<p>Uma analogia com o mundo real pode ajudá-lo a entender melhor esse raciocínio: imagine um carro onde, junto com os pedais de freio e embreagem, tivessem outros controles estranhos, como um pedal pra regular o nível do óleo e outro para ativar e controlar a bomba de gasolina. Esse carro faria com que o condutor ficasse bem confuso, e tentasse regular o consumo de gasolina manualmente enquanto dirige (um absurdo, não?).</p>
<p>Voltando ao mundo dos bits, por exemplo, se sua classe possuir uma coleção de itens, seria bom deixar claro se ela é dona deles e apenas ela deve poder removê-los ou incluí-los em seu container. Para isso, não disponibilize em sua interface métodos que dão acesso direto a lista, procurando sempre usar o encapsulamento onde for necessário e disponibilizando um iterador.</p>
<p><img style="display: inline; border: 0px;" title="diagrama 1" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/08/diagrama1.jpg" border="0" alt="diagrama 1" width="602" height="348" /></p>
<p>Se ela exigir passagem de parâmetros de inicialização, providencie construtores personalizados, onde a classe cliente possa passar os parâmetros necessários. Esse tipo de design facilita a leitura e entendimento de quem a for utilizar.</p>
<p><img style="display: inline; border: 0px;" title="diagrama 2" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/08/diagrama2.jpg" border="0" alt="diagrama 2" width="346" height="282" /></p>
<p>Tenha sempre esse conceito em mente: as classes clientes visualizam apenas os métodos publicados, e devem &#8211; apenas se baseando no que enxergam &#8211; entender a responsabilidade e como usar os recursos da classe servidora. Algumas ferramentas muito importantes, como o TDD (desenvolvimento orientado a testes) são extremamente eficazes e – se usadas corretamente – funcionam automaticamente como guias forçando o desenvolvedor a escrever uma interface simples e fácil de usar. Pretendo escrever um artigo sobre esse tema relacionado ao TDD em breve. Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A import&#226;ncia do desenvolvimento orientado a teste ou TDD</title>
		<link>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/</link>
		<comments>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:47:23 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/</guid>
		<description><![CDATA[Se você e sua equipe são adeptos do scrum ou outra metodologia ágil provavelmente devem conhecer ou utilizar testes unitários, mas não necessariamente o desenvolvimento orientado a testes (TDD). O teste unitário consiste basicamente em validar dados válidos e inválidos via entrada e saída, já o TDD utiliza teste unitário como parte de sua metodologia [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Grafo" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/11/Grafo.png" border="0" alt="Grafo" width="240" height="204" align="left" /></p>
<p>Se você e sua equipe são adeptos do scrum ou outra metodologia ágil provavelmente devem conhecer ou utilizar testes unitários, mas não necessariamente o desenvolvimento orientado a testes (TDD). O teste unitário consiste basicamente em validar dados válidos e inválidos via entrada e saída, já o TDD utiliza teste unitário como parte de sua metodologia cujo principal objetivo não é testar as unidades (é um dos objetivos, mas não o único).</p>
<p>Em um cenário de desenvolvimento ágil, sem uso de TDD, o programador geralmente não conta com um modelo de classes em forma de diagramas &#8211; como outras metodologias pesadas. Por isso é comum a modelagem ser feita apenas mentalmente, em algum outro formato (rascunho em papel de pão?) ou até mesmo diretamente no código. As classes, operações e atributos vão surgindo conforme a necessidade, e são constantemente alterados e implementados até a conclusão da tarefa associada. Eventualmente, alguns testes de unidade são implementados baseando-se nas classes já prontas.<span id="more-100"></span></p>
<p>Este tipo de abordagem implica em alguns problemas, entre eles:</p>
<ul>
<li>o programador não tem segurança em saber quando uma implementação acabou;</li>
<li>o programador não precisa implementar a classe de forma que ela fique desacoplada das demais;</li>
<li>o programador tende a não desenvolver para a interface e sim para a implementação;</li>
<li>métodos não coesos (fazem mais ou menos do que deveriam fazer);</li>
<li>nomes de atributos e operações não representam adequadamente a funcionalidade.</li>
</ul>
<p>O TDD pretende resolver todas as deficiências citadas acima e várias outras. Mas, o que é o TDD? TDD ou Test Driven Development pode ser considerada uma metodologia de design de software, onde escrevemos primeiro um teste e depois o código necessário para o teste passar. A idéia é que o desenho das classes seja guiado pelos testes. O TDD força o desenvolvedor a pensar primeiro em o que ele precisa, e em como fazer, via teste unitário, para testar se a implementação a ser feita fará o que deve, nada mais e nada menos. Com isso, se ganha em vários aspectos:</p>
<ul>
<li>as classes devem ser desacopladas, senão o teste não pode ser executado;</li>
<li>os métodos são bem coesos, ou seja, fazem somente o necessário para o teste passar;</li>
<li>o programador sabe exatamente quando concluiu uma implementação, pois o teste passou;</li>
<li>o programador consegue validar rapidamente uma alteração que pode ter causado um impacto em outras unidades, apenas rodando um conjunto de testes;</li>
<li>operações e atributos possuem nomes claros e representam exatamente o que fazem.</li>
</ul>
<p>O workflow do TDD pode ser descrito basicamente em cinco passos básicos:</p>
<ol>
<li>Crie a classe de teste e o primeiro teste
<ol>
<li>Nesse ponto o programador deve pensar em como será a assinatura do método testado. O fato de ter que escrever um teste para o método, faz com que, tanto o nome quanto os parâmetros de entrada e saída sejam bem claros e coesos.</li>
</ol>
</li>
<li>Compile o teste
<ol>
<li>O teste não vai compilar. Neste momento, crie a classe e a declaração do método. Recompile e rode o teste. O teste deve falhar, pois o método testado ainda não está implementado.</li>
</ol>
</li>
<li>Implemente o código testado de modo que o teste falhe
<ol>
<li>O objetivo do teste é detectar defeitos, e essa fase é importante para averiguar se o teste está cumprindo seu papel. Geralmente codificar para que o método testado retorne um valor errado é o suficiente. Rode o teste e veja o teste falhar.</li>
</ol>
</li>
<li>Agora corrija o código, de forma que o teste passe
<ol>
<li>Implemente o suficiente para o teste passar. Você deve garantir que o teste exija o suficiente. Se precisar implementar mais do que o necessário para o teste passar, provavelmente seu teste não está bom o suficiente, ou seu método não está coeso. Neste caso, refaça o teste ou corrija a implementação do código testado.</li>
</ol>
</li>
<li>Faça alguma refatoração necessária e reexecute os testes
<ol>
<li>Na fase anterior nos preocupamos apenas em fazer o teste passar. Nessa etapa, faça uma revisão no código e veja se precisa de alguma refatoração. Em seguida rode todos os testes construídos até agora para certificar-se de que a refatoração não quebrou algum outro código.</li>
</ol>
</li>
<p>Antes que me perguntem: TDD não é burocrático e demorado?.  Não. Usar TDD não implica em aumentar o tempo de desenvolvimento. Desconsiderando o tempo de adaptação de sua equipe, a tendência é que o desenvolvimento com TDD aumente consideravelmente a produtividade, e, consequentemente, a segurança e qualidade dos produtos desenvolvidos. Essa é a experiência de quase toda equipe de aderiu ao TDD, e provavelmente sua equipe só vai se sentir confortável com a idéia quando efetivamente aplicar os conceitos da metodologia.</ol>
<p>Neste artigo não abordei as ferramentas de teste unitário, pois não é o foco do TDD, porém praticamente todos os ambientes de desenvolvimento moderno possuem algum framework de testes unitários. Posso citar alguns: NUnit (C#), DUnit (Delphi) e JUnit (Java). Escolha o que melhor se adequar a sua realidade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

