Mi respuesta larga y tardía, ni siquiera completa, pero una buena explicación POR QUÉ odio este patrón, opiniones e incluso algunas emociones:
1) versión corta: Active Record crea una " capa fina " de " enlace fuerte " entre la base de datos y el código de la aplicación. Lo que no resuelve problemas lógicos, de ningún tipo, ni problemas en absoluto. En mi humilde opinión, no proporciona NINGÚN VALOR, excepto algo de azúcar sintáctico para el programador (que luego puede usar una "sintaxis de objeto" para acceder a algunos datos, que existen en una base de datos relacional). El esfuerzo por crear algo de comodidad para los programadores debería (en mi humilde opinión ...) invertirse mejor en herramientas de acceso a bases de datos de bajo nivel, por ejemplo, algunas variaciones de hash_map get_record( string id_value, string table_name, string id_column_name="id" )
métodos simples, fáciles, sencillos y similares (por supuesto, los conceptos y la elegancia varían mucho con el idioma utilizado).
2) versión larga: en cualquier proyecto basado en bases de datos en el que tenía el "control conceptual" de las cosas, evitaba la realidad aumentada, y era bueno. Por lo general, construyo una arquitectura en capas (tarde o temprano divide su software en capas, al menos en proyectos de tamaño mediano a grande):
A1) la base de datos en sí, tablas, relaciones, incluso algo de lógica si el DBMS lo permite (MySQL también es adulto ahora)
A2) muy a menudo, hay más que un almacén de datos: sistema de archivos (los blobs en la base de datos no siempre son una buena decisión ...), sistemas heredados (imagínese "cómo" se accederá a ellos, muchas variedades posibles ... pero eso es no es la cuestión...)
B) capa de acceso a la base de datos (en este nivel, los métodos de herramientas, los ayudantes para acceder fácilmente a los datos en la base de datos son muy bienvenidos, pero AR no proporciona ningún valor aquí, excepto algo de azúcar sintáctico)
C) capa de objetos de aplicación: los "objetos de aplicación" a veces son filas simples de una tabla en la base de datos, pero la mayoría de las veces son objetos compuestos de todos modos y tienen una lógica superior adjunta, por lo que invertir tiempo en objetos AR en este nivel es simplemente inútil , una pérdida de tiempo valioso para los codificadores, porque el "valor real", la "lógica superior" de esos objetos debe implementarse sobre los objetos AR, de todos modos, ¡con y sin AR! Y, por ejemplo, ¿por qué querría tener una abstracción de "Objetos de entrada de registro"? El código lógico de la aplicación los escribe, pero ¿debería tener la capacidad de actualizarlos o eliminarlos? suena tonto, y App::Log("I am a log message")
algunas magnitudes son más fáciles de usar quele=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. Y por ejemplo: usar un "Objeto de entrada de registro" en la vista de registro en su aplicación funcionará para 100, 1000 o incluso 10000 líneas de registro, pero tarde o temprano tendrá que optimizar, y apuesto a que en la mayoría de los casos, simplemente lo hará use esa pequeña y hermosa declaración SQL SELECT en la lógica de su aplicación (que rompe totalmente la idea de AR ...), en lugar de envolver esa pequeña declaración en marcos de idea de AR rígidos y fijos con mucho código que lo envuelve y lo oculta. El tiempo que desperdiciaste escribiendo y / o construyendo código AR podría haber sido invertido en una interfaz mucho más inteligente para leer listas de entradas de registro (de muchas, muchas formas, el cielo es el límite). Los programadores deberían atreverse a inventar nuevas abstracciones para realizar su lógica de aplicación que se ajuste a la aplicación deseada, y no volver a implementar estúpidamente patrones tontos., eso suena bien a primera vista!
D) la lógica de la aplicación: implementa la lógica de los objetos que interactúan y la creación, eliminación y lista (!) De los objetos lógicos de la aplicación (NO, esas tareas rara vez deben estar ancladas en los objetos lógicos de la aplicación en sí: ¿la hoja de papel en su escritorio dice ¿Sabes los nombres y las ubicaciones de todas las demás hojas de tu oficina? Olvidas los métodos "estáticos" para enumerar objetos, eso es una tontería, un mal compromiso creado para hacer que la forma humana de pensar se ajuste a [some-not-all-AR-framework-like -] pensamiento AR)
E) la interfaz de usuario - bueno, lo que escribiré en las siguientes líneas es muy, muy, muy subjetivo, pero en mi experiencia, los proyectos que se basan en AR a menudo descuidaron la parte de la interfaz de usuario de una aplicación - se desperdició tiempo en la creación de abstracciones oscuras . Al final, estas aplicaciones hicieron perder mucho tiempo a los codificadores y se sentían como aplicaciones de codificadores para codificadores, con inclinación hacia la tecnología por dentro y por fuera. Los codificadores se sienten bien (trabajo duro finalmente hecho, todo terminado y correcto, según el concepto en papel ...), y los clientes "solo tienen que aprender que tiene que ser así", porque eso es "profesional". ok, lo siento, estoy divagando ;-)
Bueno, es cierto que todo esto es subjetivo, pero es mi experiencia (excluyendo Ruby on Rails, puede ser diferente, y no tengo ninguna experiencia práctica con ese enfoque).
En proyectos pagados, a menudo escuché la demanda de comenzar con la creación de algunos objetos de "registro activo" como un bloque de construcción para la lógica de aplicación de nivel superior. En mi experiencia, esto llamativamente a menudoFue una especie de excusa para que el cliente (una empresa de desarrollo de software en la mayoría de los casos) no tuviera un buen concepto, una gran visión, una descripción general de lo que finalmente debería ser el producto. Esos clientes piensan en marcos rígidos ("en el proyecto hace diez años funcionó bien ..."), pueden desarrollar entidades, pueden definir relaciones de entidades, pueden romper relaciones de datos y definir la lógica básica de la aplicación, pero luego se detienen y entregárselo a usted, y piense que eso es todo lo que necesita ... a menudo carecen de un concepto completo de lógica de aplicación, interfaz de usuario, usabilidad, etc., etc. detalles, y quieren que sigas ese estilo de AR, porque ... bueno, ¿por qué, funcionó en ese proyecto hace años, mantiene a la gente ocupada y en silencio? No lo sé. Pero los "detalles" separar a los hombres de los niños, o ... ¿cómo era el eslogan del anuncio original? ;-)
Después de muchos años (diez años de experiencia en desarrollo activo), cada vez que un cliente menciona un "patrón de registro activo", suena mi alarma. Aprendí a tratar de hacerlos volver a esa fase conceptual esencial , dejar que se lo piensen dos veces, probarlos para mostrar sus debilidades conceptuales o simplemente evitarlos si no son discernidores (al final, ya sabes, un cliente que aún no sabe lo que quiere, tal vez incluso piensa que sabe pero no lo hace, o intenta externalizar el trabajo conceptual a MÍ gratis, me cuesta muchas horas, días, semanas y meses preciosos de mi tiempo, vivir es demasiado corto ...).
Entonces, finalmente: ESTO TODO es la razón por la que odio ese tonto "patrón de registro activo", y lo hago y lo evitaré siempre que sea posible.
EDITAR : Incluso llamaría a esto sin patrón. No resuelve ningún problema (los patrones no están destinados a crear azúcar sintáctico). Crea muchos problemas: la raíz de todos sus problemas (mencionados en muchas respuestas aquí ...) es que simplemente esconde el viejo SQL bien desarrollado y poderoso detrás de una interfaz que, según la definición de patrones, es extremadamente limitada.
¡Este patrón reemplaza la flexibilidad con azúcar sintáctico!
Piénselo, ¿qué problema le resuelve la RA?