¿Dónde está la M en MVC?

14

Estoy tratando de refactorizar mi aplicación en MVC, pero estoy atascado en la parte M.

En una aplicación respaldada por una base de datos, el modelo se implementa en el código de la aplicación, ¿verdad?

Pero, lo que está en la base de datos, ¿no es eso también el modelo?

(No estoy usando la base de datos como un simple almacén de objetos, los datos en la base de datos son un activo de la empresa).

    
pregunta 01.12.2011 - 14:20
fuente

13 respuestas

44

Sí, tanto el modelo en el código como la base de datos son el "Modelo".

El modelo tiene que ver con lo que su aplicación "ES" y el controlador es lo que "hace". Cualquier código relacionado con la persistencia directa de la base de datos se considera el Modelo.

Nota: MVC es un patrón , así que no lo pienses demasiado. Es fácil convertir a todos los súper en MVC de la manera correcta, pero al final del día, ¡es solo una mentalidad! Significa mantener su lógica empresarial fuera de la base de datos y la interfaz de usuario, eso es todo. Antes de MVC, las personas colocaban la lógica de negocios en sus páginas web cuando debería estar en el servidor, o tenían un montón de scripts activados en la base de datos haciendo la lógica de negocios junto con el código de persistencia. MVC se creó para hacer que la gente comience a pensar de una manera que ayude a hacer que su código sea reutilizable, así que no se involucre demasiado en los detalles.

    
respondido por el Ryan Hayes 01.12.2011 - 14:28
fuente
17

Trygve Reenskaug escribió los artículos iniciales que describen el patrón MVC de nuevo 1978. El Modelo en su descripción fue el modelo de objeto que representa objetos, fenómenos y conceptos del mundo real. En su escenario de una aplicación respaldada por una base de datos, el modelo es una proyección de sus datos. En pocas palabras, el modelo son las clases y sus relaciones que conciernen a su aplicación.

En la práctica, usualmente se usan dos modelos en MVC, el Modelo de Dominio (lo que se asigna a su base de datos) y el Modelo de Aplicación (también llamado Modelo de Vista en la terminología actual). El Modelo de aplicación es una proyección del Modelo de dominio que también contiene datos específicos de la vista para representar la vista. Este enfoque se conoce como MMVC . El controlador interactúa directamente con el modelo de dominio y presenta un modelo de aplicación a la vista. En el patrón MVVM, se combinan el modelo de aplicación y el controlador.

    
respondido por el Michael Brown 01.12.2011 - 15:34
fuente
3
  1. No necesita una base de datos para MVC. Si su modelo pasa a hablar con la base de datos, entonces genial. También podría persistir en un archivo plano, o no persistir en absoluto.

  2. El modelo es donde los datos se almacenan en la memoria de su aplicación. También querrá usar el modelo para hacer cálculos y validaciones en sus datos. Por ejemplo, usted tiene un modelo de Pago de Financiamiento, con propiedades tales como tasa de interés, plazo y principio. Puede agregar un método getMonthlyPayment () a su modelo para calcular el pago mensual. No querría hacer eso en el controlador o en la vista.

  3. La vista debe ser razonablemente estúpida, ya sea que no tenga ninguna lógica, o que use solo un enlace de datos simple (vea la Vista pasiva y los patrones del controlador supervisor en sitio de Martin Fowler ). La vista genera eventos cuando el usuario hace cosas, como hacer clic en un botón.

  4. El controlador es responsable de manejar los eventos (ejecutar algún código cuando el usuario haga clic en el botón de guardar) y de configurar las propiedades del modelo, y le indica al modelo que se cargue y se guarde (si se usa la persistencia). El controlador no debe hacer cálculos con los datos del modelo. Sin embargo, en el controlador, puede realizar algunos cálculos en nombre de la vista, como "si model.profit () < 0 entonces widget.colour = 'red'"

  5. Debería poder cambiar a una versión de línea de comandos de su aplicación sin cambiar los modelos y sin perder la funcionalidad de los modelos.

a. Probablemente debería poder cambiar a una versión móvil de su aplicación (a diferencia de una versión de escritorio) cambiando solo las vistas (y no los controladores o modelos). Debería poder realizar pruebas unitarias de sus modelos y controladores sin un marco de prueba de GUI.

    
respondido por el Neil McGuigan 01.12.2011 - 21:33
fuente
2

Modelo es el código que tiene conexión a V y C en el frontend y al almacenamiento persistente (puede ser cualquier cosa, desde archivos a bases de datos SQL / NoSQL) en el backend. No es solo el código que se carga de db y almacena en db (que es uno de los malentendidos del modelo), es el código que realmente hace que todo el "dominio" funcione: selecciona, filtra, altera, calcula, decide sobre datos. Incluye toda la lógica no UI de la aplicación.

    
respondido por el herby 01.12.2011 - 14:27
fuente
2

Tomando una visión muy simplista e idealista.

El modelo se ve generalmente como un modelo del dominio (aproximadamente, el negocio), no como un modelo de los datos. Estos pueden parecer similares, pero no están completamente vinculados entre sí.

La vista debe ser un modelo del extremo frontal de la aplicación y el controlador debe ser un modelo del flujo de una vista a otra.

La lógica de negocios debe estar completamente encapsulada en el Modelo, ya sea en la base de datos o en el código. Aunque parte de la lógica de negocios puede repetirse en la Vista o el Controlador, por varias razones, debería ser posible (y seguro) eliminar esos dos componentes por completo y colocar una interfaz diferente en su lugar.

    
respondido por el pdr 01.12.2011 - 15:18
fuente
1

A mi entender, MVC es solo la descripción del patrón arquitectónico de su aplicación cliente. La imagen aquí en Wikipedia solo muestra esto:

enlace

Por supuesto, cuando tiene partes de su aplicación implementadas en "procedimientos almacenados", entonces ese código de la base de datos también puede ser parte del modelo, o incluso del controlador (dependiendo de lo que haga el código). Pero si ese no es el caso, entonces la base de datos está claramente "fuera de MVC", tal como lo indicó.

    
respondido por el Doc Brown 01.12.2011 - 15:07
fuente
1
But then, what is in the database -- is that not also the model?

No, no lo es. " El modelo administra el comportamiento y los datos del dominio de la aplicación ". A menudo, el modelo se enlaza a una base de datos, sí, pero de ninguna manera es un requisito. El modelo es una capa nueva entre su aplicación y la base de datos. El backend podría ser un conjunto de objetos simulados, XML o cualquier otra cosa que admita la persistencia de datos.

Al desacoplar las capas, se da mucha más flexibilidad para utilizar mejores prácticas de prueba unitaria, haga que el código sea más manejable (E.G. SQL es reemplazado por Oracle) entre otros beneficios.

Lo mismo ocurre con el controlador. MVC define el controlador como un intermediario entre las dos capas. No hay una "capa de negocio" definida en MVC. Más bien, usted agrega el suyo propio. MVC no encapsula todas las capas requeridas para construir la mayoría de las aplicaciones. Es sólo una guía general para la estructura básica.

Estas separaciones son clave para permitir que funcione la inversión de control.

    
respondido por el P.Brian.Mackey 01.12.2011 - 15:28
fuente
1

La base de datos es un detalle de implementación del modelo. El modelo debe ser un modelo de dominio completo y debe combinar datos y proceso. La separación debe ser entre preocupaciones de diferencia y no entre un proceso y los datos relacionados con ese proceso.

Vea también: enlace

    
respondido por el Paris Sinclair 31.12.2011 - 23:23
fuente
0

En realidad es muy simple, "Modelo" representa la abstracción para la interfaz de datos. Por eso:

  • Las bases de datos se consideran como parte del modelo , pero no el modelo en sí mismo
  • Los datos del Modelo pueden provenir de bases de datos, archivos, servicios web o incluso ser objeto de burla.
  • Clases de modelo en MVC, HMVC o marcos similares deben almacenar consultas (consulte "modelo gordo, controlador delgado" principio [ 1 ] [ 2 ] [ 3 ])

Y, si tengo razón, es por eso que cuando alguien se refiere a modelos fuera del contexto MVC, es probable que alguien se refiera a la estructura de los datos (es decir, schema ).

    
respondido por el dukeofgaming 01.12.2011 - 22:29
fuente
0

Creo que la M contiene algo de lógica y almacena datos en DB. El controlador invoca qué módulo se ejecutaría y este módulo ejecutará lógicas y almacenará datos en DB (puede tener una capa persistente) y luego este módulo devuelve el valor a V.

    
respondido por el Mark xie 06.12.2011 - 02:26
fuente
0

La M (odel) en el MVC debe capturar el modelo de la empresa / dominio en un solo lugar.

Lo ideal es que incluya reglas de negocios del dominio, así como su estructura.

El C (controlador) idealmente debería ocuparse solo de mediar la información del modelo de negocio en la presentación (por ejemplo, la Vista) y capturar la entrada del usuario desde V (iew) para iniciar cambios en el estado del modelo.

La capa de la base de datos solo trata (o más bien solo debe tratar) la persistencia del estado del modelo en un momento determinado en el tiempo.

Como tal, no es algo que pertenezca a Model o Controller parte del patrón MVC, sino que es un elemento completamente separado. preocupación que puede implementarse implícitamente al persistir de manera transparente cualquier cambio en el modelo (como una función de la fachada, proporcionar las interacciones con su Modelo al Controlador) o como se hace con mayor frecuencia, llamado explícitamente por el Controlador una vez que ha terminado de realizarse mutaciones al modelo.

    
respondido por el Roland Tepp 09.12.2011 - 09:31
fuente
0

El modelo en un mundo ideal solo debe contener lógica empresarial, modela algún objeto real, como una casa. Sin embargo, en casi todas las circunstancias, el modelo debe conservar sus datos en algún almacenamiento.

Las interacciones entre el modelo y los datos almacenados pueden ocurrir en una capa de datos separada o directamente en el modelo, lo cual es el caso cuando se usa un ORM (Mapeador de objetos relacionales). En otras palabras, el modelo se conecta directamente a la base de datos o pasa sus datos a otro objeto de "acceso a datos" que se conecta a la base de datos.

Un ORM (Object Relation Mapper) asigna campos en la tabla de la base de datos a los atributos de su objeto modelo, proporcionando captadores y definidores. En este caso, no hay una capa de datos separada y el modelo es directamente responsable de la persistencia de sus datos.

Aquí hay un ejemplo de Ruby que usa ActiveRecord a ORM popular:

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Price es un campo en la tabla houses que se detecta automáticamente por ActiveRecord que agrega un captador y definidor al objeto. Cuando se llama a save , el valor del atributo de precio se mantiene en la base de datos.

Desde mi punto de vista, el profesional de tener una capa de datos es que obtienes un punto en el que puedes manipular los datos antes de que lleguen al modelo, ya que el modelo tiene menos preocupaciones y menos responsabilidades. Por ejemplo, es posible que deba combinar datos de varios orígenes de datos no compatibles, esto es algo que un ORM no puede manejar fácilmente.

La desventaja principal es su otra capa de abstracción que administrar, si no la necesita, no se moleste, manténgala simple. Menos partes móviles, menos para salir mal.

    
respondido por el Kris 09.12.2011 - 11:51
fuente
-1

Sí, tienes razón.

(Controlador de vista de modelo)

Una arquitectura para crear aplicaciones que separe los datos (modelo) de la interfaz de usuario (vista) y el procesamiento (controlador).

En la práctica, las vistas y los controladores MVC a menudo se combinan en un solo objeto porque están estrechamente relacionados. Según MSDN

  

El controlador interpreta las entradas del mouse y el teclado del usuario, informando el modelo y / o the view to change as appropriate.

Revisa este diagrama:

  

Por ejemplo, el código del controlador valida una solicitud de datos y hace que se devuelva en una vista. Los objetos del controlador de vista están vinculados a un solo modelo; sin embargo, a model can have many view-controller objects associated with it.

    
respondido por el Niranjan Singh 01.12.2011 - 14:41
fuente

Lea otras preguntas en las etiquetas