Puede que no sea la mejor idea considerar Rails como un elemento básico del patrón de diseño MVC. Dicho marco se creó con algunas deficiencias inherentes (lo elaboré un poco en una publicación diferente ) y la comunidad recién ahora ha comenzado a abordar las consecuencias. Podría considerar el desarrollo de DataMapper2 como el primer paso importante.
Alguna teoria
Las personas que dan ese consejo parecen estar afectadas por una idea errónea bastante común. Permítanme comenzar por aclararlo: el modelo, en el patrón de diseño moderno de MVC, NO es una clase u objeto. El modelo es una capa.
La idea central detrás del patrón MVC es la separación de preocupaciones y el primer paso es la división entre la capa de presentación y las capas del modelo. Al igual que la capa de presentación se divide en controladores (instancias, responsables de manejar la entrada del usuario), vistas (instancias, responsables de la lógica de la interfaz de usuario) y plantillas / diseños, también lo hace la capa de modelo.
Las partes principales que componen la capa del modelo son:
Objetos de dominio
También conocidas como entidades de dominio, objetos de negocio u objetos de modelo (no me gusta ese último nombre porque solo aumenta la confusión). Estas estructuras son lo que la gente suele llamar erróneamente "modelos". Son responsables de contener las reglas comerciales (todas las matemáticas y la validación de una unidad específica de lógica de dominio).
Abstracciones de almacenamiento:
Generalmente se implementa utilizando un patrón de mapeador de datos (no lo confunda con los ORM , que han abusado de este nombre). Estas instancias suelen tener la tarea de almacenar y recuperar información en los objetos de dominio. Cada objeto de dominio puede tener varios mapeadores, al igual que existen varias formas de almacenamiento (DB, caché, sesión, cookies, / dev / null).
Servicios:
Estructuras responsables de la lógica de la aplicación (es decir, interacción entre objetos de dominio e interacción entre objetos de dominio y abstracciones de almacenamiento). Deben actuar como la "interfaz" a través de la cual la capa de presentación interactúa con la capa del modelo. Esto suele ser lo que en el código tipo Rails termina en los controladores.
También hay varias estructuras que pueden estar en los espacios entre estos grupos: DAO , unidades de trabajo y repositorios .
Oh ... y cuando hablamos (en contexto de web) sobre un usuario que interactúa con la aplicación MVC, no es un ser humano. El "usuario" es en realidad su navegador web.
Entonces, ¿qué pasa con las deidades?
En lugar de tener algún modelo aterrador y monolítico con el que trabajar, los controladores deberían interactuar con los servicios. Pasas datos de la entrada del usuario a un servicio específico (por ejemplo, MailService
o RecognitionService
). De esta forma, el controlador cambia el estado de la capa del modelo, pero se hace mediante el uso de una API clara y sin alterar las estructuras internas (lo que provocaría una abstracción con fugas).
Dichos cambios pueden causar una reacción inmediata o solo afectar los datos que la instancia de vista solicita de la capa del modelo, o ambos.
Cada servicio puede interactuar con cualquier número (aunque, por lo general, es solo un puñado) de objetos de dominio y abstracciones de almacenamiento. Por ejemplo, RecogitionService
no podría importarle menos las abstracciones de almacenamiento de los artículos.
Notas de cierre
De esta manera, obtiene una aplicación que se puede probar unitariamente en cualquier nivel, tiene un bajo acoplamiento (si se implementa correctamente) y tiene una arquitectura claramente comprensible.
Sin embargo, tenga en cuenta: MVC no está diseñado para aplicaciones pequeñas. Si está escribiendo una página de libro de visitas usando el patrón MVC, lo está haciendo mal. Este patrón está destinado a hacer cumplir la ley y el orden en aplicaciones a gran escala.
Para las personas que usan PHP como idioma principal, esta publicación puede ser relevante. Es una descripción un poco más larga de la capa del modelo con algunos fragmentos de código.