¿Hay algún argumento objetivo a favor o en contra del uso de objetos vs ID único como parámetros de método / función? (y miembros de otros objetos?). Especialmente en el contexto de lenguajes estáticamente escritos (C # / Java / Scala)
Ventajas del objeto mismo:
- Más llamadas de typesafe. Con las ID existe el riesgo de un ordenamiento incorrecto de los argumentos. Sin embargo, esto puede mitigarse manteniendo una clase 'mini' para cada clase que solo almacene el ID de esa clase.
- Obtenga una vez de la persistencia, no es necesario volver
- Con ID, si el tipo de identificación cambia, diga int -> long, entonces requeriría un cambio en todos los ámbitos con posibilidad de errores. (Courtsey: https://softwareengineering.stackexchange.com/a/284734/145808 )
Ventajas de usar ID:
- La mayoría de las veces no es necesario el objeto real, solo uniqueid lo haría, por lo que tener ID ahorra tiempo de obtenerlo de la persistencia.
Una combinación de estas técnicas, hasta donde puedo ver, solo tendría contras de ambos y pros de ninguno.
Dado que este es un problema definido de manera concreta, espero que haya respuestas objetivas y no tipos "Creo" o "Me gusta" ... :-).
EDITAR: Contexto sobre la sugerencia de un comentarista. La única restricción es un lenguaje estáticamente tipado. La aplicación es de uso general, aunque también está contenta de obtener respuestas basadas en escenarios de uso específicos.
EDITAR: algo más de contexto. Digamos que tengo un sistema de gestión de libros. Mi modelo es:
Book: { id: Int, isbn: String, donatedBy: Member, borrowedBy: Member }
Member: {id: Int, name: String}
Table- wishlist: { isbn: String, memberId: Int}
Table- borrows: { id: Int, memberId: Int}
Method:
isInWishList( book: Book, member: Member ) vs isInWishList( bookId: Int, memberId: Int)
handleBorrowRequest( memberId: Int, book: Book ){
//the login system doesn't actually get the entire member structure, only the member id. I don't need the full member yet. can run a query to verify that the memberId has less than max allowed books for borrowing.
}
¿Por qué querría mantener solo la identificación y no el miembro completo? Digamos que cuando recibo información sobre el libro, rara vez necesito saber quién lo ha donado o prestado. Obtener su información completa para llenar los campos donado por y prestado por es una exageración.
Por supuesto, estos son solo mis puntos. Estoy seguro de que me faltan cosas, así que quería saber cuáles son los puntos a favor / en contra.
Respuestas:
Dependiendo de su entorno y contexto del problema, la necesidad de ir a la base de datos puede mitigarse y, como resultado (IMO), se pierde el argumento para usar solo las identificaciones.
Por ejemplo, Doctrine2 ORM de PHP tiene
EntityManager::getReference
que produce un proxy con carga lenta para una entidad que usa la identificación proporcionada; No sé cuántos otros ORM hacen eso, pero coincide aproximadamente con la noción de una "mini-clase" que mencionas. Para la mayoría de los propósitos, esta es una entidad totalmente hidratada, por lo que puede pasarla y usarla como cualquier otra.El único caso en el que no lo es es cuando se le da una identificación no válida, y en ese caso, de todos modos, querrá ir a la base de datos para validar; Además, para reducir el costo de obtener entidades, la mayoría de los ORM tienen funcionalidades de almacenamiento en caché (primer y segundo nivel) disponibles de alguna forma.
Una vez que reducimos la necesidad y el costo de ir a la base de datos, nos quedamos en gran medida con los profesionales de usar la entidad como parámetro:
Por supuesto, hay casos en los que uno podría querer pasar solo una identificación: por ejemplo, al cruzar un límite de contexto acotado (en el diseño dirigido por el dominio, por ejemplo). Si consideramos dos contextos delimitados con diferentes nociones de lo que constituye una cuenta (por ejemplo, las relaciones entre finanzas y clientes), entonces no podemos pasar la cuenta del contexto A al contexto B. En cambio, una identificación de la cuenta (en el idioma del dominio) puede ser cruzado
fuente
Para este tipo de preguntas, delego a la solución que mejor comunique mi intención como programador y facilite el trabajo de "Future Greg".
Usar el objeto como argumentos hace que sea más fácil obtener la llamada al método dentro de 6 meses y he olvidado los detalles valientes de esta aplicación. Para construir sobre su "es este libro en el ejemplo de la lista de deseos de esta persona", digamos que el
isInWishList
método realmente solo necesita comparar los ID enteros de libros y miembros. En realidad, este método solo necesita dos datos para hacer su trabajo. Ahora, demos un paso atrás de este método y veamos todo el sistema de software. Dudo que solo requiera una identificación de libro y una identificación de miembro para poder funcionar. De todos modos, extraerá el libro completo y el miembro de la base de datos antes de llamar,isInWishList
ya que es probable que deba hacer algo más que simplemente llamar a este método. Quizás lo hagas, pero la mayoría de las veces tendrás que hacer más.Dado eso, no incurrirá de manera realista en una penalización de rendimiento al buscar y asignar ambos objetos en su totalidad desde la base de datos. Teóricamente necesitará menos llamadas a la base de datos, pero en la práctica encontrará que esto simplemente no es cierto. Si pasa esos Ids como parámetros en la cadena de consulta al servidor, entonces sí, solo tendrá que buscar la lista de deseos de la base de datos. Pero esta es una vista muy estrecha de toda su aplicación. Habrá escenarios cuando realice otras operaciones además de verificar una lista de deseos, por ejemplo, agregar un libro a una lista de deseos. No desea agregar elementos duplicados.
Busca la solución que sea más fácil de entender para un nuevo programador, o tu Yo Futuro, que es pasar los objetos
Book
yMember
. Solo después de encontrar un problema de rendimiento real deberías preocuparte por pasar los Ids.O bien, podríamos recordar que los lenguajes de tipo estático como Java ofrecen una sobrecarga de métodos, por lo que puede tener su pastel y comerlo también:
La verdadera respuesta a esta pregunta es escribir ambos métodos, llamar a la versión de solo entero de la versión fuertemente tipada, y Bob es tu tío.
fuente