Objeto de valor por Martin Fowler

 


Ao programar, muitas vezes acho útil representar coisas como compostos. Uma coordenada 2D consiste em um valor x e um valor y. Uma quantia de dinheiro consiste em um número e uma moeda. Uma faixa de datas consiste em datas de início e fim, que por sua vez podem ser compostos de ano, mês e dia.

Ao fazer isso, encontro a questão de se dois objetos compostos são os mesmos. Se eu tiver dois objetos de ponto que representam as coordenadas cartesianas de (2,3), faz sentido tratá-los como iguais. Objetos que são iguais por causa do valor de suas propriedades, neste caso suas coordenadas x e y, são chamados de objetos de valor.

No entanto, a menos que eu seja cuidadoso ao programar, eu pode não obter esse comportamento nos meus programas.

Digamos que eu quero representar um ponto em JavaScript.

const p1 = {x: 2, y: 3};
const p2 = {x: 2, y: 3};
assert(p1 !== p2);  // não é que eu quero "Não é o que quero"


Infelizmente, esse teste passa. Isso acontece porque o JavaScript testa a igualdade para objetos JS 
olhando para suas referências, ignorando os valores que eles contêm.

Em muitas situações, faz sentido usar referências em vez de valores. Se eu estiver carregando e manipulando
um monte de pedidos de vendas, faz sentido carregar cada pedido em um único lugar. Se eu precisar veri
ficar se o último pedido da Alice está na próxima entrega, posso pegar a referência de memória, ou identidade, 
do pedido da Alice e verificar se essa referência está na lista de pedidos na entrega. 

Para esse teste, não preciso me preocupar com o que está no pedido. 
Da mesma forma, eu poderia confiar em um número de pedido único,
 testando para ver se o número do pedido da Alice está na lista de entregas.

Portanto, acho útil pensar em duas classes de objetos: objetos de valor e objetos de referência, 
dependendo de como os distingo. Preciso garantir que saiba como espero que cada 
objeto lide com a igualdade e programá-los para que se comportem de acordo com minhas expectativas. Como faço isso depende da linguagem de programação com a qual estou trabalhando.

Algumas linguagens tratam todos os dados compostos como valores. Se eu fizer um composto simples em Clojure, fica assim.

Objeto de valor por Martin Fowler

  Ao programar, muitas vezes acho útil representar coisas como compostos. Uma coordenada 2D consiste em um valor x e um valor y. Uma quantia...