<?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>Objectzilla &#187; Ruby</title>
	<atom:link href="http://www.objectzilla.com.br/category/sem-categoria/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.objectzilla.com.br</link>
	<description>por Leonardo Veríssimo</description>
	<lastBuildDate>Sat, 05 Jun 2010 18:58:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Rails e a bala de prata</title>
		<link>http://www.objectzilla.com.br/2009/08/21/rails-e-a-bala-de-prata/</link>
		<comments>http://www.objectzilla.com.br/2009/08/21/rails-e-a-bala-de-prata/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 01:51:54 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=251</guid>
		<description><![CDATA[Estou quase acabando de ler o livro &#8220;The Mythical Man-Month&#8221;, aquele que todo líder deveria ler antes de meter os pés pelas mão em projetos de software. O que achei mais interessante não é tanto o fato dele derrubar o &#8220;senso-comum&#8221; de que um projeto pode terminar mais cedo simplesmente adicionando mais pessoas (isso vai [...]]]></description>
			<content:encoded><![CDATA[<p>Estou quase acabando de ler o livro <a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959">&#8220;The Mythical Man-Month&#8221;</a>, aquele que todo líder deveria ler antes de meter os pés pelas mão em projetos de software. O que achei mais interessante não é tanto o fato dele derrubar o &#8220;senso-comum&#8221; de que um projeto pode terminar mais cedo simplesmente adicionando mais pessoas (isso vai pro próximo post), mas o fato dele enfatizar que <em>não existem balas de prata</em>, ou seja, não existirá nada que faça a construção de software ganhar um incremento gigantesco de produtividade. Inclua aí as IDEs, a orientação a objetos ou o desenvolvimento visual.</p>
<p>Incrivelmente, os caras da nossa área sentem-se como alquimistas, na busca pela tranformação do ferro em ouro. Rails, por exemplo, é ainda visto pelos <em>noobs</em> como um framework que iria trazer incríveis ganhos de produtividade em relação ao Java. Mas quando o cara começa a &#8220;pegar mais&#8221; nos estudos, percebe uma coisa incômoda: o framework não traz tanto ganho assim! Só-que não traz mesmo! Software é complexo de se fazer, porque você ainda terá de lidar com espectativas de usuários, com facilidade de uso e com facilidade de manutenção, independentemente de qual linguagem utilizada. (Se bobear, talvez seja esse o motivo da adoção de Rails ser fraca: não é produtivo o <em>bastante</em>.)</p>
<p>Mas ignorar Rails por não ser bala de prata é imbecil demais! É a opção, esquisita, das pessoas que só irão sair da zona de conforto quando a verdadeira bala de prata for apresentada diante de seus olhos. Porém, a solução mágica não existe, né? Meu, Rails é mais produtivo, um pouquinho só, e não é em todas as determinadas situações. Ainda assim, vale a pena aprender, pois a proporção entre legais/idiotas é alto entre os &#8220;railers&#8221;, ao contŕario dos javeiros. E sua cultura de testes é de invejar qualquer um.</p>
<p>Se ainda não conhece, vai atrás e aprenda. Não deixe o conforto pela espera da solução mágica tomar conta de você.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/08/21/rails-e-a-bala-de-prata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Você sabe o que é: Closure?</title>
		<link>http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/</link>
		<comments>http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 17:59:20 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=19</guid>
		<description><![CDATA[Existem três propostas de closures em Java, BGGA, CICE/ARM e FCM. A primera proposta é a mais forte mas também a mais criticada, e, ao que parece, não haverá espaço para closures no Java 7. Mas o que é closure?
Primeira coisa: em linguagens que suportam closures, funções são tratadas como dados, ou seja, tem a [...]]]></description>
			<content:encoded><![CDATA[<p>Existem três propostas de closures em Java, <a href="http://www.javac.info/">BGGA</a>, <a href="http://docs.google.com/View?docid=k73_1ggr36h">CICE</a>/<a href="http://docs.google.com/View?docid=dffxznxr_1nmsqkz">ARM</a> e <a href="http://docs.google.com/View?docid=ddhp95vd_0f7mcns">FCM</a>. A primera proposta é a mais forte mas também a mais criticada, e, ao que parece, <a href="http://hamletdarcy.blogspot.com/2008/12/java-7-update-from-mark-reinhold-at.html">não haverá espaço para closures no Java 7</a>. Mas o que é closure?<span id="more-19"></span></p>
<p>Primeira coisa: em linguagens que suportam closures, funções são tratadas como dados, ou seja, tem a mesma semântica que um inteiro, uma string, um objeto&#8230; Isso é diferente de linguagens onde closures não existem, como Java, em que a função é definida estaticamente, e de lá não sai. Na verdade, no nível da máquina, tanto dados quando procedimentos são representados por um endereço de uma região de memória, são as linguagens sem closures que abstraem variáveis e funções como sendo coisas distintas.</p>
<p>Em linguagens procedimentais, como C, existe o conceito chamado <strong>ponteiro de função</strong> que, basicamente, é a obtenção de uma referência de uma função pra ser executada em um tempo posterior. O uso de ponteiro de função é bastante baixo nível, e é utilizado bastante, por exemplo, no Linux, já que os módulos, os callbacks e os próprios processos são executados dinamicamente, de acordo com a vontade de seus usuários.</p>
<p>Porém, pra muitos, a simples referência de uma função não se caracteriza uma closure. Principalmente em linguagens orientadas a objetos, closure é associada à captura de um contexto onde a closure é definida. A função closure captura sempre as referências do objeto e do método que a criou pois a qualquer momento pode chamar uma de suas variáveis ou de seus métodos, ou seja, ela &#8220;fecha&#8221; o contexto (daí o nome closure, ou &#8220;fechamento&#8221;). Parece esquisito, mas na prática, essa característica faz com que você sinta que o escopo &#8220;é o de menos&#8221; e que possa usar os métodos e variáveis disponíveis, sem se preocupar depois se o contexto vai desaparecer ou não. É como se, depois de declarada a função,  houvesse uma variável invisível que tivesse a referência de tudo o que está externo e que, portanto, poderia usá-lo enquanto a função existir. Pense, por exemplo, nas <strong>inner class</strong> do Java, você simplesmente não consegue chamar qualquer variável do objeto mais externo, a menos que esteja marcado final. Porém, em linguagens com closures, não existe uma restrição como essa.</p>
<p>Closures, por serem também um dado, costumam ser transportados de uma variável à outra, passando por vários contextos diferentes.</p>
<p>Vamos a um exemplo: na linguagem Ruby, eu poderia definir uma função e associá-la a uma variável:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">quadrado = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span>
  x <span style="color:#006600; font-weight:bold;">*</span> x
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Por ser um dado, então atribuí-la a uma outra variável é possível:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">funcaoMisteriosa = quadrado</pre></div></div>

<p>E tanto &#8220;quadrado&#8221; quanto &#8220;funcaoMisteriosa&#8221; possuem a referência à mesma função. E ambos são capazes de avaliar a função, veja:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">puts</span> quadrado.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#41;</span>    <span style="color:#008000; font-style:italic;"># 16</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> funçãoMisteriosa.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#008000; font-style:italic;"># 16</span></pre></div></div>

<p>Isso por si só não é uma closure. Como dito antes, a linguagem C possui a capacidade de transportar ponteiros de funções, e é apenas isso que eu estou fazendo. Eu poderia, em Ruby, utilizar variáveis e métodos do contexto mais externo, mesmo que este não estivesse visível no momento em que a função fosse realmente executado. Como exemplo, imagine que uma função é declarada em uma classe, e que fosse possível passar pra um outro objeto:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># essa classe só tem um método que vai</span>
<span style="color:#008000; font-style:italic;"># executar o bloco recebido</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Bar
  <span style="color:#9966CC; font-weight:bold;">def</span> execute<span style="color:#006600; font-weight:bold;">&#40;</span>bloco<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> bloco.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Foo
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@atributo</span> = atributo
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> teste<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># criei uma função e associei à variável funcaoQualquer</span>
    <span style="color:#008000; font-style:italic;"># repare que a função tem uma instância de uma variável pertencente</span>
    <span style="color:#008000; font-style:italic;"># a esse objeto (atributo)</span>
&nbsp;
    blocoQualquer = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#0066ff; font-weight:bold;">@atributo</span> <span style="color:#006600; font-weight:bold;">+</span> x
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#008000; font-style:italic;"># criei um objeto...</span>
    bar = Bar.<span style="color:#9900CC;">new</span>
    <span style="color:#008000; font-style:italic;"># ...e passei a variável contendo a função</span>
    bar.<span style="color:#9900CC;">execute</span><span style="color:#006600; font-weight:bold;">&#40;</span>blocoQualquer<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># crio o objeto passando 5 como attributo</span>
foo = Foo.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># chamo teste, que vai criar um bloco e chamar execute de um outro objeto,</span>
<span style="color:#008000; font-style:italic;"># que por sua vez, vai imprimir uma soma (o resultado é 15). Repare que foi</span>
<span style="color:#008000; font-style:italic;"># utilizado, na sua execução, uma variável (@atributo) que o objeto do tipo</span>
<span style="color:#008000; font-style:italic;"># Bar não conhece, mas que está no contexto do bloco passado (houve a closure).</span>
foo.<span style="color:#9900CC;">teste</span></pre></div></div>

<p>Foi possível chamar a variável @atributo porque, ao declarar o bloco &#8220;blocoQualquer&#8221; foi feita a captura do contexto em volta; como, por exemplo as variáveis do método Foo#teste e os atributos de instância do objeto Foo.</p>
<p>Cada linguagem tem seu jeito de chamar uma closure. Por isso, nos próximos posts, vou dar exemplos em algumas delas. Aguarde.</p>
<p>UPDATE:<br />
Essa série sobre Closures continua <a href="http://www.objectzilla.com.br/2009/01/07/closure-em-cpp/">aqui</a>, e <a href="http://www.objectzilla.com.br/2009/01/14/closure-em-java/">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
