<?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>CØdeZØne! &#187; refactoring</title>
	<atom:link href="http://leandrosilva.com.br/category/refactoring/feed/" rel="self" type="application/rss+xml" />
	<link>http://leandrosilva.com.br</link>
	<description>Coisas sobre desenvolvimento de software</description>
	<lastBuildDate>Sun, 22 Jan 2012 22:38:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Um pouco de TDD com Eunit</title>
		<link>http://leandrosilva.com.br/2010/04/12/um-pouco-de-tdd-com-eunit/</link>
		<comments>http://leandrosilva.com.br/2010/04/12/um-pouco-de-tdd-com-eunit/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 00:03:30 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=604</guid>
		<description><![CDATA[No final do ano passado estava bem empolgado com a implementação Erlang do Restfulie e, algum tempo depois de ter começado o projeto, resolvi deixar de ser cowboy e escrever alguns testes. De lá pra cá, vez ou outra, dei uma melhorada nos testes, primeiro pra ficar mais útil, depois pra deixar mais fluente. Ainda [...]]]></description>
			<content:encoded><![CDATA[<p>No final do ano passado estava bem empolgado com a implementação Erlang do <a href="http://github.com/caelum/restfulie" target="_blank">Restfulie</a> e, algum tempo depois de ter começado o projeto, resolvi deixar de ser cowboy e escrever alguns testes. De lá pra cá, vez ou outra, dei uma melhorada nos testes, primeiro pra ficar mais útil, depois pra deixar mais fluente. Ainda não está lá essas coisas, mas já está, no mínimo, interessante. Se você quiser, pode conferir no <a href="http://github.com/leandrosilva/restfulierl/tree/master/test/" target="_blank">meu GitHub</a>.</p>
<p>Bem, no final das contas, isso acabou me motivando a escrever esse post, como um tutorial básico de TDD (talvez alguns queriam chamar de BDD, não tem problema, podem chamar como assim) com <a href="http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html" target="_blank">Eunit</a>, a biblioteca de testes padrão que vem com qualquer instalação de Erlang.</p>
<p>A idéia desse tutorial é seguir numa linha um pouco diferente da documentação do Eunit e dos exemplos contidos no próprio projeto, escrevendo testes mais fluentes e interessantes de ler.</p>
<h3>Mão na massa</h3>
<h4>Passo 1: criar a estrutura do projeto</h4>
<p>O nome do nosso projeto será <em>making_tdd_with_eunit</em> (bem criativo!). Vamos criar então a seguinte estrutura de diretórios, que é frequentemente encontrada em projetos Erlang:</p>
<pre><span style="color: #000080;">- making_tdd_with_eunit
  |
  +-- ebin
  +-- src
  +-- test</span></pre>
<p>OK, apesar dos diretórios terem nomes auto explicativos, não custa nada reforçar, né?</p>
<p>- <strong>ebin</strong>, contém os binários (.beam) resultantes da compilação dos fontes;<br />
- <strong>src</strong>, contém os fontes (.erl) dos módulos;<br />
- <strong>test</strong>, contém os fontes (.erl) dos testes.</p>
<h4>Passo 2: escrever o primeiro teste que inevitavelmente falhará</h4>
<p>Qual é o fluxo de trabalho com TDD mesmo, hein? Escrever o código a ser testado, rodar e, se funcionar, escrever o tal teste que passa de primeira, não é isso? Não, não é. Isso não é TDD.</p>
<p>Pois muito bem, vamos fazer então como realmente tem que ser feito. No diretório <em>test</em>, crie o seguinte teste (<em>mobile_test.erl</em>):</p>
<pre class="brush: java; title: ; notranslate">
-module(mobile_test).

-include_lib(&quot;eunit/include/eunit.hrl&quot;).

describe_client_test_() -&gt;
  {&quot;Mobile&quot;,
    [fun should_have_a_number/0]}.

should_have_a_number() -&gt;
  ?assertMatch({number, _}, mobile:number()).
</pre>
<p>Feito isso, compile e rode o teste com os seguintes comandos:</p>
<pre class="brush: bash; title: ; notranslate">
$ erlc -o ebin/ test/mobile_test.erl
</pre>
<pre class="brush: bash; title: ; notranslate">
$ erl -pa ebin/ -noshell -run mobile_test test -run init stop
</pre>
<p>Qual foi o resultado? O teste falhou, certo? Pois é, como manda o figurino!</p>
<p><em>&#8220;Escreva um teste, rode todos os testes e veja-o falhar; escreva o código mais simples possível para fazê-lo passar, mesmo que num primeiro momento não seja o mais bonito e eficiente; rode todos os testes e veja-os passar; depois, refatore para remover duplicações</em><em>.&#8221; [1]<br />
</em></p>
<h4>Passo 3: fazer o teste passar</h4>
<p>Agora vamos fazer esse teste passar. No diretório <em>src</em>, crie o seguinte módulo:</p>
<pre class="brush: java; title: ; notranslate">
-module(mobile).

-export([number/0]).

number() -&gt;
  {number, &quot;1212-1212&quot;}.
</pre>
<p>Como fizemos anteriormente <em>&#8211; agora acrescentando o módulo mobile à compilação &#8211;</em>, compile e rode o teste com os seguintes comandos:</p>
<pre class="brush: bash; title: ; notranslate">
$ erlc -o ebin/ src/mobile.erl test/mobile_test.erl
</pre>
<pre class="brush: bash; title: ; notranslate">
$ erl -pa ebin/ -noshell -run mobile_test test -run init stop
</pre>
<p>Resultado? &#8220;Test passed.&#8221;</p>
<h4>Passo 4: escrever mais testes</h4>
<p>Só para não prolongar muito <em>&#8211; este que deveria ser um pequeno tutorial &#8211;</em> vamos para o ponto em que magicamente passamos a ter testes para as quatro funções (ultra dummies) contidas no módulo mobile, tudo bem?</p>
<pre class="brush: java; title: ; notranslate">
-module(mobile_test).

-include_lib(&quot;eunit/include/eunit.hrl&quot;).

describe_client_test_() -&gt;
  {&quot;Mobile&quot;,
    [fun should_have_a_number/0,
     fun should_have_a_area_code/0,
     fun should_have_a_company/0,
     fun should_have_a_owner/0]}.

should_have_a_fixed_number() -&gt;
  ?assertMatch({number, &quot;1212-1212&quot;}, mobile:number()).

should_have_a_fixed_area_code() -&gt;
  ?assertMatch({area_code, &quot;11&quot;}, mobile:area_code()).

should_have_a_fixed_company() -&gt;
  ?assertMatch({company, &quot;DEAD&quot;}, mobile:company()).

should_have_a_fixed_owner() -&gt;
  ?assertMatch({owner, &quot;Little Jose&quot;}, mobile:owner()).
</pre>
<pre class="brush: java; title: ; notranslate">
-module(mobile).

-export([number/0, area_code/0, company/0, owner/0]).

number() -&gt;
  {number, &quot;1212-1212&quot;}.

area_code() -&gt;
  {area_code, &quot;11&quot;}.

company() -&gt;
  {company, &quot;DEAD&quot;}.

owner() -&gt;
  {owner, &quot;Little Jose&quot;}.
</pre>
<p>OK, repetindo o passo anterior de compilação e execução dos testes, temos quatro testes passando, certo? Então é hora de um pouco de refatoração&#8230;</p>
<h4>Passo 5: refatorar os testes para ficarem mais fluentes</h4>
<p>Nesse ponto, vamos adicionar mais fluência ao nosso teste e melhorar a sua comunicação, inclusive, descrevendo um cenário &#8220;bem interessante&#8221;.</p>
<pre class="brush: java; title: ; notranslate">
-module(mobile_test).

-include_lib(&quot;eunit/include/eunit.hrl&quot;).

describe_client_test_() -&gt;
  {&quot;Mobile&quot;,
    {&quot;when is a dummy&quot;,
      [
        {&quot;should have a fixed number&quot;,
          fun should_have_a_fixed_number/0},
        {&quot;should have a fixed area code&quot;,
          fun should_have_a_fixed_area_code/0},
        {&quot;should have a fixed company&quot;,
          fun should_have_a_fixed_company/0},
        {&quot;should have a fixed owner&quot;,
          fun should_have_a_fixed_owner/0}
      ]}}.

should_have_a_fixed_number() -&gt;
  ?assertMatch({number, &quot;1212-1212&quot;}, mobile:number()).

should_have_a_fixed_area_code() -&gt;
  ?assertMatch({area_code, &quot;11&quot;}, mobile:area_code()).

should_have_a_fixed_company() -&gt;
  ?assertMatch({company, &quot;DEAD&quot;}, mobile:company()).

should_have_a_fixed_owner() -&gt;
  ?assertMatch({owner, &quot;Little Jose&quot;}, mobile:owner()).
</pre>
<p>Compilando e rodando os testes: &#8220;All 4 tests passed.&#8221;</p>
<h4>Próximo passo: escrever mais testes e refatorar o módulo mobile</h4>
<p>Até aqui, temos um módulo mobile totalmente dummy e um teste que usa apenas a macro <em>?assertMatch</em>. Ainda há muito que pode ser feito, desde adicionar algum comportamento útil ao módulo <em>mobile</em>, até melhorar os testes, fazer diferentes asserções, adicionar <em>befor_all</em> e <em>after_all</em> (<a href="http://github.com/leandrosilva/restfulierl/tree/master/test/" target="_blank">como nos testes do Restfulierl</a>, por exemplo) para estado inicial e final, e por aí vai.</p>
<p>Bem, esse passo deixo por sua conta. É um bom exercício pra você praticar mais Erlang e Eunit.</p>
<p>Espero que tenha gostado e até mais!</p>
<p><em>[1] Beck, K. Test-Driven Development: By Example. Addison-Wesley Professional, 2002.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/04/12/um-pouco-de-tdd-com-eunit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Refatorar é preciso!</title>
		<link>http://leandrosilva.com.br/2008/02/08/refatorar-e-preciso/</link>
		<comments>http://leandrosilva.com.br/2008/02/08/refatorar-e-preciso/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 03:53:56 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://codezone.wordpress.com/?p=9</guid>
		<description><![CDATA[Definitivamente, refatorar é preciso! Ninguém consegue escrever o melhor código do mundo na primeira vez que o escreve. Aliás, arrisco dizer que isto não é verdade apenas com software, mas com uma infinidade de coisas que fazemos ao longo da vida. Desde que me entendo por gente garoto, sempre tive o hábito de refatorar. Nos [...]]]></description>
			<content:encoded><![CDATA[<p align="left">Definitivamente, <b><a target="_blank" href="http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o">refatorar</a> é preciso!</b></p>
<p align="left">Ninguém consegue escrever o melhor código do mundo na primeira vez que o escreve. Aliás, arrisco dizer que isto não é verdade apenas com software, mas com uma infinidade de coisas que fazemos ao longo da vida.</p>
<p align="left">Desde <strike>que me entendo por gente</strike> garoto, sempre tive o hábito de refatorar. Nos meus trabalhos escolares, composições musicais, estudos bíblicos. Dia desses mesmo tive que escrever uma carta para ser lida publicamente [a detendos e familiares] em um presídio de São Paulo. Que responsabilidade! Escrevi e refatorei várias vezes numa mesma madrugada até a tal carta ficar muito boa.</p>
<p align="left">No meu trabalho não é diferente. Escrevo e re-escrevo códigos sempre. Não por terem sido mal escritos por mim ou por algum colega, mas porque acredito que eles sempre podem ser aprimorados.</p>
<blockquote>
<p align="left"><font color="#808080"><strong><em>Refatoração como disciplina da <a target="_blank" href="http://pt.wikipedia.org/wiki/Engenharia_de_software">Engenharia de software</a>:</em></strong><br />
</font><br />
<a target="_blank" href="http://www.martinfowler.com"><font color="#808080">Martin Fowler</font></a><font color="#808080">, em seu </font><a target="_blank" href="http://www.refactoring.com"><font color="#808080">site oficial sobre refatoração</font></a><font color="#808080">, diz que refatorar é alterar a estrutura interna de um código sem alterar o seu comportamento externo. É fazer pequenas modificações de cada vez, que somadas, resultem em modificações significativas, sem contudo, afetar o funcionamento do código.</font></p></blockquote>
<p align="left">De forma bem prática, no meu dia a dia, costumo enumerar as tarefas da refatoração em: <b>Revisar</b>, <b>remolelar</b> e <b>refinar</b>. Três &#8216;<b>R</b>&#8216;s indispensáveis na vida de todo bom programador, porque:</p>
<p align="left">1. Todo código precisa ser revisado;<br />
2. Todo código é forte candidato a ser remodelado, pelo menos uma vez;<br />
3. Todo código deve ser refinado sempre.</p>
<p align="left">Quando aplicada corretamente, a refatoração trás excelentes ganhos, tais como:</p>
<p align="left">1. Códigos mais legíveis;<br />
2. Códigos mais performáticos;<br />
3. Códigos mais extensíveis;<br />
4. E sobretudo, código mais simples!</p>
<p align="left">Este e o sentimento da refatoração. Ganhos hoje; e mais ainda, amanhã. </p>
<p align="left">Agora, sabe qual é a triste realidade? Poucos gestores de projetos entendem e encorajam esta prática. Uma pena, porque o projetos só tem a ganhar. Quantas vezes você já não entrou em um projeto e perdeu horas e horas pra entender o código macarrão que alguém que nem está mais na empresa fez? Quantas vezes mais isso ainda não vai acontecer neste mesmo projeto? Ah, se estas horas tivessem sido empregas em refatoração&#8230;</p>
<p align="left">Mas, sabe de uma outra coisa? A culpa não é só dos gestores de projetos. Desenvolvedores de software também precisam aprender a vender suas idéias, soluções, e mostrar resultados reais da aplicação de determinadas técnicas. Afinal de contas, cientistas renomados como Martin Fowler costumam ter razão naquilo que dizem.</p>
<p align="left">Bom, ainda bem que aqui na equipe de arquitetura da <a target="_blank" href="http://www.cvc.com.br">CVC Turismo</a> não é assim. Aqui refatorar é visto com muito bons olhos. Bons olhos sobre quem faz a refatoração, dado o seu pró-ativismo; e bons olhos sobre o próprio patrimônio de software da empresa que é valorizado a cada dia.</p>
<p align="left">Se seu gestor não quer nem ouvir falar em refatoração, eu tenho uma sugestão pra você: Faça algumas refatorações por conta própria, sem que estas afetem o andamento do seu projeto, é claro, e depois apresente a ele um relatório de ganhos, conforme citados anteriormente.</p>
<p align="left"><em><b>Não se esqueça:</b> Frutos falam mais que palavras.</em></p>
<p align="left">Depois poste aqui o resultado&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2008/02/08/refatorar-e-preciso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

