Realmente necesito ver un debate honesto y reflexivo sobre los méritos del paradigma de diseño de aplicaciones empresariales actualmente aceptado .
No estoy convencido de que los objetos de entidad deberían existir.
Por objetos de entidad me refiero a las cosas típicas que tendemos a construir para nuestras aplicaciones, como "Persona", "Cuenta", "Orden", etc.
Mi filosofía de diseño actual es esta:
- Todo el acceso a la base de datos debe realizarse mediante procedimientos almacenados.
- Siempre que necesite datos, llame a un procedimiento almacenado e itere sobre un SqlDataReader o las filas en una DataTable
(Nota: también he creado aplicaciones empresariales con Java EE, amigos de Java, sustituyan el equivalente por mis ejemplos de .NET)
No soy anti-OO. Escribo muchas clases para diferentes propósitos, solo que no entidades. Admitiré que una gran parte de las clases que escribo son clases auxiliares estáticas.
No estoy construyendo juguetes. Estoy hablando de aplicaciones transaccionales grandes y de alto volumen implementadas en múltiples máquinas. Aplicaciones web, servicios de Windows, servicios web, interacción b2b, lo que sea.
He usado OR Mappers. He escrito algunos. He usado la pila Java EE, CSLA y algunos otros equivalentes. No solo los he usado, sino que desarrollé y mantuve activamente estas aplicaciones en entornos de producción.
He llegado a la conclusión de batalla probado que los objetos son cada entidad en nuestro camino, y nuestra vida sería así mucho más fácil sin ellos.
Considere este simple ejemplo: recibe una llamada de soporte sobre una determinada página de su aplicación que no funciona correctamente, tal vez uno de los campos no se persiste como debería ser. Con mi modelo, el desarrollador asignado para encontrar el problema abre exactamente 3 archivos . Un ASPX, un ASPX.CS y un archivo SQL con el procedimiento almacenado. El problema, que podría ser un parámetro faltante en la llamada al procedimiento almacenado, tarda minutos en resolverse. Pero con cualquier modelo de entidad, invariablemente activará el depurador, comenzará a recorrer el código y puede terminar con 15-20 archivos abiertos en Visual Studio. Cuando bajas al final de la pila, olvidaste dónde empezaste. Solo podemos mantener tantas cosas en nuestras cabezas al mismo tiempo. El software es increíblemente complejo sin agregar capas innecesarias.
La complejidad del desarrollo y la resolución de problemas son solo un lado de mi queja.
Ahora hablemos de escalabilidad.
¿Los desarrolladores se dan cuenta de que cada vez que escriben o modifican cualquier código que interactúa con la base de datos, necesitan hacer un análisis exhaustivo del impacto exacto en la base de datos? Y no solo la copia de desarrollo, me refiero a una imitación de producción, por lo que puede ver que la columna adicional que ahora necesita para su objeto acaba de invalidar el plan de consulta actual y un informe que se ejecutó en 1 segundo ahora tomará 2 minutos, solo porque agregaste una sola columna a la lista de selección? ¿Y resulta que el índice que necesita ahora es tan grande que el DBA tendrá que modificar el diseño físico de sus archivos?
Si deja que las personas se alejen demasiado del almacén de datos físicos con una abstracción, crearán estragos con una aplicación que necesita escalar.
No soy un fanático. Puedo estar convencido si estoy equivocado, y tal vez lo estoy, ya que hay un fuerte impulso hacia Linq hacia Sql, ADO.NET EF, Hibernate, Java EE, etc. Por favor, piense en sus respuestas, si me falta algo Realmente quiero saber qué es y por qué debería cambiar mi forma de pensar.
[Editar]
Parece que esta pregunta vuelve a estar activa de repente, así que ahora que tenemos la nueva función de comentarios, he comentado directamente sobre varias respuestas. Gracias por las respuestas, creo que esta es una discusión saludable.
Probablemente debería haber sido más claro que estoy hablando de aplicaciones empresariales. Realmente no puedo comentar, por ejemplo, un juego que se ejecuta en el escritorio de alguien o una aplicación móvil.
Una cosa que tengo que poner aquí en la parte superior en respuesta a varias respuestas similares: la ortogonalidad y la separación de las preocupaciones a menudo se mencionan como razones para ir entidad / ORM. Los procedimientos almacenados, para mí, son el mejor ejemplo de separación de preocupaciones que se me ocurre. Si no permite cualquier otro acceso a la base de datos, que no sea a través de procedimientos almacenados, en teoría podría rediseñar todo su modelo de datos y no romper ningún código, siempre y cuando mantenga las entradas y salidas de los procedimientos almacenados. Son un ejemplo perfecto de programación por contrato (siempre que evite "seleccionar *" y documente los conjuntos de resultados).
Pregúntele a alguien que ha estado en la industria durante mucho tiempo y que ha trabajado con aplicaciones de larga duración: ¿cuántas capas de aplicaciones y UI han aparecido y desaparecido mientras una base de datos ha sobrevivido? ¿Qué tan difícil es ajustar y refactorizar una base de datos cuando hay 4 o 5 capas de persistencia diferentes que generan SQL para obtener los datos? ¡No puedes cambiar nada! Los ORM o cualquier código que genere SQL bloquean su base de datos en piedra .