<?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; boas práticas</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/boas-praticas/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>Esse código que acabei de escrever está bom?</title>
		<link>http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 05:39:28 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[boas práticas]]></category>

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

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

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

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

<p>É isso ai gente! Nossa aplicação está pronta e funcionando. Porém eu faço a vocês duas perguntas:<br />
Este codigo está bom? Porque?</p>
<p>No proximo post, vamos analisar este codigo responder a estas perguntas. Porém você que leu este post nao precisa esperar, pode escrever seu comentario aqui respondendo esta pergunta.</p>
<p>Abraços,<br />
Sergio Junior</p>
<p>Confira a sequencia deste post <a href="http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/">aqui.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Equipes novas, Manias antigas&#8230;</title>
		<link>http://www.sagadoprogramador.com.br/2009/02/equipes-novas-manias-antigas/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/02/equipes-novas-manias-antigas/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 03:35:24 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[trabalho]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[codigo expressivo]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[modelo anemico]]></category>
		<category><![CDATA[modelo rico]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=161</guid>
		<description><![CDATA[Impressionante a reação que as expressões  "código expressivo" e "modelo de domínio rico" provocam na maioria das pessoas. Caretas e narizes torcidos são as reações mais comuns, além é claro daqueles olhares atravessados disparados contra você, nestas horas você se sente um ET.
Durante muito tempo trabalhei com Delphi, e nesta comunidade de desenvolvedores quando [...]]]></description>
			<content:encoded><![CDATA[<p>Impressionante a reação que as expressões <a href="http://blog.fragmental.com.br/2007/12/28/expressividade-no-codigo"> "código expressivo"</a> e <a href="http://martinfowler.com/eaaCatalog/domainModel.html">"modelo de domínio rico"</a> provocam na maioria das pessoas. Caretas e narizes torcidos são as reações mais comuns, além é claro daqueles olhares atravessados disparados contra você, nestas horas você se sente um ET.<span id="more-161"></span></p>
<p>Durante muito tempo trabalhei com <a href="http://pt.wikipedia.org/wiki/Delphi_(linguagem_de_programa%C3%A7%C3%A3o)">Delphi</a>, e nesta comunidade de desenvolvedores quando se fala em "código expressivo" e "modelo de domínio" esse tipo de reação pode até ser considerado comum. Uma vez que a grande maioria destes desenvolvedores está infectada pela filosofia <a href="http://pt.wikipedia.org/wiki/Rapid_Application_Development">RAD</a>. Eu pensava que quando começasse a trabalhar com Java esse tipo de reação fosse diminuir. Mas não é o que estou notando. Pelo menos no ambiente em que estou inserido, as caretas e narizes torcidos estão presentes. Nesta semana mesmo, sugeri a um colega uma alteração em um nome de método para algo mais expressivo, e ouvi o seguinte:</p>
<p style="text-align: center;"><em>"Ih cara ta bom assim mesmo. Deixa que, qualquer coisa depois a gente mexe.</em>"</p>
<p>Já há alguns meses atrás, entrei numa discussão sobre <a href="http://www.martinfowler.com/bliki/AnemicDomainModel.html">modelos anêmicos</a> X modelos ricos, onde outro colega tentou de todo jeito, me dizer que modelo rico é muito bonito no meio acadêmico, mas que na prática isso fica inviável. Ainda tive que ouvir que:</p>
<p style="text-align: center;"><em>"É desse jeito que o pessoal de Java costuma desenvolver. Todo mundo faz assim". </em></p>
<p>Fiquei pensando, porque todos nós não passamos a comer carne de cachorro? Afinal a China é o país <a href="http://www.benderblog.com/lista-de-paises-mais-populosos-do-mundo/">mais populoso do mundo</a>, e se lá comer carne de cachorro é normal, porque pra gente não é?</p>
<p>A discussão ficou mais quente quando eu disse que aquilo não passava de "procedural Java", e que ele tirava o direito do objeto fazer o básico, que é controlar seu próprio estado. Só depois disso ele considerou pensar sobre modelos ricos, mas depois desse dia ele nunca mais tocou nesse assunto.</p>
<p>Uma coisa que eu tenho visto muito são as pessoas dizerem assim:</p>
<p style="text-align: center;"><em>"Estou num projeto sinistro agora, a gente ta usando de tudo JPA, EJB3, JMS, Lucene, Drools ..."</em></p>
<p>Mas não vejo estas pessoas preocupadas em construir um código bem escrito e expressivo, em pensar num modelo de domínio, em fazer um refactoring constante e em aplicarem as boas práticas de OO. Às vezes me sinto como se aquelas pessoas que trabalhavam com Delphi ao meu redor, todas estivessem trabalhando com Java agora. Às vezes cansa ser o diferente, eu sempre penso em deixar pra lá, ficar quieto e evitar discussões, mas eu não consigo. Não consigo porque eu acredito nisso tudo, e sinto a necessidade de transmitir essa mensagem.</p>
<p>Por isso eu peço a vocês dêem uma chance as boas práticas. Não peço por mim, mas acredito que <a href="http://martinfowler.com/aboutMe.html">Martin Fowler</a>, <a href="http://www.domainlanguage.com/about/ericevans.html">Eric Evans</a> e muitos outros "famosos" merecem crédito.<br />
<br/><br />
Serginho.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/02/equipes-novas-manias-antigas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
