<?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; modelo de domínio</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/modelo-de-dominio/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>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>

