Objeto de Valor

29/06/2010 at 10:14 2 comentários

Para modelar o domínio geralmente lançamos mão das entidades, que são objetos com significado dentro do domínio e que tem identidade própria. Porém, existem muitos outros tipos de objetos que não vão precisar ter identidade própria mas que tem informações que nos ajudam a descrever o domínio e, na maioria das vezes, serão utilizados para compor as entidades. Chamamos esses tipos de objetos de Objeto de Valor, o que ajuda a diferenciá-los das entidades, serviços e repositórios.

O exemplo mais clássico de objeto de valor é moeda, para o domínio da maioria das aplicações não faz sentido diferenciar duas notas de 10 reais. Neste caso, podemos representar esse objeto como um Objeto de Valor, pois não necessitamos que ele tenha uma identidade. Se pensarmos em um sistema para a Casa da Moeda, esse objeto passa a ser uma Entidade já que possue uma identidade própria no domínio.

No começo da modelagem do domínio, aqui na empresa onde trabalho, não conseguiamos aplicar o pattern em nenhuma classe. Depois descobrimos que uma boa analogia para Objeto de Valor seria compará-los aos tipos utilizados em diversas linguagens de programação, como inteiro, string, etc. Desse modo passamos a classificar alguns tipos complexos das classes (endereço, telefone, documento, etc.) como Objeto de Valor. Esses objetos compõem as entidades mas não necessitam ter uma identidade própria (em alguns casos cometiamos o erro de colocar um Id).

Agora vem um dúvida importante, como representar um Objeto de Valor em uma tabela do banco de dados? Para responder a essa questão, podemos pedir um ajudinha ao Martin Fowler que publicou em seu site um padrão chamado Embebbed Value que descreve como fazer o mapeamento objeto relacional:

No exemplo acima temos uma entidade chamada Employment que é composta das propriedades id, person, period e salary. A propriedade salary é um objeto da classe Money, que é composta pelas propriedades Amount e Currency. Como Money não vai ser representada por nenhuma tabela no banco de dados, temos que mapear as suas propriedades para a tabela da entidade Employment: salaryAmount e salaryCurrency.

Espero ter ajudado a colocar uma luz sobre esse importante, porém pouco compreendido,  pattern chamado Objeto de Valor que é muito útil na modelagem de domínios.

[]’s
Eduardo Ernandes da Silva
Arquiteto de Sistemas

Anúncios

Entry filed under: Arquitetura de software, Domain-Driven Design. Tags: , , , .

Guia de arquitetura n-camadas DDD .NET 4 Implemente inversão de controle (IoC) com Castle Windsor

2 Comentários Add your own

  • 1. Andre Frasson  |  06/07/2010 às 16:21

    Bacana! Uma explicação bem simples para quem ainda se confunde.
    Mas tenho uma questão para você, mais voltada para um problema mais diretamente relacionado à tecnologia .Net em especifico o EFv4. Como fica a modelagem de um VO que exista como uma tabela própria no DB, com relacionamentos e primary key, dentro do modelo conceitual?
    Uma vez que o Entity Framework exige que o mapeamento reflita no modelo conceitual por meio de Properties e AssossiationSet todas as colunas e relacionamentos existentes no modelo físico (DB).
    Abraço

    Responder
    • 2. eernandes  |  07/07/2010 às 9:55

      Andre, a um ano atrás tentamos utilizar EF para fazer o mapeamento objeto-relacional e nos deparamos muito com esse tipo de problema. Infelizmente, não conseguimos implementar uma solução que fosse viável utilizando o EF. Sempre que necessitávamos de alguma customização do mapeamento, a implementação era um parto e, depois, se alguém atualizasse as tabelas via IDE do Visual Studio perdiamos essas customizações. Esse foi um dos motivos que nos levaram a abandonar o EF em favor do NHibernate. Aqui utilizamos uma biblioteca que trabalha sobre o NHibernate chamada Fluent NHibernate. Essa biblioteca permite customizar o mapeamento via código. Algo muito mais natural para os nossos desenvolvedores.

      []’s
      Eduardo Ernandes da Silva

      Responder

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Arquivos

Feeds

Calendário

junho 2010
D S T Q Q S S
« maio   ago »
 12345
6789101112
13141516171819
20212223242526
27282930  

%d blogueiros gostam disto: