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 manipulandoum monte de pedidos de vendas, faz sentido carregar cada pedido em um único lugar. Se eu precisar verificar 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.