<?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</title>
	<atom:link href="http://www.sagadoprogramador.com.br/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>Sobrecarga e argumentos marotos nos métodos Ruby</title>
		<link>http://www.sagadoprogramador.com.br/2010/05/sobrecarga-e-argumentos-marotos-nos-metodos-ruby/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/05/sobrecarga-e-argumentos-marotos-nos-metodos-ruby/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 00:21:51 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[arguments]]></category>
		<category><![CDATA[default arguments]]></category>
		<category><![CDATA[optional arguments]]></category>
		<category><![CDATA[overload]]></category>
		<category><![CDATA[ruby arguments]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=562</guid>
		<description><![CDATA[Continuando com o assunto de métodos em ruby, vamos falar sobre sobrecarga e argumentos. Para isso imagine um método para fazer uma saudação para alguma pessoa do tipo: Bom Dia Jõao, Boa Tarde Maria, etc...

def seja_educado&#40;saudacao, pessoa&#41;
  puts &#34;#{saudacao} #{pessoa}&#34;
end
&#160;
seja_educado&#40;&#34;Bom Dia&#34;,&#34;Iuri&#34;&#41;
=&#62; Bom Dia Iuri

Essa foi muito fácil! Afinal de contas já sabemos "tudo" sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando com o assunto de métodos em ruby, vamos falar sobre sobrecarga e argumentos. Para isso imagine um método para fazer uma saudação para alguma pessoa do tipo: Bom Dia Jõao, Boa Tarde Maria, etc...</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao, pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{saudacao} #{pessoa}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom Dia&quot;</span>,<span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Bom Dia Iuri</pre></div></div>

<p>Essa foi muito fácil! Afinal de contas já sabemos "tudo" sobre <a href="http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/">criar métodos em ruby</a>.<br />
Então vamos tornar o exemplo mais interessante. Eu quero poder usar o metodo seja_educado das seguintes formas:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Boa Tarde&quot;</span>,<span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Boa Tarde Joao
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Olá Joao</pre></div></div>

<p>Uma típica solução seria usar o velho truque do metodo sobrecarregado então vamos tentar.<br />
<span id="more-562"></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> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao, pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{saudacao} #{cidadao}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Ola #{pessoa}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Olá Joao
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>: wrong number of arguments <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span> <span style="color:#9966CC; font-weight:bold;">for</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<h2>Porque este erro meu Deus? Porque?</h2>
<p>Bem, a triste verdade é que <a href="http://rubylearning.com/satishtalim/ruby_overloading_methods.html">Ruby não da suporte sobrecarga de métodos</a>. Quando escrevemos o metodo pela <em>seja_educado</em> pela segunda vez, na verdade o que fizemos foi redefini-lo e nao criar um outro metodo de mesmo nome. Por isso, quando executamos: seja_educado("Boa dia","Luiz") obtivemos o erro relacionado ao numero argumentos.</p>
<h2>Tem algum jeito de resolver isso?</h2>
<p>Sim, a falta de sobrecarga de métodos pode ser compensada se utilizarmos alguns recursos do ruby como por exemplo: o de valor default para argumentos. Vamos fazer com que o argumento saudacao receba a string "Ola" sempre que alguem "se esquecer" de informar um valor para ele. O código fica assim:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao=<span style="color:#996600;">&quot;Ola&quot;</span>, pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{saudacao} #{pessoa}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ao colocar o sinal de = e a string "Ola" ao lado do argumento saudacao dizemos que se ninguem mandar valor para este argumento, entao ele deverá assumir o valor "Ola". Desta forma as chamadas abaixo fucionarão:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Ola Iuri
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>,<span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Bom dia Luiz</pre></div></div>

<h2>Incrementando o  Exemplo</h2>
<p>Agora eu quero evoluir ainda mais o nosso metodo <em>seja_educado</em>. Eu quero ser capaz de informar zero, um ou vários nomes de pessoas para cumprimentar, ou seja, as seguintes chamadas de método devem ser suportadas:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span>, <span style="color:#996600;">&quot;Iuri&quot;</span>, <span style="color:#996600;">&quot;Sergio&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Bom como já sabemos apenas as duas primeiras irão funcionar,  já a última chamada vai ocasionar um ArgumentError. O problema agora é que a quantidade de pessoas que devem receber a saudacao pode variar de zero até qualquer número.</p>
<h2>Como resolver isso?</h2>
<p>Para nossa sorte ruby possui um tipo de argumento conhecido como opcional (optional argument), que muito se parece com o varargs do Java. Para usar este tipo de argumento, basta pôr um asterisco (estrela)  na frente do argumento, após fazer isso seu argumento poderá receber zero ou N valores.<br />
Vamos então aplicar o recurso de optional argument e fazer um teste:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao=<span style="color:#996600;">&quot;Ola&quot;</span>, <span style="color:#006600; font-weight:bold;">*</span>pessoas<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> pessoas.<span style="color:#9900CC;">empty</span>?
    <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} &quot;</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    pessoas.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} #{p} &quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;"># Teste com varias pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span>, <span style="color:#996600;">&quot;Iuri&quot;</span>, <span style="color:#996600;">&quot;Sergio&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Bom dia Luiz Bom dia Iuri Bom dia Sergio
<span style="color:#008000; font-style:italic;"># Teste com apenas uma pessoa</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>,<span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Bom dia Joao
<span style="color:#008000; font-style:italic;"># Teste sem pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Bom dia</pre></div></div>

<p>Tivemos que modificar um pouco o método, e acabamos usando o método each que pode receber blocos de código como parâmetro, se você não "pegou" bem essa parte de uma olhada <a href="http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/">aqui</a>.<br />
Agora sim hein.... Podemos usar o método <em>seja_educado</em> com nenhuma ou uma quantidade arbitrária de pessoas, como vimos no exemplo anterior.</p>
<h2>Momento de Reflexão</h2>
<p>Uma ideia me veio a cabeça agora. Repare que no método <em>seja_educado</em>, o argumento saudacao possui um valor default (padrão). O que pode acontecer se utilizarmos este método informando apenas o nome de uma pessoa, ou informando o nome de duas, ou quem sabe com três pessoas? Vamos ver:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#teste com apenas uma pessoa</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Luiz
<span style="color:#008000; font-style:italic;">#teste com duas pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span>,<span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Luiz Iuri
<span style="color:#008000; font-style:italic;">#teste com tres pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span>,<span style="color:#996600;">&quot;Iuri&quot;</span>,<span style="color:#996600;">&quot;Sergio&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Luiz Iuri Luiz Sergio</pre></div></div>

<p>Curioso! Em nehuma das chamadas anteriores o valor default do argumento saudacao foi usado. <em>*(1)</em><br />
E se tentarmos inverter a ordem dos argumentos? Vamos ver no que vai dar: <em>*(2)</em</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">*</span>pessoas, saudacao=<span style="color:#996600;">&quot;Ola&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> pessoas.<span style="color:#9900CC;">empty</span>?
    <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} &quot;</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    pessoas.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} #{p} &quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;"># Agora nosso novo teste</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>syntax error, unexpected tIDENTIFIER, expecting tAMPER <span style="color:#9966CC; font-weight:bold;">or</span> <span style="color:#996600;">'&amp;amp;'</span>
<span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>pessoas,saudacao=<span style="color:#996600;">&quot;Ola&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Acho que não foi uma boa ideia inverter a ordem dos argumentos no metodo.</p>
<h2>Ruby explica</h2>
<p>Bem vamos com calma, a primeira coisa é que o Ruby tem basciamente 3 tipos de argumentos:</p>
<ul>
<li>Obrigatorios ou requeridos</li>
<li>Com valores padrao ou default</li>
<li>Opcionais</li>
</ul>
<h2>Como ruby associa os valores aos argumentos</h2>
<p>Quando o ruby recebe uma chamada de método ele faz o seguinte divisão dos argumentos:<br />
Primeiro, ele procura todos os argumentos requeridos/obrigatorios e associa valores a estes. Neste ponto se algum argumento obrigatório ficar sem valor, um erro do tipo ArgumentException será exibido.<br />
Depois, se ainda restarem valores, estes serão aplicados aos argumentos default que existirem no método. E por último, ruby aplica os valores "que sobraram" ao argumento opcional, isso se ainda restar algum valor.<br />
Pra entender melhor vejamos uns exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> a, b=<span style="color:#996600;">&quot;oi&quot;</span>, <span style="color:#006600; font-weight:bold;">*</span>c <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">p</span> <span style="color:#996600;">&quot;a = #{a}, b = #{b}, c = #{c}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
metodo_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:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = 2, c = 3&quot;</span>
metodo_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:#006666;">4</span>,<span style="color:#006666;">5</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = 2, c = 345&quot;</span>
metodo_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:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = 2, c = &quot;</span>
metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = oi, c = &quot;</span></pre></div></div>

<p>Além disso, ruby impõe restrições quanto utilizacao dos argumentos dentro de um método.<br />
A tabela abaixo vai nos ajudar a enteder melhor esta ordem, ela lista as possiblidades válidas de combinação e uso dos diferentes tipos de argumentos ruby:</p>
<table>
<tr>
<th>Tipo(s) de Argumento</th>
<th>Exemplo de método</th>
<th>Obs</th>
</tr>
<tr>
<td>Obrigatorio</td>
<td>def teste(a,b,c)</td>
<td></td>
</tr>
<tr>
<td>Default</td>
<td>def teste(a=1,b=2)</td>
<td></td>
</tr>
<tr>
<td>Opcional</td>
<td>def teste(*a)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Opcional</td>
<td>def teste(a,*b)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Default</td>
<td>def teste(a,b=3)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Default/Opcional</td>
<td>def teste(a,b=3,*c)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Default/Opcional/Obrigatorio</td>
<td>def teste(a,b=3,*c,d)</td>
<td>válido apenas a partir da versao 1.9.1</td>
</tr>
</table>
<h2>Então...</h2>
<p>Conseguimos compreender o que aconteceu nos pontos *(1) e *(2) deste post. No trecho de *(1), vimos que a estratégia ruby para aplicação de valores à argumentos, foi a responsável por aquela "pegadinha". Já no ponto *(2), uma violação cometida por nós, da regra de utlização dos argumentos ruby em métodos foi a causa do erro.<br />
Enfim, conhecer a linguagem é de fundamental importância para o programador, não cair em "pegadinhas" como estas.</p>
<p>Abraços, e até a próxima.<br />
Sergio Junior.</p>
<p>Referências:<br />
<a href="http://rubylearning.com/satishtalim/writing_own_ruby_methods.html">Writing own ruby Methods</a><br />
<a href="http://rubylearning.com/satishtalim/ruby_overloading_methods.html">Ruby Overloading  Methods</a><br />
<a href="http://www.manning.com/black2/">The Well-Grounded Rubyist (Book) </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/05/sobrecarga-e-argumentos-marotos-nos-metodos-ruby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Idéias sobre encapsulamento, linq e delegates em C#</title>
		<link>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/#comments</comments>
		<pubDate>Wed, 05 May 2010 15:21:35 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[boas práticas]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=510</guid>
		<description><![CDATA[Atualmente estou trabalhando em projeto .Net. É a primeira vez que utilizo a plataforma profissionalmente e não dá para negar o quanto a .Net está interessante. Estou bastante impressionado com a linguagem C#. Apesar de todos os recursos interesantes da linguagem, tenho percebido que está acontecendo uma espécie de “relaxamento” em relação as boas práticas, [...]]]></description>
			<content:encoded><![CDATA[<p>Atualmente estou trabalhando em projeto .Net. É a primeira vez que utilizo a plataforma profissionalmente e não dá para negar o quanto a .Net está interessante. Estou bastante impressionado com a linguagem C#. Apesar de todos os <a href="http://code.msdn.microsoft.com/cs2010samples">recursos interesantes</a> da linguagem, tenho percebido que está acontecendo uma espécie de “relaxamento” em relação as boas práticas, principalmente de orientação a objetos. Umas coisas que mais tenho notado é a falta de preocupação com o <a href="http://pt.wikipedia.org/wiki/Encapsulamento">encapsulamento</a>, principalmente quando se usa  <a href="http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx">delegates</a> e <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx">linq</a>.</p>
<p>Neste post vou analisar alguns pontos relacionados a encapsulamento e o uso do Linq.</p>
<p>Vamos começar a analisar um modelo de objetos simples:</p>
<p><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionario.png"><img class="alignnone size-full wp-image-513" title="EmpresaFuncionario" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionario.png" alt="" width="363" height="123" /></a></p>
<p><span id="more-510"></span></p>
<p>Como podemos perceber uma empresa tem muitos funcionários e estas classes poderiam ser escritas desta forma:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">class</span> Funcionario
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Nome <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Cargo <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">double</span> Salario <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> Ativo <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">class</span> Empresa
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> List Funcionarios <span style="color: #000000;">&#123;</span>get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span><span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> Empresa<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Aqui um exemplo de como utilizar as classes deste modelo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> Funcionario luiz <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Luiz&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">1000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Desenvolvedor&quot;</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario sergio <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Sergim&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">1000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Desenvolvedor&quot;</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario iuri <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Iuri&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">1100</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Desenvolvedor&quot;</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario luciano <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF;">false</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Luciano&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">2000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Arquiteto&quot;</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario eduardo <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Eduardo&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">3000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Gerente&quot;</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
  <span style="color: #008080; font-style: italic;">// adicionando funcionários na empresa.</span>
 Empresa google <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Empresa<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
 google.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>luiz<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
 google.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>iuri<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
 google.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>luciano<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
 google.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>sergio<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h2><strong>Identificando falhas no design</strong></h2>
<p>Mesmo com  um design simples como este um problema básico de design aparece. A classe empresa expõe o atributo Funcionário através de uma <a href="http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx">property</a> e assim viola o encapsulamento. Mas uma property não encapsula o atributo, através de gets e sets? A resposta é que neste caso, o atributo está escondido, mas eu tenho acesso a referência diretamente e o resultado disso é que qualquer “cliente” que usar o objeto do tipo empresa, pode manipular a lista de funcionários diretamente, ignorando quaisquer regras que por ventura existam. Por exemplo imagine a situação onde quisessemos que nunca um Funcionario fosse removido. Do jeito que está qualquer um poderia fazer <strong>google.Funcionarios.Remove(sergio).</strong></p>
<p>Um outro problema que aparece nesse código é que temos um conceito de negócio sendo manipulado, mas não explícito. Quando fazemos <strong>google.Funcionarios.add(luiz)</strong>, isso  representa uma ação no nosso domínio. Na verdade o que queremos fazer é contratar o Luiz. Técnicas como <a href="http://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a>, pregam que nosso código deve falar a <a href="http://domaindrivendesign.org/node/132">lingua do negócio</a>. De acordo com DDD, precisamos tornar este <a href="http://www.markhneedham.com/blog/2009/04/23/ddd-making-implicit-concepts-explicit/">conceito explícito</a> em nosso código. Vamos alterar a classe empresa para suportar isso:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #FF0000;">class</span> Empresa
 <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> List Funcionarios <span style="color: #000000;">&#123;</span>get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span><span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> Empresa<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Contrata<span style="color: #000000;">&#40;</span>Funcionario funcionario<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
       <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>funcionario<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
 <span style="color: #000000;">&#125;</span></pre></div></div>

<p>Repare que agora, existe um método na classe empresa que representa o conceito que estava implícito. Sempre devemos tornar os <a href="http://www.markhneedham.com/blog/2009/04/23/ddd-making-implicit-concepts-explicit/">conceitos implícitos explícitos</a>. Agora nosso código fica muito mais OO, se é que se pode usar esta expressão:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  google.<span style="color: #0000FF;">Contrata</span><span style="color: #000000;">&#40;</span>eduardo<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  google.<span style="color: #0000FF;">Contrata</span><span style="color: #000000;">&#40;</span>luiz<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  google.<span style="color: #0000FF;">Contrata</span><span style="color: #000000;">&#40;</span>iuri<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  google.<span style="color: #0000FF;">Contrata</span><span style="color: #000000;">&#40;</span>luciano<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  google.<span style="color: #0000FF;">Contrata</span><span style="color: #000000;">&#40;</span>sergio<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Agora o conceito “contratação” está explícito, mas ainda existe um <a href="http://en.wikipedia.org/wiki/Information_hiding">problema</a>, a classe empresa, ainda tem uma property que te permite acessar a lista de funcionários. Apesar de ter criado o método contrata, isso não garante que a lista não será manipulada diretamente.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">google.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>luiz<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Este trecho de código mostra novamente o <a href="http://en.wikipedia.org/wiki/Information_hiding">problema de expor a lista</a>, neste caso ao invés de contratar um funcionário estamos demitindo. Agora imagine que existe uma regra que especifica que todo funcinário demitido tem que ser inativado, como vamos garantir que isto vai ser feito? Podemos inativar o funcionário antes de removê-lo da lista:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  luiz.<span style="color: #0000FF;">Inativar</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  google.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>luiz<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>O problema desta abordagem é óbvio, não tem como garantir que esta regra será executada toda vez que precisarmos demitir um funcionário. Para resolver isso, novamente vamos tornar explícito o conceito de demissão.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #FF0000;">class</span> Empresa
 <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> List Funcionarios<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">public</span> Empresa<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Contrata<span style="color: #000000;">&#40;</span>Funcionario funcionario<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
       <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>funcionario<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Demite<span style="color: #000000;">&#40;</span>Funcionario funcionario<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      funcionario.<span style="color: #0000FF;">Inativar</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>funcionario<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span></pre></div></div>

<p>Agora a classe Empresa  tem um método Demite, o que torna explícito o conceito demissão. Note que antes de executar a remoção do usuário, fazemos a sua inativação. Além disso, não existe mais a property na classe empresa que expõe o atributo funcionários, este atributo é privado e somente a classe empresa sabe como manipulá-lo de forma correta.</p>
<p>Não fizemos nada além de seguir <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">princípios básicos de OO</a> aplicando o encapsulamento, e neste pequeno exemplo mostramos como é possível tornar o código mais fácil de se manter utilizando esta técnica.</p>
<h2><strong>Encapsulamento e linq no C#</strong></h2>
<p>Nas últimas versões do C# várias coisas interessantes foram incluídas, tornando a linguagem muito poderosa. Mas por outro lado, tenho visto uso destas técnicas de forma não muito organizada, principalmente em relação as boas práticas de programação em uma linguagem Orientada a Objetos.</p>
<p>Um dos recursos mais interessantes e que utiliza muitas das novas características da linguagem é o Linq. Vamos dar uma olhada no que<a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx"> é possível fazer com o Linq</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  var nomes <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span><span style="color: #666666;">&quot;luiz&quot;</span>,<span style="color: #666666;">&quot;sergio&quot;</span>, <span style="color: #666666;">&quot;iuri&quot;</span>, <span style="color: #666666;">&quot;eduardo&quot;</span>, <span style="color: #666666;">&quot;jose maria&quot;</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
  var nomesQueComecamComS <span style="color: #008000;">=</span> nomes.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>nome <span style="color: #008000;">=&gt;</span> nome.<span style="color: #0000FF;">StartsWith</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;S&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  var nomesQueContemMaria <span style="color: #008000;">=</span> nomes.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>nome <span style="color: #008000;">=&gt;</span> nome.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;maria&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> cities <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #666666;">&quot;Auckland&quot;</span>, <span style="color: #666666;">&quot;Oslo&quot;</span>, <span style="color: #666666;">&quot;Sydney&quot;</span>,<span style="color: #666666;">&quot;Seattle&quot;</span>, <span style="color: #666666;">&quot;Paris&quot;</span>, <span style="color: #666666;">&quot;Los Angeles&quot;</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
  IEnumerable places <span style="color: #008000;">=</span> from city <span style="color: #0600FF;">in</span> cities
                             where city.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">&gt;</span>
                             orderby city descending
                             select city<span style="color: #008000;">;</span></pre></div></div>

<p>Isso é muito poderoso, podemos fazer operações sobre lista de forma muito mais declarativa. O problema é que todo esse poder pode esconder algumas surpresas se não tomarmos os devidos cuidados com sua utilização.<br />
No nosso primeiro exemplo, vimos como encapsulamento na sua forma mais simples, torna nosso código mais simples, expressivo e de mais fácil manutenção.<br />
Vamos voltar a analisar o primeiro exemplo, só que pela perspectiva do uso do linq. Para isso vamos precisar colocar criar novamente a property  funcionários na classe empresa.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #FF0000;">class</span> Empresa
 <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> List Funcionarios <span style="color: #000000;">&#123;</span>get<span style="color: #008000;">;</span>set<span style="color: #008000;">;</span><span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span></pre></div></div>

<p>Considere os seguintes trechos de códigos, e veja como é possível trabalhar de forma <a href="http://en.wikipedia.org/wiki/Declarative_programming">declarativa </a>utilizando os recursos do linq:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  var funcionarios <span style="color: #008000;">=</span> google.<span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">;</span>
  var salarioMedido <span style="color: #008000;">=</span> funcionarios.<span style="color: #0000FF;">Average</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Salario</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>salarioMedido<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  var funcionariosAtivos <span style="color: #008000;">=</span> funcionarios.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  var desenvolvedores <span style="color: #008000;">=</span> funcionarios.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Cargo</span>.<span style="color: #0000FF;">Equals</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;desenvolvedor&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  var GerenteComSalarioMaior2000 <span style="color: #008000;">=</span> funcionarios.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Cargo</span>.<span style="color: #0000FF;">Equals</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Gerente&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>
                                                                            f.<span style="color: #0000FF;">Salario</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">2000</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Veja que fizemos várias operações sobre a lista de funcionários da empresa. A primeira vista isso é muito prático, mas podemos ter problemas com essa abordagem.  Na minha opinião o maior problema disso é que perdemos o <a href="http://domaindrivendesign.org/">conhecimento fundamental do negócio</a>. Se eu quero saber o salário médio dos funcionários de uma empresa, então esta operaçao deve estar explícita no objeto empresa.</p>
<p>Mas se eu fizer isso vou deixar  de tirar proveito das facilidaes do Linq? Não, basta promover o encapsulamento e mover este código para a classe empresa. A partir de agora o usuário da classe vai passar a invocar o método disponível no objeto empresa:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  salarioMedido <span style="color: #008000;">=</span> google.<span style="color: #0000FF;">ObterSalarioMedio</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Após fazer a mudança, o código fica mais simples, intuitivo e expressivo. O leitor do código, entende rapidamente o que esta linha de código faz e não precisa saber detalhes de implementação.<br />
Outro exemplo de código é a linha :</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  var funcionariosAtivos <span style="color: #008000;">=</span> funcionarios.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Neste trecho temos 2 problemas. Novamente a falta de encapsulamento. De quem é a <a href="http://en.wikipedia.org/wiki/GRASP_(object-oriented_design)">responsabilidade</a> de dizer quem são os funcionários ativos? <a href="http://web.cs.wpi.edu/~gpollice/cs4233-a05/CourseNotes/maps/class4/InformationExpert.html">Deveria ser da classe empresa</a>, então precisamos criar um novo método na classe para obter os funcionários ativos.<br />
Então na classe empresa temos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #0600FF;">public</span> IEnumerablel ObterFuncionariosAtivos<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
     <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span></pre></div></div>

<p>O segundo problema desta expressão novamente é falta de encapsulamento, estamos violando o princípio <a href="http://pragprog.com/articles/tell-dont-ask">Tell don’t Ask</a> quando fazemos  f.ativo == true. Quem sabe dizer se o funcionário é ativo ou não é o objeto funcionário, então é necessário criar o método na classe funcionário para tornar o explícito o conceito:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #FF0000;">class</span> Funcionario
  <span style="color: #000000;">&#123;</span>
     <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Nome <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
     <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Cargo <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
     <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">double</span> Salario <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
     <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> Ativo <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
     <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> EstahAtivo<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
     <span style="color: #000000;">&#123;</span>
       <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">ativo</span> <span style="color: #008000;">==</span> true<span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span></pre></div></div>

<p>E na classe empresa  podemos alterar a expressão Linq para utilizar o método da classe funcionário.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #0600FF;">public</span> IEnumerable ObterFuncionariosAtivos<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">EstahAtivo</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span></pre></div></div>

<p>Aqui a classe empresa completa:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">class</span> Empresa
 <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> List Funcionarios<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">public</span> Empresa<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Contrata<span style="color: #000000;">&#40;</span>Funcionario funcionario<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
       <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>funcionario<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Demite<span style="color: #000000;">&#40;</span>Funcionario funcionario<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      funcionario.<span style="color: #0000FF;">Inativar</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>funcionario<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>     
&nbsp;
     <span style="color: #0600FF;">public</span> IEnumerablel ObterFuncionariosAtivos<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
     <span style="color: #000000;">&#123;</span>
       <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>  
&nbsp;
     <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">double</span> ObterSalarioMedio<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
     <span style="color: #000000;">&#123;</span>
         <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Funcionarios</span>.<span style="color: #0000FF;">Average</span><span style="color: #000000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f.<span style="color: #0000FF;">Salario</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span></pre></div></div>

<p><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionarioCompleto.png"><img class="alignnone size-full wp-image-517" title="EmpresaFuncionarioCompleto" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionarioCompleto.png" alt="" width="525" height="144" /></a></p>
<p>Estes são apenas alguns exemplos de código simples onde a falta de encapsulamento pode trazer problemas no futuro. Com certeza um dos mais evidentes é a replicação de código e consequentemente os problemas de manutenção causados por ele, além é claro do fato do conhecimento do domínio ficar espalhado entre várias expressões Linq.</p>
<h2>Então os problemas são das novas features do C#?</h2>
<p>Não, com certeza isso não é problema das novas features do c#. A questão evidente é que muitos desenvolvedores estão esquecendo <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">princípios básicos</a> ao utilizarem estes recursos.</p>
<p>Existem alguns artigos  na web falando sobre a tendência de se <a href="http://www.markhneedham.com/blog/2010/04/02/ldnug-mixing-functional-and-object-oriented-approaches-to-programming-in-c/">misturar</a> os <a href="http://www.ccs.neu.edu/home/matthias/Presentations/ecoop2004.pdf">paradigmas funcional e OO</a>. Nós como desenvolvedores só temos a ganhar com isso, pois podemos tirar proveito do  melhor dos dois paradigmas. O que não pode acontecer é voltarmos aos problemas que tínhamos no passado, geralmente por  descuido ou  simplesmente por um “relaxamento”  com princípios básicos de Orientação Objetos.</p>
<p>até a próxima,<br />
Luiz Costa</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/feed/</wfw:commentRss>
		<slash:comments>9</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>Cliente para Restfulie C#</title>
		<link>http://www.sagadoprogramador.com.br/2010/01/cliente-para-restfulie-c/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/01/cliente-para-restfulie-c/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 23:43:52 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[hipermedia]]></category>
		<category><![CDATA[restfulie]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=430</guid>
		<description><![CDATA[No final do ano passado o Guilherme Silveira da Caelum , lançou a api Restfulie.
Basicamente o Restfulie implementa as idéias do Jim Webber e Ian Robson em relação a media types que suportam hipermídia, content negotiation e muito mais relacionado a Rest.
Este projeto fez bastante barulho na comunidade, inclusive recebendo elogios do próprio Jim.
O Restfulie [...]]]></description>
			<content:encoded><![CDATA[<p>No final do ano passado o <a href="http://guilhermesilveira.wordpress.com/" target="_blank">Guilherme Silveira</a> da <a href="http://www.caelum.com.br" target="_blank">Caelum </a>, lançou a api <a href="http://restfulie.caelum.com.br/" target="_blank">Restfulie</a>.<br />
Basicamente o Restfulie implementa as idéias do <a href="http://jim.webber.name/" target="_blank">Jim Webber</a> e <a href="http://iansrobinson.com/" target="_blank">Ian Robson</a> em relação a media types que suportam hipermídia, content negotiation e muito mais relacionado a <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" target="_blank">Rest</a>.<br />
Este projeto fez <a href="http://www.infoq.com/news/2009/11/restfulie-hypermedia-services" target="_blank">bastante barulho</a> na <a href="http://www.infoq.com/news/2009/12/restfulie-interview" target="_blank">comunidade</a>, inclusive recebendo <a href="http://jim.webber.name/2009/11/03/0a252e61-a132-42ab-8547-69e269c3c075.aspx">elogios do próprio Jim</a>.</p>
<p>O Restfulie teve sua versão original implementada em<a href="http://restfulie.caelum.com.br/restful_rails" target="_blank"> ruby</a> e logo depois foi lançada a versão para<a href="http://github.com/caelum/restfulie-java" target="_blank"> Java</a>, mas ainda não havia nenhuma versão para .Net. Foi então que eu e o Sergio Junior aqui do blog resolvemos escrever uma versão para <a href="http://restfulie.caelum.com.br/restful_csharp" target="_blank">C# da api</a>.<br />
Começamos a implementar a parte cliente do Restfulie e fizemos isto utilizando as características dinâmicas da versão 4.0 do C#.<br />
A idéia é que podemos fazer o client em C# bem próximo da idéia inicial que foi escrita em Ruby.<br />
<span id="more-430"></span><br />
Aqui vamos mostrar alguns exemplos de utilização desta versão em C#.<br />
Um recurso Pedido pode ter sua representação em xml como a que segue:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pedido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>26/12/2009 11:40<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>300.00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;refresh&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2005/Atom&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;update&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;...&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;pagar&quot;</span></span>
<span style="color: #009900;">		  <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1/pagar&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;...&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;excluir&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1</span>
<span style="color: #009900;">          xmlns:atom=&quot;</span>...<span style="color: #ff0000;">&quot;/&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;GetCliente&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1/cliente</span>
<span style="color: #009900;">          xmlns:atom=&quot;</span>...<span style="color: #ff0000;">&quot;/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/pedido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Respare que a representação deste recurso além de conter  os dados do recurso, possui também  todas as possíveis transições de estado do recurso.<br />
Além  disso, ainda é possível seguir os links e obter outros recursos relacionados: este é o conceito de Hipermedia tanto utilizado na web humana.</p>
<p><strong>Utilizando o Restfulie client C#</strong></p>
<p>Primeiro começamos fazendo o download da <a href="http://code.google.com/p/restfulie/downloads/list" target="_blank">DLL </a>e então para obter a representação de um recurso em C#, podemos utilizar algo bem parecido com ruby, o acesso a um entry point:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">dynamic  pedido <span style="color: #008000;">=</span> Restfulie.<span style="color: #0000FF;">At</span><span style="color: #000000;">&#40;</span>“www.<span style="color: #0000FF;">caelum</span>.<span style="color: #0000FF;">com</span>.<span style="color: #0000FF;">br</span><span style="color: #008000;">/</span>pedidos<span style="color: #008000;">/</span>1.<span style="color: #0000FF;">xml</span>”<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Get</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Uma vez com a representação do recurso em mãos, podemos obter as informações do mesmo e seguir seus links.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>
   <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">format</span><span style="color: #000000;">&#40;</span>“O valor total <span style="color: #0600FF;">do</span> pedido é<span style="color: #008000;">:</span><span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#125;</span>”, pedido.<span style="color: #0000FF;">Total</span> <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>
   <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">format</span><span style="color: #000000;">&#40;</span>“A data <span style="color: #0600FF;">do</span> pedido é<span style="color: #008000;">:</span> <span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#125;</span>”, pedido.<span style="color: #0000FF;">Data</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>É possível invocar métodos e alterar o estado do pedido, além de navegar em suas relações com outros recursos.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">   pedido.<span style="color: #0000FF;">Pagar</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   pedido.<span style="color: #0000FF;">Cancelar</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   pedido.<span style="color: #0000FF;">Excluir</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Estas chamadas de métodos são remotas, baseadas nos links fornecidos pelo xml e nos protocolos http e media types bem conhecidos.<br />
Para recuperar um recurso relacionado através dos links:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  dynamic cliente <span style="color: #008000;">=</span> pedido.<span style="color: #0000FF;">GetCliente</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>
     <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">format</span><span style="color: #000000;">&#40;</span>“Nome <span style="color: #0600FF;">do</span> cliente <span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#125;</span>”, cliente.<span style="color: #0000FF;">nome</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Ainda podemos obter as informações sobre sua resposta web, para analisar headers ou response codes:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pedido.<span style="color: #0000FF;">WebResponse</span>.<span style="color: #0000FF;">StatusCode</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>As vezes a representação xml do recurso pode conter tags com o caracter “-”.<br />
Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Sao Paulo<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;population<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>18000000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;growth<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>10<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/growth<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/population<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;updated-at<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>10/01/2010<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/updated-at<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;next_largest&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://localhost:3000/cities/18.xml&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Obtendo o recurso:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">dynamic city <span style="color: #008000;">=</span> Restfulie.<span style="color: #0000FF;">At</span><span style="color: #000000;">&#40;</span>“http<span style="color: #008000;">:</span><span style="color: #008080; font-style: italic;">//localhost:3000/cities/17.xml”).Get();</span></pre></div></div>

<p>Acessando o atributo “update-at”:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>
     <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">format</span><span style="color: #000000;">&#40;</span>“A data de atualização é <span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#125;</span>”,city.<span style="color: #0000FF;">Update_At</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>
     <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">format</span><span style="color: #000000;">&#40;</span>“População <span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#125;</span>”, city.<span style="color: #0000FF;">Population</span>.<span style="color: #0000FF;">size</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Note que em na vesão C#, não acessamos o atributo update-at com caracter “-”, este é substituído por “_”. Então quando for necessário acessar um atributo ou método que utilize o “-”, substituída por “_”.<br />
Com as novas capacidades dinâmicas do C# 4.0, conseguimos atingir um resultado bem próximo ao que é possível na versão ruby.<br />
Aqui segue um comparativo básico:</p>
<p>Em Ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  pedido = Restfulie.<span style="color:#9900CC;">at</span><span style="color:#006600; font-weight:bold;">&#40;</span>“http:<span style="color:#006600; font-weight:bold;">//</span>restfulie<span style="color:#006600; font-weight:bold;">-</span>test.<span style="color:#9900CC;">heroku</span>.<span style="color:#9900CC;">com</span><span style="color:#006600; font-weight:bold;">/</span>orders<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">14</span>”<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">get</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> pedido.<span style="color:#9900CC;">customer</span><span style="color:#006600; font-weight:bold;">-</span>name
  pedido.<span style="color:#9900CC;">cancel</span></pre></div></div>

<p>Em C#</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  pedido <span style="color: #008000;">=</span> Restfulie.<span style="color: #0000FF;">At</span><span style="color: #000000;">&#40;</span>“http<span style="color: #008000;">:</span><span style="color: #008080; font-style: italic;">//restfulie-test.heroku.com/orders/14.xml”).Get();</span>
  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pedido.<span style="color: #0000FF;">customer_name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  pedido.<span style="color: #0000FF;">Cancel</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Por enquanto só temos a versão do client em C#. Ainda falta uma série de features a serem implementadas. No site do projeto, tem uma lista de coisas que necessitam de ser feitas no cliente<br />
para que ele fique tão maduro quanto as versões em ruby ou Java. Vamos continuar trabalhando no cliente para isso.</p>
<p>Se você está interessado em ajudar neste projeto, deixe um comentário ou mande um e-mail para nós.</p>
<p>Para saber mais:</p>
<p><a href="http://github.com/caelum/restfulie-csharp">http://github.com/caelum/restfulie-csharp</a><br />
<a href="http://restfulie.caelumobjects.com/">http://restfulie.caelumobjects.com/</a></p>
<p>Para saber mais sobre as idéias por trás do Restfulie, segue o link do artigo na infoq.<br />
<a href="http://www.infoq.com/articles/webber-rest-workflow">http://www.infoq.com/articles/webber-rest-workflow</a></p>
<p>Até a Próxima<br />
Luiz Costa<br />
Sérgio Júnior.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/01/cliente-para-restfulie-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Analisando o codigo escrito anteriormente.</title>
		<link>http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 16:42:57 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[principios]]></category>
		<category><![CDATA[principiosOO]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=381</guid>
		<description><![CDATA[Terminei meu post anterior com a pergunta: "Este código está bom? Porque?"
Para analizar um código, assim como qualquer outra coisa, nós precisamos de parâmetros. Precisamos nos basear em algo que saibamos que seja bom, para assim podermos determinar se outra coisa é tão boa quanto, melhor, ou até pior.
Com código não é diferente. Então antes [...]]]></description>
			<content:encoded><![CDATA[<p>Terminei meu post <a href="http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/">anterior</a> com a pergunta: "Este código está bom? Porque?"</p>
<p>Para analizar um código, assim como qualquer outra coisa, nós precisamos de parâmetros. Precisamos nos basear em algo que saibamos que seja bom, para assim podermos determinar se outra coisa é tão boa quanto, melhor, ou até pior.</p>
<p>Com código não é diferente. Então antes de respondermos a pergunta feita no inicio deste texto, precisamos definir o que é um código bom, ou melhor, que caracteristicas deve ter um codigo para ser considerado bom. Vamos agora recorrer a alguns principios OO para nos municiar de paramêtros para assim julgarmos o codigo em questão</p>
<p><a href="http://www.objectmentor.com/omTeam/martin_r.html">Robert Martin</a>, o uncle Bob, escreveu a muito tempo sobre os principios OO num documento chamado: <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">PrinciplesOfOod</a>. Dos principios OO descritos neste artigo, pelo menos 5 ficaram bastante famosos, e são conhecidos pela sigla <strong>SOLID</strong>, são eles:<br />
<span id="more-381"></span><br />
<strong><a href="http://www.codingefficiency.com/2009/07/18/solid-s-single-responsibility-principle/">S</a></strong><a href="http://www.codingefficiency.com/2009/07/18/solid-s-single-responsibility-principle/">ingle Responsibility Principle (SRP)</a> - <em>A classe deve ter uma única responsabilidade, uma única razão de existir.</em></p>
<p><em><span style="font-style: normal;"><strong><a href="http://www.codingefficiency.com/2009/07/20/solid-o-open-closed-principle/">O</a></strong><a href="http://www.codingefficiency.com/2009/07/20/solid-o-open-closed-principle/">pen Closed Principle (OCP)</a> - <em>A classe deve ser aberta para extensão (sublcasses e sobrescrita de metodos) e fechada para modifiação *</em></span></em></p>
<p><strong><a href="http://www.codingefficiency.com/2009/07/21/solid-l-liskov-substitution-principle/">L</a></strong><a href="http://www.codingefficiency.com/2009/07/21/solid-l-liskov-substitution-principle/">iskov Substitution Principle (LSP)</a> - <em>Resumidamente ele serve para nos aletar para heranças sem sentido.</em></p>
<p><strong><a href="http://www.codingefficiency.com/2009/07/23/solid-i-interface-segregation-principle/">I</a></strong><a href="http://www.codingefficiency.com/2009/07/23/solid-i-interface-segregation-principle/">nterface Segregation Principle (ISP)</a> - <em>Defende que uma classe deve depender apenas dos métodos que usa de uma outra classe. Interfaces são um mecanismo para isso.</em></p>
<p><strong><a href="http://www.codingefficiency.com/2009/07/27/solid-d-dependency-inversion-principle/">D</a></strong><span><a href="http://www.codingefficiency.com/2009/07/27/solid-d-dependency-inversion-principle/">ependency Inversion Principle</a></span><a href="http://www.codingefficiency.com/2009/07/27/solid-d-dependency-inversion-principle/"> (ISP)</a> - <em>Defende que componentes maiores devem depender não de componentes menores, mas sim de uma abstração deles.</em></p>
<p><em>*Pode ser discutido, principalmente se você estiver trabalhando em um modelo de dominio incremental, ou seja, você vai descobrindo as necessidades de suas classes durante o desenvolvimento de software. Neste cenário o principio OCP pode ser radical demais. Lembre-se é preciso ter bom senso.</em></p>
<p>Dos principios descritos por Robert Martin, ficaremos apenas com o SRP. Sabendo agora que <em>uma classe deve possuir apenas uma úncia responsabilidade.</em> Quantas responsabilidades podemos identificar na classe Principal do post <a href="http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/">anterior</a>?</p>
<p>Podemos identificar facilmente 3 responsabilidades. São elas:</p>
<p>1 - Controla a execução da aplicação.</p>
<p>2 - Cadastra um novo DVD</p>
<p>3 - Lista todos os DVD's cadastrados</p>
<p>Agora ficou facil ver que a classe Principal está <em>ferindo </em>o SRP. A resposabilidade desta classe deveria ser apenas: <em>Controlar a execução da aplicação. </em>Precisamos retirar da classe Principal as demais responsabilidades. Como faremos isso?</p>
<p>A melhor solução é remover todo o código "extra" da classe Principal. Mas o grande problema, é que sem esse codigo nossa aplicação vai parar de funcionar! Este código não pode simplesmente desaparecer. O que nós precisamos fazer e leva-lo para outro lugar. E como estamos programando segundo o paradigma de Orientação a Objetos, vamos precisar de novas classes para cada uma das responsabilidades descritas acima.</p>
<p>Teriamos as seguintes classes com as seguintes responsabilidades:</p>
<p><em><span style="color: #333399;">Classe</span><span style="color: #0000ff;">:</span></em><em> Principal </em></p>
<p><em><span style="color: #333399;">Responsabilidade</span></em><em>: Controlar a execucao da aplicação</em></p>
<p><em><span style="color: #333399;">Classe</span><span style="color: #0000ff;">:</span> CadastrarDvd </em></p>
<p><em><em><span style="color: #333399;">Responsabilidade</span></em><em>:</em> Cuidar da lógica de inclusao de um dvd</em></p>
<p><em><span style="color: #333399;">Classe</span><span style="color: #0000ff;">:</span> ListarTodosDvds</em></p>
<p><em><em><span style="color: #333399;">Responsabilidade</span></em><em>:</em> Cuidar da lógica de exibicao dos dvd's</em></p>
<p>Após estas alterações vamos perceber que a classe Principal ficou bem melhor.</p>
<p>Mas será que isso foi suficiente? Apenas esta alteração terá salvado a vida de nossa pequena aplicação?</p>
<p>Tente aplicar você mesmo o SRP em nossas novas classes e comente a respeito. No proximo post continuamos nossa <em>saga</em>.</p>
<p>Abraços.</p>
<p>Sergio Azevedo Junior</p>
<p>Confira abaixo como ficaram nossas classes:</p>
<p>Principal</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> <span style="color: #003399;">Principal</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
    Scanner scan <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Scanner<span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span> opcao <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------------- Controle de Dvds e Cds ---------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   1 - Cadastrar Novo Dvd &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   2 - Listar Dvd's &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   3 - Terminar &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;------------------------------------------------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; Escolha uma opção:--&amp;gt; &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      opcao <span style="color: #339933;">=</span> scan.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>opcao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">new</span> CadastraDvd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">executa</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">new</span> ListaTodosDvds<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">executa</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>opcao <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>CadastraDvds</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CadastraDvd <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> executa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">PrintStream</span> ps <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">File</span> file <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dvds.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
      ps <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintStream</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      Dvd dvd <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Dvd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Titulo.: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setTitulo</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sinopse: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setSinopse</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Genero.: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setGenero</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ano....: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setAno</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Duracao: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setDuracao</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getTitulo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getSinopse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getGenero</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getAno</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getDuracao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
      br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ps <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
        ps.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>ListaTodosDvds</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ListaTodosDvds <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> executa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">FileNotFoundException</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;------------- Lista de Dvd's -------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Scanner reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Scanner<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dvds.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>reader.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>reader.<span style="color: #006633;">nextLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/feed/</wfw:commentRss>
		<slash:comments>6</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>Esse código que acabei de escrever está bom?</title>
		<link>http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 05:39:28 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[boas práticas]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=336</guid>
		<description><![CDATA[Depois de aprender Java, o grande desafio é como escrever boas aplicações. Saber se nosso codigo está bom ou se ele "fede" é sempre um desafio. Com objetivo de auxiliar os estudantes de Java, e os desenvolvedores iniciantes estou dando inicio a uma série de posts que tem por objetivo formar um senso critico no desenvolvedor.
Espero que vocês gostem.
Abraços.]]></description>
			<content:encoded><![CDATA[<p>No inicio do aprendizado da linguagem Java, tudo é dificil. Não conseguimos nem mesmo converter um string em um numero ou vice e versa. Pra superar estas dificuldades recorremos a livros, apostilas, fóruns, blogs ou cursos.</p>
<p>Depois de ler livros, ou fazer cursos, essas "dificuldades operacionais" desaparecem, afinal aprendemos a usar melhor a linguagem e passamos a conhecer melhor suas apis. Nesse ponto já somos capazes de por exemplo converter um String em um numero, criar e organizar listas de elementos, usar arquivos para realizar operações de leitura e escrita.<span id="more-336"></span></p>
<p>Uma vez que já sabemos criar aplicações em Java, precisamos nos perguntar outras coisas:</p>
<p style="text-align: left;"><em></em></p>
<p><em></em></p>
<ul>
<li>"As aplicações que criamos foram constuidas da melhor maneira possível?"</li>
<li>"Meu código está orientado a objetos, ou é apenas procedural Java?"</li>
<li>"Como eu identifico o que deve e o que nao deve ser uma classe no meu sistema?"</li>
</ul>
<p>A boa noticia é que estas perguntas possuem respostas. A má noticia é que eu não vou dar todas as respostas de bandeja a vocês. Ao invés disso vamos aprender a ter "senso critico" sobre o código que escrevemos.  Para isso vamos começar simplesmente criando uma pequena e simples aplicação Java para cadastro e consulta de  Dvd's.</p>
<p>Em geral, nos preocupamos primeiramente em escrever uma aplicação que funcione, e talvez esta atitude nos leve a não ter uma aplicação bem construida. Existem várias "desculpas" que podemos utilizar para justificar esse tipo de construção, mas dentre elas destacam-se as classicas:<strong> "nao tenho tempo"</strong> e<strong> "o cronograma está apertado"</strong>. =)</p>
<p>Nesta primeira etapa estamos interessados em escrever uma aplicação que funcione. ( Talvez porque estejamos sem tempo =p )</p>
<p>Bem, para isso nos vamos precisar da classe Dvd, entao:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Dvd <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> titulo<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> sinopse<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> genero<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> ano<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> duracao<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> emprestado<span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Gets e Sets</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora vamos a nossa classe "principal":</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> <span style="color: #003399;">Principal</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">FileNotFoundException</span> <span style="color: #009900;">&#123;</span>
		Scanner scan <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Scanner<span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> opcao <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">do</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>
					.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------------- Controle de Dvds e Cds ---------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   1 - Cadastrar Novo Dvd &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   2 - Listar Dvd's &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   3 - Terminar &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>
					.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;------------------------------------------------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; Escolha uma opção:--&amp;gt; &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			opcao <span style="color: #339933;">=</span> scan.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>opcao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>
						<span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">PrintStream</span> ps <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintStream</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dvds.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
					Dvd dvd <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Dvd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Titulo.: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					dvd.<span style="color: #006633;">setTitulo</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sinopse: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					dvd.<span style="color: #006633;">setSinopse</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Genero.: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					dvd.<span style="color: #006633;">setGenero</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ano....: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					dvd.<span style="color: #006633;">setAno</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Duracao: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					dvd.<span style="color: #006633;">setDuracao</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
					ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getTitulo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getSinopse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getGenero</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getAno</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getDuracao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					ps.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>
						.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;------------- Lista de Dvd's -------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				Scanner reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Scanner<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dvds.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>reader.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>reader.<span style="color: #006633;">nextLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>opcao <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>É isso ai gente! Nossa aplicação está pronta e funcionando. Porém eu faço a vocês duas perguntas:<br />
Este codigo está bom? Porque?</p>
<p>No proximo post, vamos analisar este codigo responder a estas perguntas. Porém você que leu este post nao precisa esperar, pode escrever seu comentario aqui respondendo esta pergunta.</p>
<p>Abraços,<br />
Sergio Junior</p>
<p>Confira a sequencia deste post <a href="http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/">aqui.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nosso modelo de objetos não deve ser uma cópia do nosso modelo de dados</title>
		<link>http://www.sagadoprogramador.com.br/2009/07/nosso-modelo-de-objetos-nao-deve-ser-uma-copia-do-nosso-modelo-de-dados/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/07/nosso-modelo-de-objetos-nao-deve-ser-uma-copia-do-nosso-modelo-de-dados/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 02:22:17 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[modelo de domínio]]></category>
		<category><![CDATA[persistência]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=317</guid>
		<description><![CDATA[Esta semana aconteceu uma discussão bem interessante na lista interna da Caelum sobre Active Records. E no meio desta discussão surgiu o seguinte tema: "Nosso modelo de objetos não deve ser uma cópia do modelo de dados."
Acho que isso a maioria das pessoas já sabia, mas o que tenho visto por aí em projetos que [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana aconteceu uma discussão bem interessante na lista interna da <a title="Caelum" href="http://www.caelum.com.br/" target="_blank">Caelum </a>sobre <a title="Active Records" href="http://martinfowler.com/eaaCatalog/activeRecord.html" target="_blank">Active Records</a>. E no meio desta discussão surgiu o seguinte tema: "Nosso modelo de objetos não deve ser uma cópia do modelo de dados."</p>
<p>Acho que isso a maioria das pessoas já sabia, mas o que tenho visto por aí em projetos que trabalhei é exatamente o contrário: um modelo de objetos exatamente igual ao modelo de dados.</p>
<p>Por que ainda utilizamos uma abordagem assim?<br />
Em minha opinião, o principal problema é que muitos desenvolvedores ainda não entenderam corretamente Orientação a Objetos. A prova disso são os sistemas escritos de forma totalmente procedural.</p>
<p>Tentarei exemplificar algumas destas diferenças. Este exemplo é uma adaptação de um problema real que eu presenciei. Vamos imaginar um sistema de cursos onde nós temos as tabelas:</p>
<p><span id="more-317"></span></p>
<p><strong>Curso</strong><br />
id<br />
nome<br />
data Inicio<br />
data Fim<br />
idInstrutor</p>
<p><strong>Instrutor</strong><br />
id<br />
nome</p>
<p>Esta é uma simplificação, mas vai ajudar a explorar o problema.<br />
A abordagem comum que eu tenho visto é ter um modelo de objetos que represente as tabelas do banco de dados, pois é necessário persistir as informações destes objetos. Para persistência, em java podemos utilizar o <a title="Hibernate/JPA" href="https://www.hibernate.org/397.html" target="_blank">Hibernate/JPA</a>, em <a title="Rails" href="http://www.rubyonrails.pro.br/" target="_blank"> Rails </a>podemos utilizar <a title="o framework Active Record" href="http://en.wikipedia.org/wiki/ActiveRecord_(Rails)" target="_blank">o framework Active Record</a> (que aliás, te induz a fazer exatamente o que eu descrevi acima) e em C# podemos utilizar o <a title="NHibernate" href="https://www.hibernate.org/343.html" target="_blank">NHibernate</a>.</p>
<p>Vamos ver algum código:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Curso<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataInicio<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataFim<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Instrutor instrutor<span style="color: #339933;">;</span>
&nbsp;
     ..<span style="color: #006633;">gets</span> e sets
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Instrutor<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
&nbsp;
    .. <span style="color: #006633;">gets</span> e sets
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Em um primeiro momento, não há nada de errado com esta abordagem, certo? Apesar de nosso modelo de objetos refletir exatamente nossas tabelas no banco de dados, ele parece razoável.</p>
<p>Neste sistema, ao cadastrar um curso, temos que assegurar que não existe sobreposição de datas entre cursos com o mesmo instrutor. Exemplo:</p>
<p>Curso: Orientação a Objetos<br />
Instrutor: Zé Bedeu<br />
período: 18/07/2009 até <strong>10/08/2009</strong></p>
<p>Curso: Java<br />
Instrutor: Zé Bedeu<br />
período: <strong>25/07/2009 </strong>até 20/08/2009</p>
<p>Reparem que estes dois cursos vão se sobrepor em algum momento. Até o dia 24/07/2009 o Zé Bedeu está ministrando o curso de OO e a partir de 25/07 ele também estará ministrando o curso de Java. Isso pode até fazer sentido, mas no nosso sistema de cursos isso não pode acontecer.</p>
<p>Então o que podemos fazer para evitar isso?<br />
Podemos criar uma verificação para não deixar o mesmo instrutor ser alocado para outro curso se ele já tem aulas previstas dentro daquele período.</p>
<p>Para validar esta regra de negócio, poderíamos escrever um teste:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> naoDeveSerPossivelTerDoisCursosParaUmInstrutorEmPeriodosSobrePostos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// para simplicar, vamos utilizar strings para as datas</span>
    <span style="color: #666666; font-style: italic;">// utilizando um buider.</span>
    Curso oo <span style="color: #339933;">=</span> Curso.<span style="color: #006633;">de</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Orientacao a Objetos&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comInstrutor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ze Bedeu&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comecandoEm</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;18/07/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">ate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;25/07/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">Build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
&nbsp;
    Curso java <span style="color: #339933;">=</span> Curso.<span style="color: #006633;">de</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Java&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comInstrutor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ze Bedeu&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comecandoEm</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;25/07/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">ate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;20/08/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">Build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #000066; font-weight: bold;">boolean</span> existeSobrePosição <span style="color: #339933;">=</span>
                           DataUtils.<span style="color: #006633;">existeSobrePosicaoDeDatas</span><span style="color: #009900;">&#40;</span>
                                          oo.<span style="color: #006633;">getDataInicio</span>,
                                          oo.<span style="color: #006633;">getDataFim</span>,java.<span style="color: #006633;">getDataInicio</span>,
                                          java.<span style="color: #006633;">getDataFim</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    assertFalse<span style="color: #009900;">&#40;</span>existeSobrePosicao,
                   <span style="color: #0000ff;">&quot;não deve haver dois cursos com períodos sobrepostos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nosso teste faz a validação da regra de negócio, mas tem um problema nesta abordagem. Quem faz a verificação de datas é um objeto totalmente separado do nosso domínio. Reparem que o objeto DataUtils tem um método estatico  que recebe 4 parâmetros. Podemos melhorar este exemplo atribuindo a responsabilidade de validar sobreposição para a classe curso, <a href="http://en.wikipedia.org/wiki/GRASP_(Object_Oriented_Design)#Information_Expert">já que é ele quem tem as informações do período</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Curso<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataInicio<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataFim<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Instrutor instrutor<span style="color: #339933;">;</span>
&nbsp;
     ..<span style="color: #006633;">gets</span> e sets
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> estahNoMesmoPeriodo<span style="color: #009900;">&#40;</span>Curso outroCurso<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span>  DataUtils.<span style="color: #006633;">existeSobrePosicaoDeDatas</span><span style="color: #009900;">&#40;</span>
                                           <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getDataInicio</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
                                           <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getDataFim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
                                           outroCurso.<span style="color: #006633;">getDataInicio</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
                                           outroCurso.<span style="color: #006633;">getDataFim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vamos <a href="http://www.refactoring.com/" target="_blank">refatorar </a>nosso teste:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> naoDeveSerPossivelTerDoisCursosParaUmInstrutorEmPeriodosSobrePostos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// para simplicar, vamos utilizar strings para as datas</span>
    <span style="color: #666666; font-style: italic;">// utilizando um buider.</span>
    Curso oo <span style="color: #339933;">=</span> Curso.<span style="color: #006633;">de</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Orientacao a Objetos&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comInstrutor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ze Bedeu&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comecandoEm</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;18/07/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">ate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;25/07/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">Build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    Curso java <span style="color: #339933;">=</span> Curso.<span style="color: #006633;">de</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Java&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comInstrutor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ze Bedeu&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">comecandoEm</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;25/07/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">ate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;20/08/2009&quot;</span><span style="color: #009900;">&#41;</span>
                               .<span style="color: #006633;">Build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">boolean</span> existeSobrePosição <span style="color: #339933;">=</span> oo.<span style="color: #006633;">estahNoMesmoPeriodo</span><span style="color: #009900;">&#40;</span>java<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    assertFalse<span style="color: #009900;">&#40;</span>existeSobrePosição,
                    <span style="color: #0000ff;">&quot;não deve haver dois cursos com períodos sobrepostos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Começou a melhorar, repare que agora o próprio curso sabe validar se está no mesmo período de outro. Isso é começar delegar responsabilidades para os objetos de domínio, e evitar de se ter objetos <a href="http://fragmental.com.br/wiki/index.php?title=Fantoches" target="_blank">fantoches</a>. Nosso modelo de objetos deve ser rico e não <a href="http://martinfowler.com/bliki/AnemicDomainModel.html" target="_blank">anêmico</a>.</p>
<p>Mas ainda temos algo pra melhorar. Existe um conceito que sempre falamos aqui até agora e ainda não foi explorado. Este conceito é o "Período". Mas o que é o Período?<br />
O período nada mais é que uma representação do tempo transcorrido entre duas datas.</p>
<p>Um curso ocorre em um Período. Se vocês observarem a classe curso, temos data inicial e data final. O  que temos na verdade é um período, e este conceito está implícito nesta classe. Em uma boa modelagem de objetos, <a href="http://www.markhneedham.com/blog/2009/04/23/ddd-making-implicit-concepts-explicit/" target="_blank">nós temos que tornar os conceitos explícitos.</a> Para isso podemos refatorar a classe curso e criar a classe período. Podemos também refatorar o método existeSobrePosicaoDeDatas da classe DataUtils para utilizar um período.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Periodo<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataInicio<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataFim<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Curso<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Periodo periodo<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Instrutor instrutor<span style="color: #339933;">;</span>
&nbsp;
     ..<span style="color: #006633;">gets</span> e sets
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> estahNoMesmoPeriodo<span style="color: #009900;">&#40;</span>Curso outroCurso<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">return</span>  DataUtils.<span style="color: #006633;">existeSobrePosicaoDeDatas</span><span style="color: #009900;">&#40;</span>
                                <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getPeriodo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
                                outroCurso.<span style="color: #006633;">getPeriodo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora a classe Curso na verdade tem um Período. Mas qual a vantagem de se ter o Período ao invés da data Inicio e data Fim? A vantagem é que período agora é uma classe, pode ter responsabilidades, pode tirar vantagens dos conceitos de OO. Além disso este período é altamente reutilizável por várias classes, qualquer uma que precisar do conceito de período pode utilizá-lo.</p>
<p>Mas ainda podemos melhorar mais. Na verdade quem tem a reponsabilidade de verificar se um período sobrepoe outro é o próprio período. A classe período <a href="http://en.wikipedia.org/wiki/GRASP_(Object_Oriented_Design)#Information_Expert">é que sabe quem são as datas de início e de fim</a>. Logo podemos fazer mais um refactoring atribuir a responsabilidade a classe período.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Periodo<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataInicio<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dataFim<span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> Periodo<span style="color: #009900;">&#40;</span><span style="color: #003399;">Date</span> dataInicio, <span style="color: #003399;">Date</span> DataFim<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">dataInicio</span> <span style="color: #339933;">=</span> dataInicio<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">dataFim</span> <span style="color: #339933;">=</span> dataFim<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> estahNoMesmoPeriodo<span style="color: #009900;">&#40;</span>Periodo outroPeriodo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">/// código de validação</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> quantidadeDeDias<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// código</span>
    <span style="color: #009900;">&#125;</span>
    .. <span style="color: #006633;">gets</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Curso<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Periodo periodo<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Instrutor instrutor<span style="color: #339933;">;</span>
&nbsp;
     ..<span style="color: #006633;">gets</span> e sets
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> estahNoMesmoPeriodo<span style="color: #009900;">&#40;</span>Curso outroCurso<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">return</span>  <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getPeriodo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">estahNoMesmoPeriodo</span><span style="color: #009900;">&#40;</span>
                outroCurso.<span style="color: #006633;">getPeriodo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Após este refactoring, podemos observar algumas coisas:</p>
<ul>
<li>A classe período tem um construtor que recebe 2 datas e não tem sets. Não faz sentido você instanciar um objeto período sem data de inicio e data de fim, pois ele (o objeto período)ficararia em um estado inválido.</li>
<li>A classe período agora é quem sabe validar sobreposição de datas.</li>
<li>A classe período agora também sabe dizer quantos dias tem no período, já que ela conhece o início e o fim.</li>
<li>A classe curso agora somente delega a responsabilidade para a classe período validar as datas.</li>
<li> E o mais importante, eliminamos a necessidade da classe DataUtils. Uma classe como essa é <a href="http://fragmental.com.br/wiki/index.php?title=Fantoches" target="_blank">sintoma de um código procedural.</a> A classe dataUtils tem somente procedimentos que lidam com dados separados. A grande sacada de Orientação a Objetos é colocar junto Dados + Operações sobre estes dados.</li>
</ul>
<p>Agora voltando ao assunto do início do tópico. A classe período não tem necessidade de ser persistida, ela é apenas um <a href="http://martinfowler.com/eaaCatalog/valueObject.html" target="_blank">Value Object</a>. Os dados da classe período podem ser persistidos junto com a tabela curso. Mas isso não nos limita a ter uma <a href="http://en.wikipedia.org/wiki/Domain-driven_design">classe que representa um conceito do domínio.</a><br />
Com JPA vc pode fazer isso facilmente utilizando anotações @Embeddable.</p>
<p>A utilização de uma <a href="http://www.martinfowler.com/bliki/FluentInterface.html" target="_blank">Fluent Interface </a>nos testes foi de propósito, pois pretendo voltar ao assunto logo logo aqui no blog.</p>
<p>Valeu pessoal,</p>
<p>Luiz Costa</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/07/nosso-modelo-de-objetos-nao-deve-ser-uma-copia-do-nosso-modelo-de-dados/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>5 bons motivos para usar jQuery</title>
		<link>http://www.sagadoprogramador.com.br/2009/07/5-bons-motivos-para-usar-jquery/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/07/5-bons-motivos-para-usar-jquery/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 19:28:27 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[Jquery]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[alterar css]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[javascrit]]></category>
		<category><![CDATA[JSon]]></category>
		<category><![CDATA[manipular elementos]]></category>
		<category><![CDATA[por que usar jquery]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=139</guid>
		<description><![CDATA[1) jQuery é um FrameWork JavaScript, que utiliza uma DSL simples e objetiva, que ajuda o desenvolvedor a abstrair uma grande quantidade de código que não fazem parte da lógica no seu negocio, como problemas de compatibilidade de navegadores por exemplo.
2) Alem disso tem uma grande capacidade de manipular elementos de uma página com pouco [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1)</strong> jQuery é um FrameWork JavaScript, que utiliza uma <a href="http://www.sagadoprogramador.com.br/?p=169">DSL </a>simples e objetiva, que ajuda o desenvolvedor a abstrair uma grande quantidade de código que não fazem parte da lógica no seu negocio, como problemas de compatibilidade de navegadores por exemplo.</p>
<p><strong>2)</strong> Alem disso tem uma grande capacidade de manipular elementos de uma página com pouco código.<br />
Exemplos:<br />
Deixar um elemento invisível:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#id_do_meu_elemento&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Manipular o css de um elemento:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#id_do_meu_elemento&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;background-color&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;Blue&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Manipular o conteúdo de um elemento:</p>
<pre class="javascript">  $(p).append("inserindo esse conteúdo em todos os parágrafos");</pre>
<p><em>A lista e exemplos que poderia exibir aqui é enorme, mas esse não é o foco no momento <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<p><em><span id="more-139"></span></em></p>
<p><strong>3)</strong> Possibilita uma grande reutilização de código através de plugins.<br />
Exemplo: podemos criar um código para validar campos numéricos, uma função chamada <em>"validaNumeros()"</em>.<br />
Agora vamos supor que você possua um formulário com 8 campos do tipo numérico, ao invés de você replicar esse código no evento <em>"onkeypress"</em> de cada input do seu formulário, você pode transformar esse função em um plugin e no carregar da página, você simplesmente escreve o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.campo_numerico&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">validaNumeros</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #006600; font-style: italic;">//.campo_numerico seria a classe css atribuída aos inputs.</span></pre></div></div>

<p><strong>4)</strong>Atualmente existem uma quantidade enorme de plugins, disponíveis na internet que nos facilita em N tipos de tarefas e que economizam nosso tempo de escrever linhas e linhas de código javascript, muita das vezes para simplesmente fazer uma validação de formulário <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>5)</strong> jQuery tem um ótimo suporte a Ajax.<br />
Exemplos:<br />
Carregar o conteudo de uma url em um determinado div.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#id_do_meu_div&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;pagina_que_eu_quero_carregar.html&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pegar um determinando valor via ajax e atribuir esse valor para um campo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;retornavalor.php&quot;</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#id_do_meu_imput&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong><em>Também temos suporte a JSON</em></strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $.<span style="color: #660066;">getJSON</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;retornavalor.php&quot;</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>objeto<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#id_do_meu_imput&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span>objeto.<span style="color: #660066;">valor</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nesse post, eu listei cinco motivos, mas tenho certeza que quando você começar a utilizar <a href="http://jquery.com/">jQuery</a>, nos seus projetos, você vai encontrar muito mais!</p>
<p>Pretendo escrever mais artigos, detalhando determinadas funcionalidades do <a href="http://jquery.com/">jQuery </a>, mas atualmente já existe bastante conteúdo disponivel sobre o assunto, no próprio site oficial temos uma documentação bem legal com bastante exemplos: <a href="http://docs.jquery.com">http://docs.jquery.com</a>.</p>
<p>Até a próxima!</p>
<p>Iuri Menescal</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/07/5-bons-motivos-para-usar-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
