<?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>Mon, 01 Mar 2010 04:24:36 +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>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>

		<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>8</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>1</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.<span id="more-317"></span></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><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"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td 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></td></tr></table></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"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td 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></td></tr></table></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"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td 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></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td 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></td></tr></table></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"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td 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></td></tr></table></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"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td 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></td></tr></table></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>
<p><b>1)</b> 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><span id="more-139"></span></p>
<p><b>2)</b> 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"><table><tr><td class="line_numbers"><pre>1
</pre></td><td 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></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td 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></td></tr></table></div>

<p>Manipular o conteúdo de um elemento:</p>
<pre name="code" class="javascript">
  $(p).append("inserindo esse conteúdo em todos os parágrafos");
</pre>
<p><i>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' />  </i></p>
</p>
<p><b>3)</b> 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 <i>"validaNumeros()"</i>.<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 <i>"onkeypress"</i> 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"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td 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></td></tr></table></div>

</p>
<p><b>4)</b>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><b>5)</b> 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"><table><tr><td class="line_numbers"><pre>1
</pre></td><td 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></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td 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></td></tr></table></div>

<p><b><i>Também temos suporte a JSON</i></b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td 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></td></tr></table></div>

</p>
<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!<br />
<br />
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>
		<item>
		<title>Aprenda Ruby parte V &#8211; Métodos</title>
		<link>http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 17:50:46 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[Tutorial Ruby]]></category>

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

Estrutura
O Método em Ruby é declarado da seguinte forma:

1
2
3
def nomeDoMetodo
   #código
end

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

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

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

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

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

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

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

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

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> teste<span style="color:#006600; font-weight:bold;">&#40;</span>parametro=<span style="color:#996600;">&quot;Não foi passado nenhum valor&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    parametro
  <span style="color:#9966CC; font-weight:bold;">end</span>
  teste<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;novo valor&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">=&gt;</span> novo valor
  teste
  <span style="color:#006600; font-weight:bold;">=&gt;</span> Não foi passado nehum valor</pre></td></tr></table></div>

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

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

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

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

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

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

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

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

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel = variavel<span style="color:#006600; font-weight:bold;">+</span><span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#pode ser assim também</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#Também podemos fazer assim</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel.<span style="color:#9900CC;">concat</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; quatro cinco seis&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#ou melho ainda, esse é muito maneiro, o código fica claro!</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
<span style="color:#008000; font-style:italic;">#alem de claro, esse tipo de atribuição é mais rápido.</span></pre></td></tr></table></div>

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

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

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

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

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

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

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

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> n<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

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

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

<p>Agora em Ruby:</p>

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

<p>Outros exemplos:</p>

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

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

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

<p>Bom, por enquanto é só!<br />
Acho que agora as coisas estão ficando mais com a cara do Ruby, pois deixamos de lado o bla bla e passamos para a pratica, algo mais produtivo, talvez você ainda não tenha notado, mas nesse post conseguimos trabalhar bastante um otimo conceito do Ruby que são os blocos. A intenção daqui para frente é utilizar exemplos de códigos, para expressar os conceitos das funcionalidades que essa maravilhosa linguagem nos proporciona <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
<p>Iuri Menescal</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
