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.

Nenhum comentário:

Postar um comentário

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...