Pregunta

Recientemente, gracias a los rieles' popularidad, mucha gente empieza a usar activerecord como modelo.sin embargo, antes de que oí de rieles (mi grupo de compañeros no era un fan de la fuente abierta cosas, que nos enseñaron en la una .RED de la escuela...) y mientras yo estaba haciendo mi proyecto final de carrera, he encontrado esta definición de un modelo de

El modelo representa los datos de la empresa y las reglas de negocio que rigen el acceso y la actualización de estos datos.A menudo, el modelo sirve como un software de aproximación a un proceso real, tan simple en el mundo real modelado de las técnicas se aplican al definir el modelo.

no dice el modelo debe representar una tabla como lo activerecord hace.Y, normalmente, dentro de una transacción, se puede tener a la consulta de un par de tablas no relacionadas y, a continuación, manipular los datos de diferentes tablas...así que si activerecord se utiliza como modelo, entonces uno tendría que meter toda la lógica de código en el controlador (que es un poco popular en algunos frameworks de php) que hace que sea difícil de probar o hackear el modelo activerecord por lo que se realiza la operación de base de datos, no sólo de la tabla se asigna, pero también otras tablas relacionadas, así...

así que, ¿qué es tan grande sobre abusando (en mi humilde opinión) activerecord como el modelo en un patrón de arquitectura MVC?

¿Fue útil?

Solución

Martin Fowler describe este patrón en los Patrones de la Arquitectura de Aplicaciones Empresariales, junto con otros dos modelos o arquitecturas.Estos patrones son buenos para diferentes situaciones y diferentes cantidades de complejidad.

Si desea tan sólo cosas simples que usted puede utilizar secuencias de Comandos de Transacción.Esta es una arquitectura que vi en mucho de la de los antiguos ASP y PHP páginas en una sola secuencia de comandos que contiene la lógica de negocio, acceso a datos y lógica de presentación lógica.Esto se cae a pedazos rápido cuando las cosas se ponen más complicadas.

La siguiente cosa que usted puede hacer es agregar una cierta separación entre la presentación y el modelo.Este es activerecord.El modelo sigue atado a la base de datos pero no tienes un poco más de flexibilidad ya que se puede reutilizar el modelo/dataccess entre vistas/pages/lo que sea.No es tan flexible como podría ser, pero dependiendo de los datos-acceso la solución puede ser lo suficientemente flexible.Marcos como CSLA en .Net tienen una gran cantidad de aspectos de este patterm (creo que Entity Framework parece un poco demasiado como esto también).Todavía se puede manejar una gran cantidad de complejidad sin llegar a ser tanto.

El siguiente paso es separar la capa de acceso a datos y el modelo.Esto normalmente requiere una buena O mapper o un montón de trabajo.Así que no todo el mundo quiere ir de esta manera.Muchas de las metodologías como dominio de diseño orientado a perscribe este enfoque.

Así que es todo una cuestión de contexto.¿Qué se necesita y cuál es la mejor solución.Yo aún uso de transacciones de secuencia de comandos a veces por un simple código de uso.

Otros consejos

He dicho muchas veces que el uso de Active Record (o ORM que es casi lo mismo) que el modelo de Negocio no es una buena idea.Me explico:

El hecho de que PHP de código Abierto, Libre (y todos los que de una larga historia...) le proporciona una gran comunidad de desarrolladores de verter el código en foros, sitios como GitHub, Google code, y así sucesivamente.Usted puede ver esto como una buena cosa, pero a veces se tiende a no ser "tan bueno".Por ejemplo, supongamos que usted está frente a un proyecto y desea utilizar un ORM marco para hacer frente a su problema escrito en PHP, así...usted tendrá un montón de las opciones a elegir para:

  • La doctrina
  • Impulsar
  • QCodo
  • Letargo
  • RedBean

Y la lista sigue y sigue.Los nuevos proyectos se crean con regularidad.Así que imagínese que usted ha construido un completo soplado de marco e incluso una fuente generador de código basado en ese marco.Pero usted no se coloca clases de negocios porque, después de todo, "¿por qué la escritura de las mismas clases de nuevo?".El tiempo pasa y un nuevo framework ORM es liberado y desea cambiar a la nueva ORM, pero vas a tener que modificar casi todos los clientes de la aplicación mediante referencia directa a su modelo de datos.

Línea de fondo, Active Record y ORM están destinados a ser en la Capa de Datos de la aplicación, si se mezcla con su Capa de Presentación, usted puede experimentar problemas como este ejemplo que he puesto.

Oye @Mendelt las palabras sabias:Lee Martin Fowler.Él se puso a muchos libros y artículos sobre diseño OO y publicado algún buen material sobre el tema.También, es posible que desee buscar en Anti-Patrones, más específicamente en La Dependencia Con El Proveedor, que es lo que sucede cuando hacemos nuestra aplicación depende de la 3ª parte de las herramientas.Finalmente, escribí este blog post hablando del mismo tema, así que si quieres, échale un vistazo.

Espero que mi respuesta haya sido de alguna utilidad.

La gran cosa sobre el uso de los Rieles de ActiveRecord como un modelo en el MVC es que se le da automáticamente ORM (Object Relational Mapper) y la manera fácil de crear asociaciones entre los modelos.Como usted ha señalado, MVC a veces puede ser insuficiente.

Por lo tanto, para algunas transacciones complejas que involucran a muchos modelos, te sugiero utilizar un Presentador en entre el controlador y los modelos (Rieles Modelo De Presentador).El Presentador se agrupaban los modelos transaccionales y de la lógica y seguiría siendo fácilmente comprobables.Usted definitivamente quiere esforzarse para mantener a todos los de su lógica de negocio en los modelos o presentadoras, y de sus controladores (Flaco Controlador, Modelo De La Grasa).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top