<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Guilherme-dev</title>
	<atom:link href="http://guilhermedev.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://guilhermedev.wordpress.com</link>
	<description>O lado negro do software</description>
	<lastBuildDate>Fri, 08 Feb 2008 02:05:13 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='guilhermedev.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Guilherme-dev</title>
		<link>http://guilhermedev.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://guilhermedev.wordpress.com/osd.xml" title="Guilherme-dev" />
	<atom:link rel='hub' href='http://guilhermedev.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Chega de feitiçaria!</title>
		<link>http://guilhermedev.wordpress.com/2008/02/01/o-que-ha-de-magico-em-ruby/</link>
		<comments>http://guilhermedev.wordpress.com/2008/02/01/o-que-ha-de-magico-em-ruby/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 18:46:56 +0000</pubDate>
		<dc:creator>antoni0</dc:creator>
				<category><![CDATA[ruby DSL projeto pratica principio teste]]></category>

		<guid isPermaLink="false">http://guilhermedev.wordpress.com/?p=3</guid>
		<description><![CDATA[Prólogo Se você, como eu, conheceu Ruby através do rails, certamente iniciou seu aprendizado com o livro agile web development with rails. Depois de brincar um pouco com Rails, você por ora começou a ficar mais interessado em Ruby. Ruby com certeza é uma ótima linguagem, mas leva um tempo relativamente maior que o usual [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=guilhermedev.wordpress.com&amp;blog=2694919&amp;post=3&amp;subd=guilhermedev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h1 class="western">Prólogo</h1>
<p class="western" style="margin-bottom:0;font-style:normal;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Se você, como eu, conheceu Ruby através do rails, certamente iniciou seu aprendizado com o livro <a href="http://www.amazon.com/Agile-Web-Development-Rails-2nd/dp/0977616630/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1202422057&amp;sr=8-1" target="_blank"><i>agile web development with rails</i></a>. Depois de brincar um pouco com Rails, você por ora começou a ficar mais interessado em <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a>. Ruby com certeza é uma ótima linguagem, mas leva um tempo relativamente maior que o usual para programar efetivamente.</font></font></p>
<p class="western" style="margin-bottom:0;font-style:normal;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Programar efetivamente em <span>Ruby</span> significa conhecer muito bem a programação de <b>objetos</b> e <b>meta-objetos</b>, ou melhor,<b> meta-programação</b>. Esse novo tipo de programação tem seus pontos fortes e pontos fracos, assim como qualquer outra coisa em software.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Tenha em mente que meta-objetos é um tipo de meta-programação. No entanto, meta-programação não é somente meta-objetos. Para deixar este texto mais limpo, vou explicar detalhadamente ao decorrer do artigo.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Enfim, muitos dizem que a meta-programação é a mágica do Ruby, eu até concordo, bem&#8230; parcialmente&#8230;<br />
</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<h1 class="western">Receitas de um desastre</h1>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Indubitavelmente, um projeto com excessiva meta-programação é um projeto confuso, complexo e irritante. Aquelas mensagens de <font color="#ff0000"><i><b>ArgumentError</b></i></font>,<i><b> <font color="#ff0000">NameError</font></b></i>, que uma vez foram tão claras, já não começam a ser mais explicativas. A razão disso? é simples, estas mensagens são geradas em pontos muito profundos do código.<br />
</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Meta-programação envolve uma série de chamadas em tempo de execução/avaliação, geralmente envolvendo uma ou diversas, tendo como inputs, o resultado de outras chamadas, avaliações de sub-códigos, classes programáveis e claro, inputs dos próprios desenvolvedores. Muitas vezes, esses inputs somados a natureza imprevisível de um código em tempo de execução, e certos comportamentos, <u>resultam numa perfeita receita para o desastre</u>.  </font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Quando a meta-programação começa a ter uma extensão mais profunda, o pessoal logo nome-a como <a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language" target="_blank"><b>DSLs</b> (<i>Domain Specific Language(s</i>))</a>. Neste caso, algo mais interessante acontece comparado a programação usual. Neste momento, a meta-programação passa a ter conhecimento e controle sobre a linguagem e o domínio ao qual está sendo aplicado.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Se sua linguagem de programação suporta mecanismos de circularidade, isto é, reflexão, macros, templates, meta-objetos ou qualquer outro tipo de coisa que possa ser avaliável ou gere funcionalidade que a linguagem compreenda, então, muito provavelmente você poderá criar DSLs. Repare que a meta-programação envolve o uso de um ou vários desses recursos citados acima.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Em teoria isso é perfeito, no entanto, o mundo em prática nos reserva grandes surpresas. Como descrito anteriormente, erros gerados em meta-programação são erros gerados nas profundezas dos códigos. São erros que não fazem sentido, são erros complicados de debugar e navegar.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Não apenas isso, a medida em que se usa descontroladamente recursos de meta-objetos, reflexão, macros, o <u>desenvolvedor passa a perder interatividade com a linguagem</u>. A linguagem passa a perder interatividade consigo mesma. Como resultado, a <u>meta-programação começa a inferir novos desafios ao desenvolvedor</u>. </font></font><font face="Verdana, sans-serif"><font size="2"> </font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Acredite se quiser, a coisa mais desafiante quando meta-programando é lidar com um sistema razoável de avaliação. Isso sempre faz-me pensar cinco vezes antes de usar qualquer recurso de meta-programação.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<h1 class="western">Lado negro da feitiçaria</h1>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Embora argumentáveis, gostaria que o leitor assumisse essas duas afirmações como verdades:</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<ol>
<li>DSL é uma nova linguagem construida no topo de uma outra linguagem;</li>
<li>DSL toma o mecanismo de avaliação da linguagem base como seu;</li>
</ol>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Desenvolvedores, em sua maioria, não dão muita importância a essas coisas. Eles colocam confiança demais na linguagem de base e esquecem o domínio. Lembrem-se, DSLs são tudo sobre domínio, por sua vez, domínio não é quase nada sobre linguagem. </font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Embora não seja elegante ou ético apontar projetos de companheiros Rubystas como casos malsucedidos, as vezes se faz necessário. É como dizem por aí, “entrou na água, é para se molhar”.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font size="2"><font face="Verdana, sans-serif">O projeto que eu ponho em discussão é <a href="http://rspec.info/" target="_blank">rSpec</a>. Para quem não conhece, rSpec, é uma biblioteca de testes, assim como o tão popular <a href="http://ruby-doc.org/stdlib/libdoc/test/unit/rdoc/" target="_blank">test/unit</a> do ruby.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Minha recomendação, como desenvolvedor, que já usou e usa meta-programação em diversos projetos. Projetos criados por mim e por outras pessoas, é fazer uso desses recursos somente quando realmente necessário.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Desde que comecei a mexer com software, tenho um <a href="http://jrjuniorsp.wordpress.com/" target="_blank">amigo</a> que sempre martelava em minha cabeça sobre manter as coisas simples. Diga-se de passagem, demorei muito para aprender isso.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Desde então, sigo uma linha muito direta e extremista de raciocínio. Se as coisas podem ser feitas simplesmente, não vale o esforço tentar sofistica-las. Simples assim.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Tenha em mente esse pedaço de código em rSpec:</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<pre style="border:10px solid #dbd5b7;background-color:#edebd5;font-family:'Courier new';font-size:14px;padding:15px;"><span style="color:#222222;">describe</span><span style="color:#222222;font-weight:bold;"> Bowling</span><span style="color:#7f0055;font-weight:bold;"> do</span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> before(</span><span style="color:#336f99;font-style:italic;">:each</span><span style="color:#222222;">)</span><span style="color:#7f0055;font-weight:bold;"> do</span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="font-weight:bold;color:#e8814e;"> @bowling</span><span style="color:#222222;"> =</span><span style="color:#222222;font-weight:bold;"> Bowling</span><span style="color:#222222;">.new</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#7f0055;font-weight:bold;"> end</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> it</span><span style="color:#336f99;"> 'should score 0 for gutter game'</span><span style="color:#222222;"></span><span style="color:#7f0055;font-weight:bold;"> do</span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> 20</span><span style="color:#222222;">.times</span><span style="color:#222222;"> {</span><span style="font-weight:bold;color:#e8814e;"> @bowling</span><span style="color:#222222;">.hit(</span><span style="color:#222222;">0</span><span style="color:#222222;">)</span><span style="color:#222222;"> }</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="font-weight:bold;color:#e8814e;"> @bowling</span><span style="color:#222222;">.score</span><span style="color:#222222;">.should</span><span style="color:#222222;"> ==</span><span style="color:#222222;"> 0</span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#7f0055;font-weight:bold;"> end</span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#7f0055;font-weight:bold;">end</span></pre>
<p><font face="Verdana, sans-serif"><font size="2"></font></font></p>
<p><font face="Verdana, sans-serif"><font size="2">Agora com a biblioteca padrão de testes</font>:</font></p>
<pre style="border:10px solid #dbd5b7;background-color:#edebd5;font-family:'Courier new';font-size:14px;padding:15px;"><span style="color:#7f0055;font-weight:bold;">class</span><span style="color:#222222;font-weight:bold;"> BowlingTestCase</span><span style="color:#222222;"> &lt;</span><span style="color:#222222;font-weight:bold;"> Test::Unit::TestCase</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#7f0055;font-weight:bold;"> def</span><span style="color:#222222;"> setup</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="font-weight:bold;color:#e8814e;"> @bowling</span><span style="color:#222222;"> =</span><span style="color:#222222;font-weight:bold;"> Bowling</span><span style="color:#222222;">.new</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#7f0055;font-weight:bold;"> end</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#7f0055;font-weight:bold;"> def</span><span style="color:#222222;"> test_score_0_for_gutter_game</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> 20</span><span style="color:#222222;">.times</span><span style="color:#222222;"> {</span><span style="font-weight:bold;color:#e8814e;"> @bowling</span><span style="color:#222222;">.hit(</span><span style="color:#222222;">0</span><span style="color:#222222;">)</span><span style="color:#222222;"> }</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> </span><span style="color:#222222;"> assert_equal</span><span style="font-weight:bold;color:#e8814e;"> @bowling</span><span style="color:#222222;">.score,</span><span style="color:#222222;"> 0</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"> </span><span style="color:#7f0055;font-weight:bold;"> end</span><span style="color:#222222;">

</span><span style="color:#222222;"></span><span style="color:#222222;"></span><span style="color:#7f0055;font-weight:bold;">end</span></pre>
<p class="western" style="margin-bottom:0;" align="left" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" align="left" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" align="left" lang="pt-BR"> <font face="Verdana, sans-serif"><font size="2">Será que justifica codificar 10.000 linhas de meta-programa para cumprir apenas uma função estética? Isto é, trocar <i>class BowlingTestCase</i> por <i>describe Bowling</i>? Será que DSLs valem mais de 3.000 commits num repositório? será?<br />
</font></font></p>
<p class="western" style="margin-bottom:0;" align="left" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" align="left" lang="pt-BR"> <font face="Verdana, sans-serif"><font size="2">É claro que rSpec não compreende apenas isso. É possível usar um monte de outras funcionalidades. De qualquer forma, <font color="#ff0000"><b><i>rSpec tornou testes, uma tarefa trivial, que é realizado simplesmente, em algo muito sofisticado</i></b>.</font></font></font></p>
<p class="western" style="margin-bottom:0;" align="left" lang="pt-BR">&nbsp;</p>
<h1 class="western">Conclusão</h1>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Se a meta-programação não for muito bem planejada e desenvolvida, problemas com avaliações, erros, comportamentos inesperados, tolenadas de código mágicos serão alguns dos desafios. Para contornar esses desafios, o desenvolvedor tem de programar sistematicamente e acima de tudo, entender profundamente cada ponto do sistema e do domínio de forma que possa criar um sistema de avaliação apropriado.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font face="Verdana, sans-serif"><font size="2">Se minhas palavras têm sido duvidosas, sugiro que o leitor dê uma olhada no <a href="http://rspec.rubyforge.org/svn/" target="_blank">repositório do rSpec no rubyforge</a>.</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<p class="western" style="margin-bottom:0;" lang="pt-BR"><font size="2"><font face="Verdana, sans-serif">Antes de mergulhar, d</font></font><font face="Verdana, sans-serif"><font size="2">evemos pensar se realmente vale a pena tornar tarefas tão triviais (como testar pedaços de código) em algo tão elaborado. Devemos pensar se isso realmente vai nos trazer algum avanço ou produtividade como resultado final.<br />
</font></font></p>
<p class="western" style="margin-bottom:0;" lang="pt-BR">&nbsp;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/guilhermedev.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/guilhermedev.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/guilhermedev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/guilhermedev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/guilhermedev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/guilhermedev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/guilhermedev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/guilhermedev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/guilhermedev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/guilhermedev.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=guilhermedev.wordpress.com&amp;blog=2694919&amp;post=3&amp;subd=guilhermedev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://guilhermedev.wordpress.com/2008/02/01/o-que-ha-de-magico-em-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62088a33be1b9f7f12ae510b7e90f4c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">antoni0</media:title>
		</media:content>
	</item>
	</channel>
</rss>
