viernes, 13 de febrero de 2009

Igualdad de Objetos II

Algo que me olvidé de comentar en el post sobre Igualdad de Objetos, es que como el mensaje #= debe devolver true si los dos objetos representan el mismo ente su implementación siempre será verificar si aquellos colaboradores internos que representan la identidad del ente en el objetos receptor del mensaje es igual a los colaboradores internos que representan la identidad en el objeto pasado como parámetro. En pocas palabra, asegurar que ambos "identifican" al mismo ente.
En el caso de Date, esto será verificar que el año, mes y día sean iguales (si esa es la representación que se decidió usar para Date).
Una consecuencia interesante en identificar que colaboradores internos representan la identidad del ente es que esto se podría hacer automáticamente lo mismo que una implementación default del mensajes hash, como también asegurar que dichos colaboradores no pueden cambiar.

3 comentarios:

Unknown dijo...

¿Qué cosa se haría automáticamente Hernán? ¿La identificación de los colaboradores internos que participan en la comparación, o la comparación de los colaboradores internos una vez que estos ya fueron identificados (y, por ejemplo, la identificación se hizo declarándo de alguna forma el conjunto de colaboradores internos a considerar)?

Hernan Wilkinson dijo...

Si sabemos que colaboradores internos son los que representan la identidad del ente, saber si dos objetos representan el mismo ente es comparar dicho colaboradores, eso es lo que podría hacer automáticamente (o sea, definiendo #= en Object para que lo haga). Lo mismo se podría hacer con el mensaje #hash.
La identificación de los colaboradores lo debe hacer el programador.
En el post "Tip 2: Clearly identify what represents the identity of an object" había comentado que se podría definir la identidad de manera explicita, haciendo por ejemplo:
Object subclass: #Point
identityDefinedBy: 'x y'
instanceVariableNames: ''
... etc.
De esa manera se sabe que colaboradores internos representan la identidad del ente y por lo tanto se puede hace una comparación genérica.

Anónimo dijo...

Descubrí tu blog hace poco y la verdad no tiene desperdicio.
En relación a esto, lo que describiste acá y en el post anterior es lo que Evans y Fowler denominan "Value Objects". Objetos que son iguales si sus atributos son iguales, no si su identidad es la misma (en ese caso serían las "Entities", por ejemplo, Customer.)