Valor vs. Identidad
Siguiendo con el intrépido viaje al mundo de la Programación Orientada a Objetos (a.k.a. POO) hoy trataremos las diferencias entre dos de los patrones de objetos más usados: Value Object y Entity.
Lo que importa es el interior
Los objetos pertenecientes al patrón Value Object son aquellos objetos que se distinguen unos de otros por su contenido y no por su identidad, ya que no cuentan con identificadores. Dos objetos producto de este patrón serán iguales siempre que su contenido sea el mismo.
Son objetos cuyas propiedades son inmutables, no varían, y en caso de querer variarlas lo más correcto sería devolver otro objeto diferente.
Estos objetos pueden reconocerse porque tienen variable de estado y nunca cambian, no producen ninguna alteración. Los Value Object están basados en métodos de tipo query, lo que les hace perfectos para la programación funcional.
Una última característica de los Value Object es que necesitan vivir dentro de un contexto. Esto tiene sentido si pensamos que cada vez que se opera se produce uno nuevo. Pensemos en los strings, todos los métodos que le aplico me devuelven un string nuevo que debo almacenar en alguna variable si quiero seguir trabajando con él, ya que el string original no se modifica.
Un ejemplo claro, y humano, de Value Object es el dinero. Un billete de 5 euros y otro billete de 5 euros, aunque tengan un número de serie diferente, tienen el mismo valor y representan lo mismo, son intercambiables el uno por el otro.
Show me your ID, please
Por otra parte, los Entity son objetos que se distinguen unos de otros por su identificador, su ID.
Sus atributos pueden cambiar con el paso del tiempo, de hecho, veíamos que los Value Object se basaban en queries, mientras que los Entities se basan en acciones que producen efectos. Lo que jamás debe cambiar es su identidad, ya que generalmente este hará referencia a su almacenamiento en la base de datos.
Diferencias
Comparación
Value Object → Valor (Serán iguales si contienen lo mismo)
Entity → ID (Nunca serán iguales aunque su contenido sea el mismo)
Cambio en las variables de estado
Value Object → NO
Entity → SÍ
Tipo de métodos
Value Object → Query
Entity → Acción