sexta-feira, 22 de abril de 2011

Implementando um Objeto de Valor no PHP

Hoje vou falar sobre Objeto de Valor (Value Objects) e demonstrar a implementação de um objeto de valor no PHP. Objetos de valor? Vamos a uma definição:

Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma característica de alguma coisa.

No livro Domain Driven Design de Eric Evans ele faz uma analogia bem interessante que é:

Quando uma criança está desenhando, ela está preocupada com a cor da caneta que vai escolher, e pode estar preocupada com a espessura da ponta. Mas se houver duas canetas da mesma cor e de mesmo formato, ela provavelmente não vai se importar em qual delas está utilizando. Se uma caneta se perder e for substituída por outra da mesma cor tirada de uma nova embalagem, ela pode recomeçar o seu trabalho sem se preocupar com a troca.

Objetos de valor representam um aspecto descritivo do domínio, não sendo necessária nenhuma identidade conceitual. Uma instancia de um objeto de valor que tenha as mesmas características de uma segunda instância do mesmo objeto não devem ser diferenciadas por identidades únicas, pois, afinal o que importa são suas características. Um exemplo simples de objetos de valor, são as cores, não importa onde você utilize uma instancia de Vermelho em seu domínio, o vermelho será sempre vermelho, diferente de uma entidade onde, por mais que tenham características parecidas, sua identidade é diferente e importa para o domínio.

Deixando um pouco analogias de lado vamos pensar em uma implementação real, imagine um caso em que o preço de um produto em uma loja virtual sofra diversos tipos de alteração dependendo do seu contexto, e ainda que é necessário expressar discontos e coisas do tipo, para isso um preço não poderia ser simplesmente um atributo do tipo priomitivo de um produto, ou seja, ele precisa agregar valor e então criariamos um objeto de valor para ele, conforme exemplo a seguir: