<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Saga do programador &#187; c#</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Wed, 18 Aug 2010 13:34:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Idéias sobre encapsulamento, linq e delegates em C#</title>
		<link>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/#comments</comments>
		<pubDate>Wed, 05 May 2010 15:21:35 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[boas práticas]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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