villano para mapeo framework ejemplos datos orm oop behavior

mapeo - orm para c#



¿Los ORM son contraproducentes para el diseño OO? (9)

En OOD, se dice que el diseño de un objeto se caracteriza por su identidad y comportamiento.

Habiendo utilizado ORM en el pasado, el objetivo principal, en mi opinión, gira en torno a la capacidad de almacenar / recuperar datos. Es decir, los objetos ORM no se diseñan por comportamiento, sino más bien por datos (es decir, tablas de bases de datos). Caso y punto: muchas herramientas ORM vienen con un generador de punto a tabla de base de datos y clics.

Si los objetos ya no se caracterizan por el comportamiento, en mi opinión, enturbiará la identidad y la responsabilidad de los objetos. Posteriormente, si los objetos no están definidos por una responsabilidad, esto podría ayudar a tener clases estrechamente acopladas y un diseño general deficiente.

Además, creo que en una configuración de aplicación, te dirigirías hacia problemas de escalabilidad.

Entonces, mi pregunta es, ¿crees que los ORM son contraproducentes para el diseño OO? Quizás la pregunta subyacente sería si son o no contraproducentes para el desarrollo de aplicaciones.


Caso y punto: muchas herramientas OR / M vienen con un generador de objetos de punto a tabla de datos y clics.

Sí, pero hay cantidades iguales o mayores de soluciones ORM que se basan en sus objetos y generan las tablas de la base de datos.

Si comienzas con datos y luego tragas forzando objetos autogenerados para que tengan comportamientos de objetos, sí, podrías confundirte ... Pero si comienzas con el objeto y generas la base de datos como una capa secundaria, terminas con algo mucho más útil, incluso si la base de datos no está tan optimizada como podría ser.

Si está buscando una excusa para no usar ORM, no lo use. Personalmente encuentro que me ahorra miles de líneas de código haciendo cosas triviales que el ORM hace simplemente genial.


Si los objetos ya no se caracterizan por el comportamiento, en mi opinión, enturbiará la identidad y la responsabilidad de los objetos.

Los objetos en cuestión tienen lectura y escritura de base de datos como comportamiento definido. Simplemente no tienen mucho más que eso.

La realidad de la situación es bastante simple: la orientación del objeto no es un fin en sí misma, es un medio para un fin, pero en algunos casos simplemente no hace mucho para mejorar el resultado final. Una gran cantidad de usos para ORM son un buen ejemplo: son miles de variaciones de las aplicaciones CRUD que no necesitan ni desean asociar ningún comportamiento real con la mayoría de los datos que procesan.

La aplicación como un todo gana flexibilidad al no codificar mucho (si existe) del "comportamiento" de los datos en el código de la aplicación en sí. En cambio, a menudo están mejor con eso como datos "tontos", que simplemente pasan de la interfaz de usuario a la base de datos y vuelven a los informes y demás. Con un poco de cuidado, esto puede permitir un nivel sustancial de personalización del usuario que es casi imposible de igualar cuando intenta tratar los datos como objetos reales con un comportamiento real codificado en la aplicación propiamente dicha.

Por supuesto, hay otro lado de eso: puede hacer que sea sustancialmente más difícil garantizar la integridad de los datos o que los datos solo se usen adecuadamente: he visto código que accidentalmente usaba el campo incorrecto en un cálculo, por lo que estaban promediando los números de oficina en lugar de los tamaños de oficina en pies cuadrados. Ambos eran campos definidos por el usuario que simplemente decían que los contenidos deberían ser numéricos. La aplicación no tenía manera de saber que una tenía sentido perfecto, y la otra no tenía ningún sentido.


Como con la mayoría de las preguntas de este tipo, depende de tu uso.

Las principales formas de usar herramientas ORM son:

  1. Defina el objeto por datos, use este objeto a través del código de la aplicación (MALO MALO MALO)
  2. Use objetos ORM solo para acceso a datos, defina sus propios objetos con una capa interpretativa entre (Mucho Mejor)

Si comienza desde cero, un tercer método es diseñar datos a partir de su modelo de objetos. (Mejor si es posible)

Así que sí, si defines el objeto por las tablas de datos y lo usas a lo largo de tu código, no estarás usando OOD e introduciendo problemas de diseño y mantenimiento muy pobres.

Pero si solo usa los objetos ORM como una herramienta de acceso a datos (reemplaza a ADO), entonces puede usar buenos OOD y ORM juntos. Claro, se requiere más código para construir la capa de interpretación, pero permite prácticas mucho mejores, sin mucho más código requerido que el antiguo código ADO.


En los sistemas donde separa sus datos del comportamiento, es absolutamente contraproducente.

Los sistemas Orm tienden a analizar las tablas de bases de datos existentes para crear "Objetos" estúpidos en su idioma. Estas cosas no son verdaderos objetos porque no contienen un comportamiento comercial, pero como las personas tienen estas estructuras, tienden a querer usarlas.

Ruby on Rails (Active Record) realmente une tus datos a una clase "Live"; esto es mucho mejor.

Nunca había visto un sistema que realmente me gustara: ActiveRecord está cerca, pero tiene algunas suposiciones rubiescas con las que no me siento cómodo, el más importante es el de proporcionar predeterminadores y receptores públicos por defecto.

Pero para resumir: he visto muchos buenos programadores de OO escribir código dañado debido a ORM.


Estoy respondiendo esto desde una perspectiva de C #, ya que es donde hago la mayor parte de mi desarrollo ...

Entiendo tu punto, pero creo que con la capacidad de crear clases parciales puedes crear objetos con el comportamiento que quieras y aún así obtener el poder que un OR / M trae a la mesa para la recuperación de datos.


No creo que los ORM sean contraproducentes para el diseño de OO, a menos que desee insistir en que la persistencia es una parte integral del comportamiento.

Yo separaría la persistencia del comportamiento empresarial. Sin duda puede agregar el comportamiento de busines a cualquier objeto que un ORM genere para usted.


Por lo que he visto de los ORM, no van en contra de los principios de OO, de hecho, son bastante ortogonales. (para obtener información: bastante nuevo para la tecnología ORM, perspectiva de Java)

Mi razonamiento es que los ORM te ayudan a almacenar los miembros de datos de una clase en una tienda persistente sin tener que vincularse a esa tienda y escribir ese código tú mismo. Aún decide sobre los miembros de datos y escribe los comportamientos de una clase.

Supongo que podrías abusar de los ORM para romper los principios OO, pero luego puedes hacer eso con cualquier cosa. Puede usar herramientas para crear clases de datos esqueléticos a partir de una tabla preexistente, pero aún así crearía métodos, etc.


También he visto sistemas ORM que tienden a ir desde el modelo OO y generar la base de datos.

En todo caso, diría que los ORM son más tendenciosos para producir un buen código OO que para producir un buen código de base de datos.

Idealmente, un ORM exitoso une los dos mundos y el código de su aplicación sería excelente desde una perspectiva de implementación y resolución de problemas de dominio comercial y su código y modelo de base de datos sería genial desde una perspectiva de normalización, rendimiento y ETL / informes / replicación.


Existe un desajuste de impedancia bien conocido y a menudo ignorado entre los requisitos de un buen diseño de la base de datos y los requisitos de un buen diseño de OO. La mayoría de los desarrolladores (en mi experiencia) o no entienden este desajuste de impedancia o no les importa. Dado que es más común comenzar con la base de datos y generar los objetos a partir de ella (en lugar de hacerlo a la inversa), entonces sí, terminará con objetos que son geniales como capa de persistencia pero subóptimos desde la perspectiva de OO. (Lo contrario, generar la base de datos a partir del modelo de objetos, me da ganas de apuñalar mis ojos).

¿Por qué no son óptimos desde la perspectiva de OO? Porque los objetos producidos por un ORM no son objetos comerciales, incluso con clases parciales y similares. Comportamiento del modelo de objetos comerciales. Persistencia del modelo de objetos ORM. No voy a pasar diez párrafos argumentando esta distinción. Es algo que Rocky Lhotka ha cubierto bastante bien en sus libros sobre Business Objects y su marco CSLA . Ya sea que te guste o utilices CSLA o no, creo que sus argumentos son sólidos.