Início > Domain Driven Design > Objetos de Valor ou Value Objects famosos VO’s

Objetos de Valor ou Value Objects famosos VO’s

Lapis

Um objeto que representa um aspecto descritivo do domínio sem nenhuma identidade conceitual é chamado de OBJETO DE VALOR. OBJETOS DE VALOR são instanciados para representar elementos do design com os quais só nos preocupamos pelo que eles são, e não quem ou quais são.

Quando uma criança está desenhando, ela está preocupada com a cor do lápis que vai escolher, e pode estar preocupada com a espessura da ponta. Mas se houver dois lápis da mesma cor e de mesmo formato, ela provavelmente não vai se importar em qual deles está utilizando. Se um lápis se perder e for substituído por outro da mesma cor, ela pode recomeçar o seu trabalho sem se preocupar com a troca.

Pergunte a uma criança sobre vários desenhos exibidos em uma escola, e ela rapidamente vai distinguir aqueles que ela fez dos que foram feitos por outros alunos. Os desenhos dos alunos possuem identidades úteis. Mas imagine como seria para uma criança ter que rastrear quais linhas de desenho foram feitas por cada lápis. Desenhar já não seria uma diversão para as crianças.

As cores são um exemplo de OBJETO DE VALOR, assim também são as strings e os números. (Você não se importa com qual “4” ou qual “Q” você tem). Esses exemplos básicos são simples, mas OBJETOS DE VALOR não são necessariamente simples.

Objetos de valor normalmente são transmitidos como parâmetros em menssagens entre objetos. Eles são freqüentemente transitórios, criados por uma operação e em seguida descartados. Objetos de valor são usados como atributos de ENTIDADES (e outros VALORES). VoSample

Figura 1. A vigência é um atributo do contrato e é um objeto de valor.

Os atributos que formam um OBJETO DE VALOR devem formar um todo conceitual. Por exemplo, rua, cidade e código postal não devem ser atributos separados de um objeto Pessoa. Eles fazem parte de um único endereço completo, que torna uma Pessoa mais simples e um OBJETO DE VALOR mais coerente.

VO Coerente

Figura 2. Um OBJETO DE VALOR pode fornecer mais informações sobre uma ENTIDADE. Ele deve ser conceitualmente completo.

 

Endereço é OBJETO DE VALOR? Quem está perguntando?

Em um software para uma empresa de compras via correio, é necessário ter o endereço para a confirmar o cartão de crédito, e para endereçar a encomenda. Mas se um colega que divide o apartamento com uma pessoa também fizer o pedido na mesma empresa, não é importante saber se eles estão na mesma localização. O endereço é um OBJETO DE VALOR.

Em um software para os correios, com o intuito de organizar as rotas de entrega, o país poderia ser formado em uma hierarquia de regiões, cidades, regiões postais e quarteirões, terminando no endereço da pessoa. Esses objetos de endereço receberiam seus códigos postais de seus geradores na hierarquia, e se o serviço de correio decidisse redesignar as regiões postais, todos os endereços daquela faixa entrariam no mesmo barco. Aqui o Endereço é ume ENTIDADE.

Em um software para uma empresa prestadora de serviços de eletricidade, um endereço corresponde a um destino para as linhas e serviços da empresa. Se duas pessoas que dividem o mesmo apartamento telefonassem para solicitar um serviço de conserto na parte elétrica, a empresa precisaria perceber isto.  O Endereço é uma ENTIDADE. Outra opção é que o modelo poderia associar o serviço da prestadora com uma “residência”, uma ENTIDADE com um atributo endereço. Neste caso o Endereço seria um OBJETO DE VALOR.

Este post é um esboço sobre Domain Driven Design.

  1. 03/09/2011 às 10:18 | #1

    Legal. Então, basicamente um objeto de valor é aquele objeto que serve de atributo para outra entidade?

    • Rodrigo
      03/09/2011 às 10:35 | #2

      Sim! Basicamente é isso.

  2. Andre
    03/09/2011 às 10:41 | #3

    Podemos pensar em um VO como uma linha de uma tabela no banco de dados?

    Interessante o post.. =D

    • Rodrigo
      03/09/2011 às 22:03 | #4

      Acho melhor pensar no VO como colunas em uma tabela para um objeto entidade.

      Seguindo o exemplo do post. Para a classe Person teriamos a tabela persons com os seguintes campos: Id, Name, Street, Number e City. As colunas Street, Number e City são utilizadas pela classe Address.

      Utilizando o Hibernate, mapeamos um VO como component. Os campos estão todos na tabela person, porém ao criar o objeto Person o hibernate trata de instanciar também a classe Address. Cria assim um objeto Person com Address porém os campos estão todos em uma única tabela.

  1. Nenhum trackbacks ainda.

Deixe uma resposta

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

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.