<?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>Saga do programador &#187; ruby</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Wed, 18 Aug 2010 13:34:02 +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>Especificações, código e como mantê-los unidos?</title>
		<link>http://www.sagadoprogramador.com.br/2010/08/especificacoes-codigo-e-como-mante-los-unidos/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/08/especificacoes-codigo-e-como-mante-los-unidos/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 04:30:07 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[documentacao executavel]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=556</guid>
		<description><![CDATA[Já faz algum tempo que testes de unidade, ou unitários, tem sido assunto frequente, e as vezes acalorado, em listas de discussões. Apesar de fazer tempo que este assunto é discutido o argumento mais famoso para não adoção da técnica continua sendo o curto prazo dos projetos. Alega-se que se os desenvolvedores começarem a escrever [...]]]></description>
			<content:encoded><![CDATA[<p>Já faz algum tempo que testes de unidade, ou unitários, tem sido assunto frequente, e as vezes acalorado, em listas de discussões. Apesar de fazer tempo que este assunto é discutido o argumento mais famoso para não adoção da técnica continua sendo o curto prazo dos projetos. Alega-se que se os desenvolvedores começarem a escrever testes, os prazos para realizações das tarefas serão aumentados, o que consequentemente aumentaria o prazo final do projeto.</p>
<h2>Aquela velha historia</h2>
<p>A maioria dos projetos, tem uma documentação inicial, onde são colocadas as necessidades do cliente. Num projeto tradicional, ou não, esta documentação será entregue aos desenvolvedores para fazer o milgre de transformar texto impresso no papel, em software. Até agora não contei novidade alguma, mas a coisa vai ficar mais interessante a partir de agora.</p>
<p>Os desenvolvedores começam então, a escrever o software baseado nas informações contidas na documentação entregue a eles. Agora imagine que boa parte do software já está implementada e o gerente de proejetos está super feliz em ver o gráfico do project bonitinho, mostrando que o projeto está até adiantado. Quando... acontece o que sempre acontece em projetos de software. Uma grande mudança, uma alteração tão radical que afetará varios pontos do sistema. Vocês já viram este filme, e sabem que numa situação dessas é comum ter que fazer tudo pra ontem e sem prejuizo ao cronograma. O que se traduz em horas extras e trabalho nos finais de semana. O ambiente de trabalho legal para os desenvolvedores costuma acabar neste ponto. Como as alterações são todas urgentes, é muito comum que a equipe concentre forças na alteração do código fonte, enquanto a alteração da documentação fica pra depois. Um depois que geralmente nunca acontece.</p>
<h2>TDD e Documentos... onde você quer chegar?</h2>
<p>Pronto agora cheguei onde queria =). Comecei falando de TDD e no paragrafo anterior falei de documentação desatualizada. Que relação essas coisas podem ter?</p>
<p>Bem, a documentação incial do projeto, em papel, descreve o que o software deve fazer (comportamento), os métodos das classes escritas pelos desenvolvedores são responsáveis por realizar este comportamento. Em um cenário, como posso dizer, "mais comum" depois do desenvolvedor implementar o software, uma pessoa seria encarregada de testar o comportamento do software, para isso ela precisaria recorrer a documentação do projeto. Mas depois da mudança a documentação vai estar desatualizada o que abre margem para problemas maiores.</p>
<p>Uma maneira de resolver este problema seria automatizando os testes, e neste ponto entram os testes de unidade. Imagine que nossos desenvolvedores escreveram testes de unidade automatizados para checar o compotamento de cada um dos métodos implemetados por eles. Agora não precisarimos de mais uma pessoa para testar, e o mais importante, agora temos uma <strong>documentação executável</strong>. Isso mesmo pense nos testes de unidade como sendo uma documentação executável, uma documentação que <strong>quebra</strong> se não for atualizada.</p>
<h2>Documentação Executável</h2>
<p>Como todos sabem a documentação mais atualizada de um software é o código fonte. O problema é que ele não é "amigavel e legivel" para todos.  Pode ser pouco agradavel ter de ficar olhando varios arquivos, classes e métodos para entender o que eles fazem realmente. Na tentativa de melhorar, esse cenário pessoas passaram a utilizar uma técnica para escrita de testes que tenta expressar mais a intenção daquele comportamento. Esta técnica é conhecida como Behaviour Driven Development (BDD), foi um termo cunhado por Dan North mais informações <a href="http://blog.dannorth.net/introducing-bdd/">aqui</a>. Mas continua sendo muito código, e fica ainda complicado identificar o que é uma pré-condição, o que realmente está sendo testado é o que é a pós-condição. No JUnit por exemplo, a responsabilidade de descrever o comportamento testado fica no nome do método, que pode ficar quilometrico (nada contra), como por exemplo: <em>deveSerCapazDeCriarUmaListaDePedidosAPartirDoXML</em>.</p>
<p>Na tentativa de tornar os comportamentos mais evidentes, sugriam framework's como RSpec utilizado por desenvolvedores ruby.<br />
Veja abaixo um exemplo de código do RSpec</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">describe <span style="color:#996600;">&quot;Uma Conta&quot;</span>
it <span style="color:#996600;">&quot;nao deve permitir saques superiores ao valor de seu saldo&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   conta = Conta.<span style="color:#9900CC;">new</span>
   conta.<span style="color:#9900CC;">deposita</span> <span style="color:#006666;">100</span>
   <span style="color:#CC0066; font-weight:bold;">lambda</span><span style="color:#006600; font-weight:bold;">&#123;</span> conta.<span style="color:#9900CC;">saca</span> <span style="color:#006666;">200</span><span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">should</span> raise_error <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Apesar de ter menos "ruido", muito também devido a linguagem ruby,  este código ainda tem muito apelo programático. Fica dificil usar um negocio desses com seu cliente, ou especialista de negocios. Então o bacana mesmo seria escrever especificações/documentação, usando o bom e velho português, e ter algum vodoo que tornasse essa documentação executável.<br />
<span id="more-556"></span></p>
<h2>E esse Vodoo existe?</h2>
<p>Sim esse vodoo existe e se chama <a href="http://cukes.info/">Cucumber</a>.<br />
O Cucumber é um framework que permite a escrita de funcionalidades, no estilo user story, uma especie de caso de uso. Vejamos um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#language: pt</span>
Funcionalidade: Saque de conta
   Para retirar dinheiro <span style="color:#9966CC; font-weight:bold;">do</span> banco
   Como um correntista <span style="color:#9966CC; font-weight:bold;">do</span> banco
   Devo realizar um saque
&nbsp;
Cenario: Saque com sucesso
   Dado que a <span style="color:#996600;">&quot;minha conta&quot;</span> possui <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;100&quot;</span> reais
   Quando eu sacar <span style="color:#996600;">&quot;70&quot;</span> reais da <span style="color:#996600;">&quot;minha conta&quot;</span>
   Entao <span style="color:#996600;">&quot;minha conta&quot;</span> devera ter <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;30&quot;</span> reais
&nbsp;
Cenario: Saldo Insuficiente para Saque
   Dado que a <span style="color:#996600;">&quot;minha conta&quot;</span> possui <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;100&quot;</span> reais
   Quando eu sacar <span style="color:#996600;">&quot;200&quot;</span> reais da <span style="color:#996600;">&quot;minha conta&quot;</span>
   Entao um erro de <span style="color:#996600;">&quot;Saldo Insuficiente&quot;</span> deve ser exibido</pre></div></div>

<p>Pra começar as historias descrevem funcionalidades (features), e é comum se apresentarem neste formato:<br />
   <strong>Para</strong> alguma coisa<br />
   <strong>Como</strong> um papel,<br />
   <strong>Devo</strong> fazer alguma coisa.<br />
Logo depois definimos os cenários, nosso exemplo tem dois cenários um de sucesso e outro de falha, você pode escrever quantos cenários quiser.</p>
<h2>Aham Cláudia senta lá...</h2>
<p>Então agora eu escrevo a especificação que eu quiser usando português e pronto vai funcionar? Quase isso, o cucumber permite o uso do português para descrevermos a funcionalidade e seus cenários, mas lembre-se que no fundo no fundo tudo isso é um grande teste. A grande diferença é que o apelo programático é retirado, mas a intenção do teste ainda está lá. O JUnit nos fornece os chamados TestCase para que possamos agrupar nossos testes. O cucumber nos fornece o recurso de features (funcionalides) no qual descrevemos uma funcionalidade. Cada funcionalidade do sistema costuma ser descrita por em um arquivo separado que possui a extensão .feature, o exemplo da funcionalide saque de conta ficaria num arquivo chamado: saque_conta.feature. Além disso o cucumber impõe que estes arquivos "vivam" dentro de uma pasta que se chame "features". As features podem conter vários cenários. Dá pra fazer um paralelo entre os cenários e os métodos de teste de um TestCase do JUnit. Os cenários descrevem de maneira mais intuitiva os 3 componentes do teste: pré-condição, teste e pós-condição, como podemos ver abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Cenario: Saque com sucesso
   Dado que a <span style="color:#996600;">&quot;minha conta&quot;</span> possui <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;100&quot;</span> reais <span style="color:#008000; font-style:italic;">#pré-condição</span>
   Quando eu sacar <span style="color:#996600;">&quot;70&quot;</span> reais da <span style="color:#996600;">&quot;minha conta&quot;</span>             <span style="color:#008000; font-style:italic;">#teste</span>
   Entao <span style="color:#996600;">&quot;minha conta&quot;</span> devera ter <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;30&quot;</span> reais  <span style="color:#008000; font-style:italic;">#pós-condição</span></pre></div></div>

<p>A primeira linha define a pré-condição a segunda deixa claro o que queremos testar e a útlima linha checa a pós-condição, tudo sem apelo programático.</p>
<h2>E cadê o código que faz isso funcionar?</h2>
<p>Bem a gente precisa escrver esse código, não tem jeito. Porém o bacana é que ele fica totalmente separado do texto da funcionalidade e dos cenários. O cucumber espera que você forneça para cada passo dos seus cenários, um bloco de código fonte, para que ele consiga executar os testes. Estes blocos de código são definidos dentro de um arquivo, que geralmente é chamado de "step.rb", e precisa ficar dentro da pasta "features/step_definitions".</p>
<p>Quando o cucumber interpreta o arquivo da feature e identifica  passos "indefinidos", ele gera uma especie de template do passo, para que este possa ser implementado no arquivo de definicao de passos, o step.rb por exemplo. Um exemplo deste template seria:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> possui <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>arg1, arg2, arg3<span style="color:#006600; font-weight:bold;">|</span>
  pending <span style="color:#008000; font-style:italic;"># express the regexp above with the code you wish you had</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Repare que tudo que foi informado entre "" foi considerado como parametro pelo cucumber, repare também que o template já abre um bloco de código onde ele nós fornece os argumentos. Entre este "do" e "end" é que colocamos a implementação do nosso passo. Veja agora um exemplo de implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> possui <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_da_conta, atributo, valor<span style="color:#006600; font-weight:bold;">|</span>
   conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
   atributo = change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
   conta.<span style="color:#9900CC;">instance_variable_set</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;@#{atributo}&quot;</span>, valor.<span style="color:#9900CC;">to_f</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>O bacana é que os steps são reapoveitaveis, repare que o step do exemplo acima também é utilizado no cenário de saque com saldo insuficiente. No início vamos implementar muitos steps, mas depois vamos passar mais tempo escrevendo cenários e novas features do que implementando steps efetivamente. É possivel configurar o cucumber para fazer o output de seus testes em html. O interessante deste formato é que as funcionalidades e cenários ficam com "cara" de documentação "formal".</p>
<h2>Conclusão</h2>
<p>É foi isso... A ideia aqui era focar no teste como forma de documentação. Apesar desta não ser uma ideia nova, vimos que o ruido programático dos testes pode atrapalhar. Terminamos vendo que o Cucumber resolve o problema do ruído na documentação executavel seprando a definicao das funcionalidades e cenários do código que faz tudo funcionar.</p>
<p>Abraços e até a próxima,</p>
<p>Sérgio Junior</p>
<p>Abaixo está a implementação completa da funcionalidade descrita neste post:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'lib/conta/conta'</span>
&nbsp;
Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> possui <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_da_conta, atributo, valor<span style="color:#006600; font-weight:bold;">|</span>
   conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
   atributo = change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
   conta.<span style="color:#9900CC;">instance_variable_set</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;@#{atributo}&quot;</span>, valor.<span style="color:#9900CC;">to_f</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> esta bloqueada$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_conta<span style="color:#006600; font-weight:bold;">|</span>
   conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
   conta.<span style="color:#9900CC;">bloqueada</span> = <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Quando <span style="color:#006600; font-weight:bold;">/</span>^eu transferir <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais da <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> para <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>valor, origem, destino<span style="color:#006600; font-weight:bold;">|</span>
  conta_origem = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>origem<span style="color:#006600; font-weight:bold;">&#41;</span>
  conta_destino = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>destino<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    conta_origem.<span style="color:#9900CC;">transfere</span> <span style="color:#ff3333; font-weight:bold;">:para</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; conta_destino, <span style="color:#ff3333; font-weight:bold;">:valor</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; valor.<span style="color:#9900CC;">to_f</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
    <span style="color:#0066ff; font-weight:bold;">@erro</span> = e
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Quando <span style="color:#006600; font-weight:bold;">/</span>^eu sacar <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais da <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>valor, nome_conta<span style="color:#006600; font-weight:bold;">|</span>
  conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    conta.<span style="color:#9900CC;">saca</span> valor.<span style="color:#9900CC;">to_f</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
    <span style="color:#0066ff; font-weight:bold;">@erro</span> = e
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Quando <span style="color:#006600; font-weight:bold;">/</span>^eu depositar <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais na <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>valor, nome_conta<span style="color:#006600; font-weight:bold;">|</span>
  conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    conta.<span style="color:#9900CC;">deposita</span> valor.<span style="color:#9900CC;">to_f</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
    <span style="color:#0066ff; font-weight:bold;">@erro</span> = e
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Entao <span style="color:#006600; font-weight:bold;">/</span>^<span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> devera ter <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_da_conta, atributo, valor<span style="color:#006600; font-weight:bold;">|</span>
  conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
  atributo = change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
  conta.<span style="color:#9900CC;">instance_variable_get</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;@#{atributo}&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> == valor.<span style="color:#9900CC;">to_f</span>
<span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
Entao <span style="color:#006600; font-weight:bold;">/</span>^um erro de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> deve ser exibido$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>mensagem<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#0066ff; font-weight:bold;">@erro</span>.<span style="color:#9900CC;">message</span>.<span style="color:#9900CC;">should</span> == mensagem
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
private
  <span style="color:#9966CC; font-weight:bold;">def</span> obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
    conta_simbolo = name_to_symbol<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@contas</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@contas</span><span style="color:#006600; font-weight:bold;">&#91;</span>conta_simbolo<span style="color:#006600; font-weight:bold;">&#93;</span>
      conta = <span style="color:#0066ff; font-weight:bold;">@contas</span><span style="color:#006600; font-weight:bold;">&#91;</span>conta_simbolo<span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      conta = Conta.<span style="color:#9900CC;">new</span>
      <span style="color:#0066ff; font-weight:bold;">@contas</span><span style="color:#006600; font-weight:bold;">&#91;</span>conta_simbolo<span style="color:#006600; font-weight:bold;">&#93;</span> = conta
    <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;">def</span> change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
    name.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>\s<span style="color:#006600; font-weight:bold;">/</span>,<span style="color:#996600;">'_'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> name_to_symbol<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
    change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_sym</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/08/especificacoes-codigo-e-como-mante-los-unidos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>DRY e Blocos de Código com Ruby</title>
		<link>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 02:54:22 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[block]]></category>
		<category><![CDATA[blocos]]></category>
		<category><![CDATA[blocos de codigo ruby]]></category>
		<category><![CDATA[ruby block]]></category>
		<category><![CDATA[ruby blocks]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=451</guid>
		<description><![CDATA[O Iuri já mostrou num post anterior, como criar métodos (funções) em ruby. Sendo assim somos praticamente craques em construir funções ruby. Neste post vamos explorar recursos avançados e interessantes das funçoes ruby, para isso, utilizaremos um array com alguns nomes.
Problema Inicial:
Devemos criar um  método que seja capaz de percorrer um array, exibindo seus elementos. (Ok, tudo [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://twitter.com/iurims">Iuri</a> já mostrou num <a href="http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/">post anterior</a>, como criar métodos (funções) em ruby. Sendo assim somos praticamente craques em construir funções ruby. Neste post vamos explorar recursos avançados e interessantes das funçoes ruby, para isso, utilizaremos um array com alguns nomes.</p>
<h2>Problema Inicial:</h2>
<p>Devemos criar um  método que seja capaz de percorrer um array, exibindo seus elementos. <em>(Ok, tudo bem nós sabemos que todo array possui um método each. Mas vamos fingir que esse kra não existe)</em></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> elemento
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Ótimo! Atingimos nosso objetivo. O codigo acima exibira os nomes contidos no array.</p>
<h2>Os requisitos mudaram:</h2>
<p>Agora nós queremos  percorrer o array exibindo cada um de seus elementos ao contrario, por exemplo, "sergio" será exibido como "oigres". Podemos criar um novo método para isso, então vamos ao trabalho:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;</span>span id=<span style="color:#996600;">&quot;more-451&quot;</span><span style="color:#006600; font-weight:bold;">&gt;&lt;/</span>span<span style="color:#006600; font-weight:bold;">&gt;</span>def mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> lista <span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Perfeito! Mais uma vez concluímos nossa tarefa.</p>
<h2>DRY, mais um princípio de Desenvolvimento de Software:</h2>
<p>Os problemas anteriores envolviam operações com elementos de um array (uma lista), e assim acabamos criando dois métodos para resolver os problemas propostos. Existe um princípio de desenvolvimento de software que é focado em reduzir a repetição/duplicação de código, ele é conhecido como: <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">Don't Repeat Yourself - (DRY)</a>. Este principio diz que:</p>
<blockquote>
<h4>"Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."</h4>
</blockquote>
<p style="text-align: justify;">O que poderiamos traduzir como: <em>"Cada parte do conhecimento deve ter uma representação única e não ambigua dentro de um sistema". </em>Desta forma utilizando o DRY para analisar as funções que escrevemos até agora, podemos notar que <em>a parte do conhecimento </em>de percorrer um array não possui <em>uma representação única</em> em nosso sistema. O ideal seria que o codigo de percorrer um array nao fosse mais repetido, e é exatamente nisso que vamos trabalhar agora.</p>
<h2>Aplicando o DRY</h2>
<p>A maneira mais simples de resolvemos o problema de duplicação do codigo de percorrer o array, é sem duvida realizar um refactor chamado <a href="http://sourcemaking.com/refactoring/extract-method">extract method</a>, e assim isolar a lógica de percorrer arrays em um método. Entao vamos lá:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
   percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span><span style="color:#006600; font-weight:bold;">&#41;</span>
   <span style="color:#CC0066; font-weight:bold;">puts</span> elemento
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">array</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span>
mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Pronto! Com este método que acabamos de criar eliminamos o problema de  repetição de código. Porém ao executar este programa receberemos uma mensagem de erro. O grande problema aqui é que agora os métodos <em>mostra_elementos </em>e <em>mostra_elementos_ao_contrario</em> não conseguem mais acessar cada elemento do array. Estes métodos agora usam a função percorre_array, e somente dentro desta função é que a variavel <em>elemento</em> existe. Neste ponto podemos pensar que, ou fazemos a coisa ficar DRY, ou fazemos o programa funcionar. Calma, com Ruby nos poderemos fazer isso funcionar e ainda ser DRY. Para isso só precisamos aprender a usar os famosos blocos do Ruby.</p>
<h2>Ruby block's</h2>
<p>Com certeza você já ouviu, que tudo em ruby é objeto. Na verdade mesmo, quase tudo em Ruby é objeto, por exemplo blocos de código não são objetos. Mas o importante é  que  em Ruby podemos armazenar trechos de código em um objeto especial que se chama Proc. Veja:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">bloco = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
bloco.<span style="color:#9900CC;">call</span></pre></div></div>

<p>Acabamos de criar um objeto, que contem código, e fizemos isso utilizando Proc.new e fornecendo o código através das chaves  "{ }". De posse de uma Proc, podemos executar o código que ela contem a qualquer momento. Basta pra isso usar o método call da Proc. No exemplo acima ao chamar <em>bloco.call </em>veremos o texto <em>s</em><em>ou um bloco de codigo<strong>.</strong><span style="font-style: normal;"> O interessante disso é que agora podemos passar </span> código </em> como parametro, veja um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span> block <span style="color:#006600; font-weight:bold;">&#41;</span>
  block.<span style="color:#9900CC;">call</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
bloco = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span>bloco<span style="color:#006600; font-weight:bold;">&#41;</span>
faco_o_que_mandar <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Mais um bloco&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Mas podemos fazer como os rubistas fazem na maioria das vezes. Eles chamam a função e passam o bloco como parametro, para isso precisamos fazer uma pequena alteração em nossa função, basta colocar um <strong>&#038;</strong> a frente do nome do nosso parametro. Outra coisa é que geralmente os rubistas utilizam a plavara <strong>yield</strong> ao invés de coisas como <strong>bloco.call</strong>, vamos mudar isso também:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">yield</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
faco_o_que_mandar <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo tipo rubista&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
faco_o_que_mandar <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;blocos do end sao usados quando vc quer&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;fazer coisas que precisem de mais de uma&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;linha =)&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>O grande barato é que agora escrevemos uma função que recebe e executa um código "visitante". Este é um recurso muito poderoso, e é graças a ele que vamos conseguir resolver o problema de percorrer um array para fazer coisas diferentes com seus elementos, sem precisar repetir código.</p>
<h2>Tirando vantagem dos blocos</h2>
<p>Bem, nós já temos uma função que sabe andar em um array. Agora só precisamos fazer esta função receber um bloco de código "visitante" e assim teremos tudo resolvido. Vamos então ao trabalho:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento <span style="color:#006600; font-weight:bold;">&#125;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p><em>Neste momento você pode estar se perguntando o porquê do bloco de código estar fora dos parênteses. Por mais estranho que possa parecer é desse jeito que funciona mesmo. Os blocos são informados depois dos parametros "convencionais".</em></p>
<p>Agora seria ótimo se isso funcionasse, não é? Pena que não vai funcionar. Ao executar esse código veremos o seguinte erro: <span style="color: #ff0000;">undefined local variable or method `elemento' for main:Object (NameError).</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Repare no erro, ele diz que a variavel <em>elemento </em>não está definida. Isso aconteceu porque esta variavel é local do método <em>percorre_array</em>, ou seja só existe, e só é visivel naquele método. Nós precisamos manipular esta variavel, para que isto seja possível o método que <strong>possui</strong> a variavel precisa permitir que os blocos visitantes utilizem esta variavel. Fazer isso é simples, basta que no <strong>yield</strong> nos passemos a variavel em questão como parâmetro. </span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Quando colocamos o  <strong>yield</strong> na função é como se dissesemos: "Rode o codigo visitante agora". E quando colocamos a frente do <strong>yield</strong> parâmetros é como se dissessemos: "Ei código vistante, se você quiser pode usar estes caras aqui que eu tenho". Vejamos como fica isso no nosso codigo:</span></span></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#008000; font-style:italic;">#agora estamos expondo a variavel elemento</span>
    <span style="color:#008000; font-style:italic;"># para o codigo visitante</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> elemento
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;"># uma pequena alteracao é necessaria aqui</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>elemento<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento <span style="color:#006600; font-weight:bold;">&#125;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>elemento<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Agora sim o código funciona. A linha<em></em> <em>yield elemento</em>, tem o efeito de enviar para o bloco visitante a variavel <em>elemento </em>como parametro. Assim a cada iteracao do loop for um novo valor é enviado ao código visitante através da variavel <em>elemento.</em> Com isso nosso trabalho está terminado, implementamos as funcionalidades solicitadas, sem repetir código, e de quebra aprendemos sobre DRY e blocos de código em Ruby.</p>
<p>Bloco de código é um assunto bem interessante, e aqui nós abordamos só uma pequena parte. Tem ainda um lance de lambdas, enfim como disse antes o assunto é muito interessante, e se você quiser saber mais pode olhar um post do Anderson Leite sobre isso, <a href="http://andersonleiteblog.wordpress.com/2010/02/18/metaprogramacao-procs-lambdas-e/">o link é este</a>.</p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Não é por que é dinâmico que a tipagem é fraca.</title>
		<link>http://www.sagadoprogramador.com.br/2009/11/nao-e-por-que-e-dinamico-que-a-tipagem-e-fraca/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/11/nao-e-por-que-e-dinamico-que-a-tipagem-e-fraca/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:10:34 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tipagem fraca]]></category>
		<category><![CDATA[type casting implícito]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=368</guid>
		<description><![CDATA[Há algum tempo atrás recebi o seguinte comentário em um dos primeiros posts quer escrevi aqui no blog:
Bom artigo amigo, porém penso que esteja havendo alguma confusão sobre o que é “tipagem forte” e o que é “type casting implícito”, em minha opinião a linguagem é fracamente tipada, haja visto que se pode atribuir uma [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo atrás recebi o seguinte comentário em um dos <a title="Aprenda Rails, estude Ruby!" href="http://www.sagadoprogramador.com.br/2009/04/aprenda-rails-estude-ruby/" target="_blank">primeiros posts</a> quer escrevi aqui no blog:</p>
<p><em>Bom artigo amigo, porém penso que esteja havendo alguma confusão sobre o que é “tipagem forte” e o que é “type casting implícito”, em minha opinião a linguagem é fracamente tipada, haja visto que se pode atribuir uma referência de qualquer TIPO de objeto a uma variável, porém a linguagem não realiza o TypeCasting de tipos de forma implícita e arbritária como caso de algumas “Linguagens Chatas” (tomei a liberdade de utilizar seu termo…).</em></p>
<p>Como o post era antigo acabei demorando para ver o comentário e consequentemente enviar uma respota, porém o comentário aborda um assunto tão interessante, que resolvi escrever um post para esclarecer o assunto, por tanto gostaria antes de mais nada  agradecer o seu comémtario, e aqui vai a minha resposta <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <span id="more-368"></span></p>
<p>O Fato de não precisar definir um tipo para uma variavél, não é necessáriamene uma caracterísica de uma tipagem fraca, pois quando estamos atribuindo algo a uma variável, estamos apenas passando uma refêrencia, por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">nome = <span style="color:#996600;">&quot;Iuri&quot;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> nome
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;Iuri&quot;</span></pre></div></div>

<p>O que eu fiz no exemplo acima, foi atribuir a instancia de um objeto do tipo string a variavel nome, não preciso dizer que a variavel nome é do tipo string, isso é uma característica de uma linguagem dinâmica. porém as vezes as pessoa confundem isso com tipagem fraca por causa do exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"> nome = <span style="color:#996600;">&quot;Iuri&quot;</span>
 <span style="color:#CC0066; font-weight:bold;">puts</span> nome
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;Iuri&quot;</span>
 nome = <span style="color:#006666;">1</span>
 <span style="color:#CC0066; font-weight:bold;">puts</span> nome
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#006666;">1</span></pre></div></div>

<p>Nesse exemplo o que eu fiz foi atribuir a referência de um objeto string "Iuri" para a variavel nome, imprimir seu valor na tela, em seguida atribui a referência de um objeto FixNum 1 para o varivel nome e imprimir o seu valor. O fato de eu conseguir passar um valor string para uma variavel e em seguida um valor FixNum, não quer dizer que a minha linguagem tem tipagem fraca, ruby tem tipagem implicita o que é bem diferente de tipagem fraca, o minha variavel apenas trocou de referência no processo acima e por ela ser dinâmica automaticamente trocou de tipo.<br />
Agora vamos ver outro exemplo para provar de vez que Ruby possui tipagem forte:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">nome = <span style="color:#996600;">&quot;Iuri&quot;</span>
soma = nome <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#CC00FF; font-weight:bold;">TypeError</span>: can<span style="color:#996600;">'t convert Fixnum into String</span></pre></div></div>

<p>Viu?? deu erro!<br />
Isso por que Ruby tem tipagem forte, eu não posso somar um objeto do tipo string com um objeto do tipo FixNum. Isso é tipagem forte <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Se excutarmos o mesmo algoritimo em javascript ,que esse sim possui tipagem fraca, o resultado seria bem diferente:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  nome <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Iuri&quot;</span>
  soma <span style="color: #339933;">=</span> nome <span style="color: #339933;">+</span> <span style="color: #CC0000;">1</span>
  document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>soma<span style="color: #009900;">&#41;</span></pre></div></div>

<p>O resultado desse exemplo será Iuri1<br />
<br />
Referencias:</p>
<p>http://en.wikipedia.org/wiki/Type_system#Duck_typing</p>
<p>http://en.wikipedia.org/wiki/Type_system#Dynamic_typing</p>
<p>http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/11/nao-e-por-que-e-dinamico-que-a-tipagem-e-fraca/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Aprenda Ruby parte V &#8211; Métodos</title>
		<link>http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 17:50:46 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[Tutorial Ruby]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=277</guid>
		<description><![CDATA[Nesse artigo vamos conhecer um pouco de métodos em Ruby. Você, programador experiente deve estar pensando "Não deve ter nada de muito diferente.." vamos ver o que você acha até o final desse post.
Estrutura
O Método em Ruby é declarado da seguinte forma:

def nomeDoMetodo
   #código
end

Só isso?
Não tenho que dizer o que ele retorna?
Ou dizer [...]]]></description>
			<content:encoded><![CDATA[<p>Nesse artigo vamos conhecer um pouco de métodos em Ruby. Você, programador experiente deve estar pensando <em>"Não deve ter nada de muito diferente.."</em> vamos ver o que você acha até o final desse post.</p>
<p><strong>Estrutura</strong></p>
<p>O Método em Ruby é declarado da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> nomeDoMetodo
   <span style="color:#008000; font-style:italic;">#código</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Só isso?<br />
Não tenho que dizer o que ele retorna?<br />
Ou dizer que ele não retorna nada <em>"void"</em> ?<br />
É isso mesmo, no Ruby você não precisa definir o que o seu método retorna, também não temos obrigação de utilizar <em>"return"</em> o nosso método sempre vai retornar o ultimo valor atribuído.<br />
É tão simples que deve ter ficado difícil de você visualizar:). Vamos ver um exemplo:</p>
<p><span id="more-277"></span></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># criando um método chamado teste</span>
<span style="color:#9966CC; font-weight:bold;">def</span> teste
  valor = <span style="color:#006666;">1</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;">#chamando esse método</span>
teste
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">1</span></pre></div></div>

<h2><strong>Parâmetros</strong></h2>
<p>O modo de passar parâmetros para um método em Ruby, é quase parecido com o das <a href="http://www.sagadoprogramador.com.br/?p=199">linguagens chatas</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"> <span style="color:#9966CC; font-weight:bold;">def</span> nomeDoMetodo<span style="color:#006600; font-weight:bold;">&#40;</span>parametro1,parametro2<span style="color:#006600; font-weight:bold;">&#41;</span>
    valor = parametro1 <span style="color:#006600; font-weight:bold;">+</span> parametro2
 <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ok! a similaridade com as  <a href="http://www.sagadoprogramador.com.br/?p=199">linguagens chatas</a> para por aqui.<br />
Uma das coias legais de se trabalhar com uma linguagem dinamica é essa, note que não precisamos definir tipos para o parâmetro, isso nos da uma grande flexibilidade!<br />
Você não acha?<br />
<strong>Não!?</strong> <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  e se eu disser para você que a flexibilidade não se limita a isso, e se eu disser que podemos também, passar um numero indeterminado de parâmetros para o nosso método?<br />
<em>você não acredita? vamos ver um exemplo então: </em></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#008000; font-style:italic;"># note como declaro o parâmetro no método</span>
  <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;">*</span>parametros<span style="color:#006600; font-weight:bold;">&#41;</span>
    parametros.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>parametro<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">puts</span> parametro <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#008000; font-style:italic;">#chamando o método</span>
  teste<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006666;">1</span>
  <span style="color:#006666;">2</span>
  <span style="color:#006666;">3</span>
  =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Para finalizar esse post, vou dar um exemplo que os programadores Delphi vão adorar.</p>
<p><em>Caramba senti muita falta disso, quando comecei a programar em Java <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  </em></p>
<p>Nos métodos em Ruby é possivel definir um valor default para o parâmetro. Heeeee!!!</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> teste<span style="color:#006600; font-weight:bold;">&#40;</span>parametro=<span style="color:#996600;">&quot;Não foi passado nenhum valor&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    parametro
  <span style="color:#9966CC; font-weight:bold;">end</span>
  teste<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;novo valor&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; novo valor
  teste
  =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; Não foi passado nehum valor</pre></div></div>

<p><em>pode falar... agora eu consegui te impressionar!</em> <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por enquanto vamos ficar por aqui, mas ainda temos muito para ver sobre métodos em Ruby.<br />
Aguardem o próximo post.</p>
<p>Abraço!</p>
<p>Iuri Menescal</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Aprenda Ruby &#8211; parte IV &#8211; mais um pouco sobre Array</title>
		<link>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iv-mais-um-pouco-sobre-array/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iv-mais-um-pouco-sobre-array/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 22:11:19 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[Tutorial Ruby]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=262</guid>
		<description><![CDATA[Nessa sequência de artigos sobre Ruby, venho tentando escrever artigos que não sejam muito extensos, justamente para que você aprenda Ruby ao modo Ruby, ou seja, prático, rápido e simples.
Mas depois de publicar o último post, tive um retorno tão bom que fiquei empolgado em escrever outro logo  . 
Alem disso, fiquei com uma [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa sequência de artigos sobre Ruby, venho tentando escrever artigos que não sejam muito extensos, justamente para que você aprenda Ruby ao modo Ruby, ou seja, prático, rápido e simples.</p>
<p>Mas depois de publicar o último post, tive um retorno tão bom que fiquei empolgado em escrever outro logo <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . <br />
Alem disso, fiquei com uma sensação de que estava faltando alguma coisa, como disse antes o foco não é mostrar os métodos de cada classe do Ruby, mas o Array em Ruby é tão maneiro que eu tinha que mostrar mais algumas coisas legais.</p>
<p><span id="more-262"></span></p>
<p>No post anterior eu disse que uma das coisas que me desanimou no Array, quando comecei a programar, era a dificuldade de recuperar os dados, então aqui vai mais alguns exemplos de como o Ruby resolve esse problema:</p>
<p><b>Ordenação</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#o método sort ordena os valores em ordem alfabética</span>
meuArray = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>Alagoas Rio\ de\ Janeiro Brasília<span style="color:#006600; font-weight:bold;">&#41;</span> 
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Alagoas&quot;</span>,<span style="color:#996600;">&quot;Rio de Janeiro&quot;</span>,<span style="color:#996600;">&quot;Brasilia&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;">#presto atenção na &quot;\&quot; para escrever algo com espaço dentro do mesmo item do array?</span>
<span style="color:#008000; font-style:italic;">#agora vamos ordenar por nome</span>
meuArray.<span style="color:#9900CC;">sort</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Alagoas&quot;</span>,<span style="color:#996600;">&quot;Brasilia&quot;</span>,<span style="color:#996600;">&quot;Rio de Janeiro&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>Grande coisa o exemplo acima, qual é a linguagem que não faz isso, né?<br />
Então, vamos jogar um pouco do pó mágico do Ruby e deixar o próximo exemplo mais atraente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Alagoas&quot;</span>,<span style="color:#996600;">&quot;Brasilia&quot;</span>,<span style="color:#996600;">&quot;Rio de Janeiro&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Alagoas&quot;</span>,<span style="color:#996600;">&quot;Brasilia&quot;</span>,<span style="color:#996600;">&quot;Rio de Janeiro&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;">#olha o que podemos fazer acrescentando um bloco no final</span>
<span style="color:#008000; font-style:italic;">#vamos ordenar ao contrario agora </span>
<span style="color:#008000; font-style:italic;">#mas lembre-se que você pode passar N condições </span>
<span style="color:#008000; font-style:italic;">#pois estamos trabalhando com blocos!</span>
&nbsp;
meuArray.<span style="color:#9900CC;">sort</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>x,y<span style="color:#006600; font-weight:bold;">|</span> y <span style="color:#006600; font-weight:bold;">&lt;=&gt;</span> x<span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Rio de Janeiro&quot;</span>, <span style="color:#996600;">&quot;Brasília&quot;</span>, <span style="color:#996600;">&quot;Alagoas&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p><b>Pesquisa</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">estados = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;RJ&quot;</span>,<span style="color:#996600;">&quot;MG&quot;</span>,<span style="color:#996600;">&quot;SP&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;RJ&quot;</span>,<span style="color:#996600;">&quot;MG&quot;</span>,<span style="color:#996600;">&quot;SP&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;">#Quero confirmar se nesse Array </span>
<span style="color:#008000; font-style:italic;">#realmente existe o estado &quot;Rio de Janeiro&quot;</span>
estados.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;RJ&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#Agora queremos saber se algum item do meu array possui a letra &quot;S&quot;</span>
estados.<span style="color:#9900CC;">any</span>? <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>item<span style="color:#006600; font-weight:bold;">|</span> item.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;S&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#008000; font-style:italic;">#e se eu quiser saber se todos os itens do meu array possui a letra &quot;S&quot;?</span>
<span style="color:#008000; font-style:italic;">#simples!</span>
estados.<span style="color:#9900CC;">all</span>? <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>item<span style="color:#006600; font-weight:bold;">|</span> item.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;S&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#quero separar do meu array os estados com letra &quot;S&quot;</span>
estadosComS, estadosSemS = estados.<span style="color:#9900CC;">partition</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>item<span style="color:#006600; font-weight:bold;">|</span> item.<span style="color:#9966CC; font-weight:bold;">include</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;S&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
estadosComS
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;SP&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
estadosSemS
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;RJ&quot;</span>,<span style="color:#996600;">&quot;MG&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>Olha só que linguagem linda! Notem a expressividade desse código:<b> "include?" </b><br />
Eu quero saber se o meu array de estados contem o estado "RJ". Se eu quero saber algo sobre o meu array, eu tenho que perguntar para ele e uma pergunta deve terminar com interrogação, então: estados.include?("RJ").</p>
<p>Pode falar... da vontade de congelar esse projeto, que você ta desenvolvendo ai na sua empresa e reescreve tudo em Ruby, não é? rs...</p>
<p>Mais uma vez utilizei bastante o conceito de blocos, que é um dos grandes baratos do Ruby.</p>
<p>Logo irão surgir outros conceitos que vão me obrigar a ter a mesma postura, no próximo post vamos ver um pouco sobre lambdas, que é um outro recurso bem bacana.<br />
É importante fixar bem esses conceitos para programadores que vem de linguagens como Java, Delphi, C#, pois é mais difícil se acostumar com algo tão fora do trivial do seu dia a dia, é importante isso ficar na "veia", para que você consiga lembrar de utilizar esses tipos de recursos quando precisar. Tenho certeza que isso vai facilitar muito a sua vida quando estiver programando em Ruby.</p>
<p>Acho que agora deu para fechar com chave de ouro o nosso estudo sobre arrays.</p>
<p>Até a próxima!</p>
<p>Iuri</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iv-mais-um-pouco-sobre-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aprenda Ruby &#8211; parte III</title>
		<link>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 01:22:09 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[Array]]></category>
		<category><![CDATA[blocos]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Tutorial Ruby]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=244</guid>
		<description><![CDATA[String
Acho que agora as coisas começam a ficar mais divertidas  
Não é minha intenção, ficar explicando cada classe básica do Ruby, acho que mais importante focarmos no conceito da linguagem, acredito que a melhor forma de aprender a programar é praticando, por tanto vou usar alguns exemplos utilizando funcionalidades da String e do Array, [...]]]></description>
			<content:encoded><![CDATA[<h3>String</h3>
<p>Acho que agora as coisas começam a ficar mais divertidas <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Não é minha intenção, ficar explicando cada classe básica do Ruby, acho que mais importante focarmos no conceito da linguagem, acredito que a melhor forma de aprender a programar é praticando, por tanto vou usar alguns exemplos utilizando funcionalidades da String e do Array, para explicar os conceitos e ao mesmo tempo mostrar como é produtivo programar em Ruby.</p>
<p>Para entender os recursos de cada classe, basta olhar a <a href="http://www.ruby-doc.org/">documentação do Ruby</a> que é bem abrangente.</p>
<p>Vamos ver alguns exemplos, de como podemos concatenar valores em uma string:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel = variavel<span style="color:#006600; font-weight:bold;">+</span><span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#pode ser assim também</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#Também podemos fazer assim</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel.<span style="color:#9900CC;">concat</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; quatro cinco seis&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#ou melho ainda, esse é muito maneiro, o código fica claro!</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">&amp;</span>lt; <span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
<span style="color:#008000; font-style:italic;">#alem de claro, esse tipo de atribuição é mais rápido.</span></pre></div></div>

<p>Viu por que Ruby é agil?<br />
- Até minha mãe entende que com esse simbolo "&lt;&lt;" estou inserindo uma valor na String <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
É claro que em java temos outros modos de concatenar valores em uma String, mas provavelmente alguns deles nos obriga a instanciar alguma classe utilitária como o <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder</a>, por exemplo.</p>
<p><span id="more-244"></span></p>
<p>Gostou? você ainda não viu nada, olha só que F0D@! :p</p>
<p><strong><em>Delete</em></strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#aqui eu quero remover todas as vogais de uma String</span>
<span style="color:#996600;">&quot;a b c d e f g h i &quot;</span>.<span style="color:#9900CC;">delete</span> <span style="color:#996600;">&quot;aeiou&quot;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;b c d f g h&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#podemos utilizar exceções.</span>
<span style="color:#008000; font-style:italic;">#vamos remover todas as vogais, exceto a vogal &quot;i&quot;</span>
<span style="color:#996600;">&quot;a b c d e f g h i&quot;</span>.<span style="color:#9900CC;">delete</span> <span style="color:#996600;">&quot;aeiou&quot;</span>, <span style="color:#996600;">&quot;^i&quot;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;b c d f g h i&quot;</span></pre></div></div>

<p>Quer ver mais?</p>
<pre class="ruby">#Conversão de case
"saga do programador".upcase
=&gt; "SAGA DO PROGRAMADOR"
"SAGA DO PROGRAMADOR".downcase
=&gt;"saga do programador"

#olha só que maneiro:
#veja como esse código é expressivo!
"saga do programador".include? "programador"
=&gt; true
#é esse tipo de coisa q faz a diferença
#quero saber quantos caracteres diferentes existem entre as Strings
"Iuri" &lt;=&gt; "Iure"
=&gt; 1
#agora eu quero tirar caracteres duplicados de uma String
"google".tr_s("o","o")
=&gt; "gogle"
"google".tr_s("o","")
=&gt; ggle</pre>
<p><strong>Arrays:</strong></p>
<p>Na boa! Quando comecei a programar, aprendi sobre Arrays com o velho Pascal, achei muito chato. Pelas dificuldades apresentandas para recuperar os dados.</p>
<p>Com a evolução das linguagens as coisas foram melhorando, mas definitivamente trabalhar com Arrays em linguagens dinâmicas, supera as expectativas!</p>
<p><strong>Vamos aos exemplos:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#Criando uma array em Ruby:</span>
meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span>“um”, “dois”,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span>“um”,”dois”,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;">#Sim é isso mesmo! Eu posso ter tipos diferentes dentro do mesmo Array</span></pre></div></div>

<p>Olha com as coisas ficam ainda mais legais, quando nos aproveitamos das facilidades que a linguagem Ruby nos proporciona com o conceito de blocos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#125;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Alguma vez você imaginou preencher um Array de maneira tão simples, como no exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#CC0066; font-weight:bold;">Array</span>.<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:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> n<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#125;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>No post <a href="../?p=199">anterior</a> eu finalizei com a seguinte pergunta:<br />
Tenho uma String com seguinte valor “um dois tres quatro cinco”, como você faria em uma linguagem chata para transformar essa String em um array contendo cinco itens?</p>
<p>Bom, existe N maneires de fazer isso em N linguagens, meu exemplo de linguagem chata, será em delphi, vamos a roubada rs.. :</p>

<div class="wp_syntax"><div class="code"><pre class="pascal" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Para facilitar, ao invés de utilizar um Array, vou usar a classe TStringList.</span>
<span style="color: #000000; font-weight: bold;">Var</span>
  valor<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">String</span>;
  listaValor<span style="color: #339933;">:</span> TStringList;
<span style="color: #000000; font-weight: bold;">begin</span>
  valor <span style="color: #339933;">:=</span> <span style="color: #ff0000;">'um dois tres quatro cinco'</span>;
  listaValor <span style="color: #339933;">:=</span> TStringList.<span style="color: #0066ee;">Create</span>;
  valor <span style="color: #339933;">:=</span> StringReplace<span style="color: #009900;">&#40;</span>valor<span style="color: #339933;">,</span><span style="color: #ff0000;">' '</span><span style="color: #339933;">,</span><span style="color: #ff0000;">','</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span>rfReplaceAll<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>;
  listaValor.<span style="color: #0066ee;">CommaText</span> <span style="color: #339933;">:=</span> valor;
<span style="color: #000000; font-weight: bold;">end</span>;</pre></div></div>

<p>Agora em Ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#Preste atenção como é complexo rs...</span>
meuArray = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>um dois tres quatro cinco<span style="color:#006600; font-weight:bold;">&#41;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span>“um”,”dois”,”tres”,”quatro”,”cinco”<span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Outros exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#Sim! O operador &quot;&amp;lt;&amp;lt;&quot; também funciona para o Array</span>
&nbsp;
meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
meuArray <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">&amp;</span>lt; <span style="color:#006666;">2</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>No incio desse topico sobre arrays, comentei que um dos grandes problemas de trabalhar com Arrays nas linguagens chatas, e a dificuldade para manipular os dados, vamos ver agora uma pequena amostra, das facilidades que o Ruby nos oferece para trabalhar com isso:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#Retornar só os numero pares, mais uma vez vou me prevalecer do conceito de blocos.</span>
&nbsp;
arrayPares = meuArray.<span style="color:#CC0066; font-weight:bold;">select</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>valor<span style="color:#006600; font-weight:bold;">|</span> valor<span style="color:#006600; font-weight:bold;">%</span>2==<span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span>,<span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Bom, por enquanto é só!<br />
Acho que agora as coisas estão ficando mais com a cara do Ruby, pois deixamos de lado o bla bla e passamos para a pratica, algo mais produtivo, talvez você ainda não tenha notado, mas nesse post conseguimos trabalhar bastante um otimo conceito do Ruby que são os blocos. A intenção daqui para frente é utilizar exemplos de códigos, para expressar os conceitos das funcionalidades que essa maravilhosa linguagem nos proporciona <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
<p>Iuri Menescal</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aprenda Ruby &#8211; Parte II</title>
		<link>http://www.sagadoprogramador.com.br/2009/04/aprenda-ruby-parte-ii/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/04/aprenda-ruby-parte-ii/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 20:13:47 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[Iniciantes]]></category>
		<category><![CDATA[operadores]]></category>
		<category><![CDATA[Tutorial Ruby]]></category>
		<category><![CDATA[variáveis]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=232</guid>
		<description><![CDATA[Dando continuidade ao nosso papo, vou seguir a linha do primeiro post e falar mais sobre manipulação de variaveis.
Eu sei que não é um assunto muito empolgante, ou melhor não é muito "Ruby" (ou seja Dinamico, Agil, Divertido), mas para ter um bom entendimento temos que consolidar os fundamentos.
"Espero que o Luiz não leia isto [...]]]></description>
			<content:encoded><![CDATA[<p>Dando continuidade ao nosso papo, vou seguir a linha do <a href="http://www.sagadoprogramador.com.br/?p=199">primeiro post</a> e falar mais sobre manipulação de variaveis.</p>
<p>Eu sei que não é um assunto muito empolgante, ou melhor não é muito "Ruby" (ou seja Dinamico, Agil, Divertido), mas para ter um bom entendimento temos que consolidar os fundamentos.<br />
<em>"Espero que o <a href="http://www.sagadoprogramador.com.br/?p=169">Luiz</a> não leia isto rs.. "piada interna" hehe!"</em></p>
<p>Mas logo logo vamos entrar na parte legal, pense nessa fase como o primeiro periodo da faculdade, só que  com mais serventia <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como falei anteriormente tudo em Ruby é objeto. Variaveis são apenas referencias para objetos e bla bla bla bla...</p>
<p><strong><em>Vamos ver mais alguns exemplos:</em></strong></p>
<p><strong><em></em></strong><span id="more-232"></span><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/post2_exemplo1.jpg"><img class="aligncenter size-full wp-image-234" title="Exemplo 1" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/post2_exemplo1.jpg" alt="" width="360" height="279" /></a></p>
<p>Viu? o valor1 ficou com o mesmo valor2, isso por que as duas variáveis são referencias para o mesmo objeto.<br />
Note que eu alterei a variável <strong><em>"Var2[5] = 2"</em></strong> ao invés de atribuir um outro valor para ela <strong><em>"var2 = valor2"</em></strong>, nesse ultimo caso eu estaria atribuindo um novo objeto String para a variável var2.<br />
Mas isso você já sabia né? hum... Você lembra de todo aquela papo de linguagem dinâmica e tipagem forte do primeiro post? Não? putz.. seu fanfarrão!  da uma olhada lá novamente: <a href="http://www.sagadoprogramador.com.br/?p=199">post1</a></p>
<p>Existem métodos que nos ajudam a manipular variáveis, como o método freeze que congela a variável e não permite que ela seja alterada.</p>
<p>Outro método legal é o método dup:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">variavel1 = <span style="color:#996600;">&quot;Valor1&quot;</span>
variavel2 = variavel1.<span style="color:#9900CC;">dup</span></pre></div></div>

<p>Esse método deveria ser usado no exemplo anterior, para impedir que as duas variáveis ficassem com a mesma referencia.</p>
<h3><strong>Operadores</strong></h3>
<p>Grande parte dos operadores são métodos e podem ser alterados.</p>
<table>
<tbody>
<tr>
<td>+,-,*</td>
<td>adição,subtração,multiplicação</td>
</tr>
<tr>
<td>/,%</td>
<td>divisão,resto</td>
</tr>
<tr>
<td>**</td>
<td>Expoente</td>
</tr>
<tr>
<td>&amp;</td>
<td>AND binario</td>
</tr>
<tr>
<td>^ ou |</td>
<td>OR binario</td>
</tr>
<tr>
<td>&gt;,&gt;=,&lt;,&lt;=</td>
<td>maior, maior ou igual, menor, menor ou igual</td>
</tr>
<tr>
<td>&lt;=&gt;,==,===,!=, =~, !~</td>
<td>Operadores de igualdade, você vai entender melhor nos próximos post`s</td>
</tr>
<tr>
<td>=, %=, -=, +=, /=,*=,**=, ||=, &amp;&amp;=, &lt;&lt;,</td>
<td>Atribuição</td>
</tr>
<tr>
<td><strong>Lógicos</strong></td>
<td></td>
</tr>
<tr>
<td>&amp;&amp;</td>
<td>AND</td>
</tr>
<tr>
<td>||</td>
<td>OR</td>
</tr>
<tr>
<td>.. e ...</td>
<td>Ranges</td>
</tr>
<tr>
<td>? :</td>
<td>If Then else "Adoro esse <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> "</td>
</tr>
<tr>
<td>not</td>
<td>negação</td>
</tr>
<tr>
<td>or e and</td>
<td>composição</td>
</tr>
</tbody>
</table>
<p>Durante nosso aprendizado, vamos ter oportunidade de ver mais detalhes de alguns operadores.<br />
Ai você vai começar a entender por quê programar em ruby é tão legal <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Só para deixar esse post menos chato, vamos ver um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#só quero atribuir um valor quando a variável for nil</span>
variavel = <span style="color:#006666;">1</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">1</span>
variavel <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#006666;">2</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">1</span>
variavel = <span style="color:#0000FF; font-weight:bold;">nil</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">nil</span>
variavel <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#006666;">2</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">2</span>
<span style="color:#008000; font-style:italic;">#agora o oposto</span>
variavel = <span style="color:#006666;">1</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">1</span>
variavel <span style="color:#006600; font-weight:bold;">&amp;</span>amp;<span style="color:#006600; font-weight:bold;">&amp;</span>amp;= <span style="color:#006666;">2</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">2</span>
variavel = <span style="color:#0000FF; font-weight:bold;">nil</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">nil</span>
variavel <span style="color:#006600; font-weight:bold;">&amp;</span>amp;<span style="color:#006600; font-weight:bold;">&amp;</span>amp;= <span style="color:#006666;">1</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">nil</span></pre></div></div>

<p>Por enquanto é só, tenho certeza que já no próximo post, as coisas vão ficar mais empolgantes, ainda essa semana vou publicar a terceira parte aonde vamos ver alguns detalhes da classe String.<br />
Não deixe de continuar acompanhando, agora já passamos pela pior parte, o que vem pela frente é só diversão <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  tenho certeza que do decorrer dos exemplos que estão por vir você vai dizer algumas vezes "Caramba! que f0d@!!" :p</p>
<p>Fica aqui uma charada para o próximo post:</p>
<p>Tenho uma String com seguinte valor "um dois tres quatro cinco", como você faria em uma <a href="http://www.sagadoprogramador.com.br/?p=199">linguagem chata</a> para transformar essa String em um array contendo cinco itens?</p>
<p>Abraço!</p>
<p>Iuri Menescal<br />
<em>Diga não as drogas, não use <a href="http://www.microsoft.com/windows/products/winfamily/ie/default.mspx">IE</a>!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/04/aprenda-ruby-parte-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aprenda Rails. Estude Ruby!</title>
		<link>http://www.sagadoprogramador.com.br/2009/04/aprenda-rails-estude-ruby/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/04/aprenda-rails-estude-ruby/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 02:46:57 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Iniciantes]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=199</guid>
		<description><![CDATA[Desde que fui apresentado ao Rails virei um entusiasta desse framework, e em pouco tempo virei um evangelizador do Rails, não como o Carlos Brando ou o Akita que disseminam essa tecnologia pelo Brasil a fora, mas entre o grupo que conheço, programadores Delphi, Java, .Net e até PHP.

Muitos se animaram e assim como eu estão estudando esse framework, mas uma coisa que venho notando é que as pessoas que querem aprender Rails, começam a estudar Rails sem nunca ter visto Ruby.]]></description>
			<content:encoded><![CDATA[<p>Desde que fui apresentado ao Rails virei um entusiasta desse framework, e em pouco tempo virei um evangelizador do Rails, não como o <a href="http://www.nomedojogo.com/">Carlos Brando</a> ou o <a href="http://www.akitaonrails.com/">Akita</a> que disseminam essa tecnologia pelo Brasil a fora, mas entre o grupo que conheço, programadores Delphi, Java, .Net e até PHP.</p>
<p>Muitos se animaram e assim como eu estão estudando esse framework, mas uma coisa que venho notando é que as pessoas que querem aprender Rails, começam a estudar Rails sem nunca ter visto Ruby.</p>
<p>Isso é um erro comum e que demora para ser percebido, por conta da facilidade e da agilidade do Rails em gerar resultados logo no primeiro dia de estudos, o que acaba causando uma falsa impressão de evolução e te transformando em um <a href="http://pt.wikipedia.org/wiki/Code_monkey">"Code monkey"</a>.</p>
<p>Acabamos escrevendo código sem saber o significado, e convenhamos para que vem de linguagens  como (Delphi, C#, etc..) é um mundo completamente diferente.<br />
(<em>No decorrer dessa sequencia de post`s vou ser obrigado a citar novamente esse exemplo, por isso vamos utilizar o termo "Linguagens chatas" <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </em>)</p>
<p>Pode parecer meio radical, mas antes do fim dessa série você vai notar, que alem de tudo Ruby é divertido!</p>
<p><span id="more-199"></span></p>
<p>É muito normal uma pessoa que só desenvolve em <strong><em>Linguagens chatas</em></strong> ter dificuldade para entender o código abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">    sexo = <span style="color:#996600;">&quot;M&quot;</span>
   nome = <span style="color:#996600;">&quot;Iuri&quot;</span>
   <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Ola &quot;</span> <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">&amp;</span>lt; <span style="color:#996600;">&quot;sr#S#&quot;</span>.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#008000; font-style:italic;">#S#/,sexo == &quot;F&quot;?&quot;a.&quot;:&quot;.&quot;) &amp;lt;&amp;lt; nome</span></pre></div></div>

<p><em>Pode apostar, o resultado desse códito seria: "Ola sr. Iuri"</em></p>
<p>Por isso resolvi publicar uma serie de artigos falando mais sobre Ruby.<br />
Então já para dar inicio, vou terminar esse post com uma breve explicação.</p>
<p>O que é Ruby?</p>
<p>Ruby é uma linguagem dinâmica e de tipagem forte para programação OO.<br />
Na verdade Ruby é muito mais do que isso, mas isso você vai descobrir no decorrer dos nossos estudos.</p>
<p>O Ruby foi inventado por <a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto">Yukihiro Matsumoto</a>.<br />
É uma linguagem totalmente livre, (Usar, Copiar, Modificar...)</p>
<p>O Ruby é uma linguagem 100% orientada a objetos, tudo em Ruby é objeto, qualquer variável em Ruby aponta para um objeto.</p>
<p>Por exemplo:</p>
<div id="attachment_204" class="wp-caption aligncenter" style="width: 308px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/exemplo_classe.jpg"><img class="size-full wp-image-204" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/exemplo_classe.jpg" alt="Exemplo de Classe" width="298" height="146" /></a><p class="wp-caption-text">Exemplo de Classe</p></div>
<p>Quer mais provas?<br />
<a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/exemplo_methods.jpg"><img class="alignnone size-full wp-image-205" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/exemplo_methods.jpg" alt="" width="500" height="250" /></a></p>
<p><strong><em>O atributo "methods" exibe todos as funções disponíveis na classe</em></strong></p>
<p>Como eu disse no inicio o Ruby possui tipagem forte, vamos ver um exemplo:<br />
<a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/tipagem_forte1.jpg"><img class="aligncenter size-full wp-image-207" title="Tipagem forte" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/tipagem_forte1.jpg" alt="" width="436" height="195" /></a></p>
<p><em>"Ué você não falou que tem tipagem forte? como eu consegui atribuir uma string em um numérico?"</em><br />
Sim tem tipagem forte, como eu disse no inicio, variaveis são referencias para objetos, nesse caso eu apenas apontei a variavel para um novo objeto.<br />
Agora vamos ver o exemplo abaixo:<br />
<a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/tipagem_forte2.jpg"><img class="aligncenter size-full wp-image-210" title="Tipagem forte" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2009/04/tipagem_forte2.jpg" alt="" width="345" height="257" /></a></p>
<p>Bom, por enquanto é só. No próximo post vamos começar a colcar a mão na massa, ai sim você vai começar a descobrir como Ruby é divertido <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Abraço!</p>
<p>Iuri Menescal<br />
<em>Diga não as drogas, não use <a href="http://www.microsoft.com/windows/products/winfamily/ie/default.mspx">IE</a>!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/04/aprenda-rails-estude-ruby/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Retrospectiva 2008 – Planos para 2009 / Iuri</title>
		<link>http://www.sagadoprogramador.com.br/2009/01/retrospectiva-2008-%e2%80%93-planos-para-2009-iuri/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/01/retrospectiva-2008-%e2%80%93-planos-para-2009-iuri/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 14:09:21 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[retrospectiva]]></category>
		<category><![CDATA[trabalho]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=146</guid>
		<description><![CDATA[
Cedendo ao convite do Luiz, vou escrever a minha retrospectiva também. Trabalhamos na mesma equipe e isso pode tornar o que vou escrever uma cópia do post dele, já que isso pode acontecer, vou colar alguns trechos aqui na cara de pau mesmo hehehehe!

Post do Luiz
O ano de 2008 foi um ano muito bom profissionalmente, [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment--></p>
<p class="MsoNormal">Cedendo ao convite do Luiz, vou escrever a minha retrospectiva também. Trabalhamos na mesma equipe e isso pode tornar o que vou escrever uma cópia do post dele, já que isso pode acontecer, vou colar alguns trechos aqui na cara de pau mesmo hehehehe!</p>
<p class="MsoNormal"><!--StartFragment--></p>
<p class="MsoNormal"><strong><em><span style="text-decoration: underline;">Post do Luiz</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="text-decoration: underline;"><em>O ano de 2008 foi um ano muito bom profissionalmente, neste ano consegui mudar de tecnologia no meu trabalho, consegui aplicar algumas das principais técnicas que estudo há alguns anos.</em></span></em></strong></p>
<p><span id="more-146"></span></p>
<div>
<p class="MsoNormal"><strong><span><span style="color: #ff0000;">(Eu também a única diferença ai é esse “há alguns anos” ele já deve estudar o dobro de tempo do que eu :p)</span></span></strong></p>
<p class="MsoNormal"><!--more--><!--StartFragment--></p>
<p class="MsoNormal"><span>Acho que o meu primeiro feito importante em 2008 aqui no trabalho, foi a implantação do Scrum dentro da minha gerencia. Perturbei muita gente nesse período dentro e fora da empresa, vou até aproveitar para agradecer ao <a href="http://blog.improveit.com.br/" target="_blank">Vinicius Telles</a> e o <a href="http://gc.blog.br/" target="_blank">Guilherme Chapiewski</a> pela paciência, perturbei muito esses caras nesse período hehehe! (Pretendo publicar um post mais detalhado sobre essa empreitada).</span></p>
<p class="MsoNormal"><span><span> </span>Uma coisa bem legal que a mudança de tecnologia me proporcionou foi reescrever uma parte do sistema que sou responsável em Java utilizando uma arquitetura bem bacana. Com uma grande ajuda de Luiz e de um outro colega de trabalho o Marcus Eliziário. Substituímos um serviço feito em Delphi5 para Java onde eu tive a oportunidade de aprender bastante coisa como JMS, Spring, Interceptor, Testes automatizados e outras coisas.</span></p>
<p><!--EndFragment--> </p>
<p class="MsoNormal"><!--StartFragment--></p>
<p class="MsoNormal"><strong><em><span style="text-decoration: underline;">Post do Luiz</span></em></strong><em></em></p>
<p class="MsoNormal"><em><span><span style="text-decoration: underline;">Em 2008 eu decidi que quero desenvolver aplicações para Web. Para isso comecei a estudar Ruby On Rails. Tenho feito alguns protótipos de aplicações, e tenho evoluído bem. Atualmente estou no meu primeiro projeto pessoal utilizando Rails.</span></span></em></p>
<div>
<p class="MsoNormal"><strong><span><span style="color: #ff0000;">(Eu também a única diferença ai é que estou no meu segundo projeto em Rails. O que me empolgou bastante nem foi tanto o Rails, mas o Ruby, uma linguagem muito agradável que da prazer de programar)</span></span></strong></p>
<p class="MsoNormal"><!--more--></p>
<p class="MsoNormal"><span>Alem de ficar super empolgado com a linguagem, o que me empolgou bastante também foi a comunidade, sempre disposta a ajudar e com a filosofia open source na veia. Esse ano participei da Rails Summit Latin América, foi um puta evento! Já sai de lá com a certeza de que vou no próximo, não vou entrar em detalhes sobre o evento, pois o que não falta na web é material sobre isso. O grande barato foi que o fato de estudar Rails me proporcionou a oportunidade de me aprofundar mais em outras linguagens como javascript e conhecer outros FrameWorks como o Jquery.<em> </em></span></p>
<p class="MsoNormal"><span>E para terminar os acontecimentos de 2008 não poderia deixar de mencionar a aquisição do meu MacBook, coisa que ainda ta na lista para 2009 do Luiz e do Serginho hahahaha!!!! Eu já tenho o meu!!! :p</span></p>
<p> </p></div>
<p><!--StartFragment--></p>
<p class="MsoNormal"><span>Planos para 2009:</span></p>
<p class="MsoNormal"> </p>
<ul>
<li>Continuar estudando Ruby</li>
<li>Fazer um curso de mestre cervejeiro hehehe!</li>
<li>Implantar um servidor de integração e evangelizar mais as técnicas de testes automatizados aqui na empresa</li>
<li>Estudar musica <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>Fazer um curso de culinária :p</li>
<li>Casar</li>
<li>Comprar uma <a href="http://www.yamaha-motor.com.br/cmi/pagina.aspx?716" target="_blank">Fazer 600</a>!!</li>
</ul>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>Bom, vou aproveitar e reforçar o convite para o Serginho escrever a sua retrospectiva, acho que esse é o que mais teve mudanças em 2008.</span></p>
<p><!--EndFragment--><!--EndFragment--> </div>
<p><!--EndFragment--> </p>
<p><!--EndFragment--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/01/retrospectiva-2008-%e2%80%93-planos-para-2009-iuri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
