<?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; OO</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/oo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 22 Sep 2011 04:20:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<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[c#]]></category>
		<category><![CDATA[OO]]></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>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: #6666cc; font-weight: bold;">class</span> Funcionario
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Nome <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Cargo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">double</span> Salario <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> Ativo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;">class</span> Empresa
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> List Funcionarios <span style="color: #008000;">&#123;</span>get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#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: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">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: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario sergio <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">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: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario iuri <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">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: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario luciano <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">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: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario eduardo <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">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: #008000;">&#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: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>iuri<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>luciano<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>sergio<span style="color: #008000;">&#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: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> List Funcionarios <span style="color: #008000;">&#123;</span>get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Contrata<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
 <span style="color: #008000;">&#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: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>eduardo<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>iuri<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>luciano<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>sergio<span style="color: #008000;">&#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: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#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: #008000;">.</span><span style="color: #0000FF;">Inativar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#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: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> List Funcionarios<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Contrata<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Demite<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      funcionario<span style="color: #008000;">.</span><span style="color: #0000FF;">Inativar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#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: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#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: #008000;">&#125;</span><span style="color: #008000;">;</span>
  var nomesQueComecamComS <span style="color: #008000;">=</span> nomes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>nome <span style="color: #008000;">=&gt;</span> nome<span style="color: #008000;">.</span><span style="color: #0000FF;">StartsWith</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;S&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var nomesQueContemMaria <span style="color: #008000;">=</span> nomes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>nome <span style="color: #008000;">=&gt;</span> nome<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;maria&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> cities <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#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: #008000;">&#125;</span><span style="color: #008000;">;</span>
  IEnumerable places <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">from</span> city <span style="color: #0600FF; font-weight: bold;">in</span> cities
                             <span style="color: #0600FF; font-weight: bold;">where</span> city<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&gt;</span>
                             orderby city descending
                             <span style="color: #0600FF; font-weight: bold;">select</span> 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: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> List Funcionarios <span style="color: #008000;">&#123;</span>get<span style="color: #008000;">;</span>set<span style="color: #008000;">;</span><span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#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: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">;</span>
  var salarioMedido <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0000FF;">Average</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Salario</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>salarioMedido<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var funcionariosAtivos <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var desenvolvedores <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Cargo</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Equals</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;desenvolvedor&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var GerenteComSalarioMaior2000 <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Cargo</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Equals</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Gerente&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&amp;</span>
                                                                            f<span style="color: #008000;">.</span><span style="color: #0000FF;">Salario</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">2000</span><span style="color: #008000;">&#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: #008000;">.</span><span style="color: #0000FF;">ObterSalarioMedio</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#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: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#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; font-weight: bold;">public</span> IEnumerablel ObterFuncionariosAtivos<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
     <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008000;">&#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: #6666cc; font-weight: bold;">class</span> Funcionario
  <span style="color: #008000;">&#123;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Nome <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Cargo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">double</span> Salario <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> Ativo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> EstahAtivo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#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; font-weight: bold;">public</span> IEnumerable ObterFuncionariosAtivos<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">EstahAtivo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008000;">&#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: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> List Funcionarios<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Contrata<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Demite<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      funcionario<span style="color: #008000;">.</span><span style="color: #0000FF;">Inativar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>     
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">public</span> IEnumerablel ObterFuncionariosAtivos<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>  
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">double</span> ObterSalarioMedio<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
         <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Average</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Salario</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#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>11</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</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 &#8220;dificuldades operacionais&#8221; 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>&#8220;As aplicações que criamos foram constuidas da melhor maneira possível?&#8221;</li>
<li>&#8220;Meu código está orientado a objetos, ou é apenas procedural Java?&#8221;</li>
<li>&#8220;Como eu identifico o que deve e o que nao deve ser uma classe no meu sistema?&#8221;</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 &#8220;senso critico&#8221; 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&#8217;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 &#8220;desculpas&#8221; que podemos utilizar para justificar esse tipo de construção, mas dentre elas destacam-se as classicas:<strong> &#8220;nao tenho tempo&#8221;</strong> e<strong> &#8220;o cronograma está apertado&#8221;</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 &#8220;principal&#8221;:</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: &#8220;Nosso modelo de objetos não deve ser uma cópia do modelo de dados.&#8221; Acho que isso a maioria das pessoas já sabia, mas o que tenho visto por aí em projetos [...]]]></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: &#8220;Nosso modelo de objetos não deve ser uma cópia do modelo de dados.&#8221;</p>
<p>Acho que isso a maioria das pessoas já sabia, mas o que tenho visto por aí em projetos que trabalhei é exatamente o contrário: um modelo de objetos exatamente igual ao modelo de dados.</p>
<p>Por que ainda utilizamos uma abordagem assim?<br />
Em minha opinião, o principal problema é que muitos desenvolvedores ainda não entenderam corretamente Orientação a Objetos. A prova disso são os sistemas escritos de forma totalmente procedural.</p>
<p>Tentarei exemplificar algumas destas diferenças. Este exemplo é uma adaptação de um problema real que eu presenciei. Vamos imaginar um sistema de cursos onde nós temos as tabelas:</p>
<p><span id="more-317"></span></p>
<p><strong>Curso</strong><br />
id<br />
nome<br />
data Inicio<br />
data Fim<br />
idInstrutor</p>
<p><strong>Instrutor</strong><br />
id<br />
nome</p>
<p>Esta é uma simplificação, mas vai ajudar a explorar o problema.<br />
A abordagem comum que eu tenho visto é ter um modelo de objetos que represente as tabelas do banco de dados, pois é necessário persistir as informações destes objetos. Para persistência, em java podemos utilizar o <a title="Hibernate/JPA" href="https://www.hibernate.org/397.html" target="_blank">Hibernate/JPA</a>, em <a title="Rails" href="http://www.rubyonrails.pro.br/" target="_blank"> Rails </a>podemos utilizar <a title="o framework Active Record" href="http://en.wikipedia.org/wiki/ActiveRecord_(Rails)" target="_blank">o framework Active Record</a> (que aliás, te induz a fazer exatamente o que eu descrevi acima) e em C# podemos utilizar o <a title="NHibernate" href="https://www.hibernate.org/343.html" target="_blank">NHibernate</a>.</p>
<p>Vamos ver algum código:</p>

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

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

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

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

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

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

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

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

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

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

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

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

