¿Por qué debería usar un patrón MVC?


74

Parece que todos los que hacen aplicaciones web hoy en día quieren usar MVC para todo. Sin embargo, me resulta difícil convencerme de usar este patrón. Entiendo que la idea general es separar la lógica del backend de la interfaz que representa el programa. En general, parece que las vistas siempre dependen en cierta medida del controlador, lo que termina dependiendo del modelo. No veo qué ventaja me da agregar el controlador. He leído muchas exageraciones sobre "esta es la forma en que deberían diseñarse las aplicaciones", pero tal vez todavía no entiendo qué se supone que debe ir a dónde. Cada vez que hablo con otros sobre MVC parece que todos tienen una idea diferente de qué pertenece en qué categoría.

Entonces, ¿por qué debería usar MVC? ¿Qué gano usando MVC en lugar de separar la interfaz de la lógica de back-end? (La mayoría de las "ventajas" que veo de este patrón se obtienen simplemente separando la interfaz de la implementación, y no explican el propósito de tener un "controlador" separado)


9
MVC es simplemente una implementación de Separación de preocupaciones . Cualquier implementación servirá. No usar Seperations of Concerns tiende a conducir hacia una gran bola de lodo
Raynos

1
@Raynos: Quizás. Pero eso no es a donde va el "bombo".
Billy ONeal

3
bombo obedece a la curva bombo . No dejes que te influya demasiado. Desde mi punto de vista, MVC es una arquitectura sólida para SoC y fácil de implementar. No puedo pensar en una alternativa sólida.
Raynos

mayoría de los marcos de interfaz de usuario existentes herméticamente enlace V y C y cuando se cambia a otro que necesita para reescribir tanto en la vista y el controlador (la interfaz de M a la que el usuario ve)
trinquete monstruo

Pero la separación de preocupaciones es una propiedad del desarrollo de OO. ¿No tiene que usar un patrón MVW para implementar un código de separación de preocupaciones correcto?
Bastien Vandamme

Respuestas:


50

Je Martin Fowler está de acuerdo con su confusión sobre MVC:

No me resulta terriblemente útil pensar en MVC como un patrón porque contiene bastantes ideas diferentes. Diferentes personas que leen sobre MVC en diferentes lugares toman diferentes ideas y las describen como 'MVC'. Si esto no causa suficiente confusión, entonces obtienes el efecto de malentendidos de MVC que se desarrollan a través de un sistema de susurros chinos.

Sin embargo, continúa dando una de las explicaciones más convincentes de lo que motiva a MVC:

En el corazón de MVC está lo que llamo presentación separada. La idea detrás de la presentación separada es hacer una división clara entre los objetos de dominio que modelan nuestra percepción del mundo real y los objetos de presentación que son los elementos de la GUI que vemos en la pantalla. Los objetos de dominio deben ser completamente autónomos y funcionar sin referencia a la presentación, también deben ser capaces de soportar múltiples presentaciones, posiblemente simultáneamente.

Puedes leer el artículo completo de Fowler aquí .


19

Siento que esto depende mucho del problema que estés abordando. Veo la separación de la siguiente manera:

Modelo : ¿cómo representamos los datos? Por ejemplo, ¿cómo paso de mis objetos a un almacenamiento persistente como un DB -> cómo guardo mi objeto 'Usuario' en la base de datos?

Controlador : ¿qué estoy haciendo? Esta es la acción que está teniendo lugar y lo que, en un nivel conceptual, debe llevarse a cabo. Por ejemplo, ¿qué etapas debo atravesar para facturar a un usuario? Nota: esto puede afectar cualquier cantidad de objetos, pero no sabe nada acerca de cómo se mantienen en la base de datos.

Ver : ¿cómo renderizo el resultado?

El problema que siento que está viendo es que muchas aplicaciones web son una interfaz CRUD (Crear-Recuperar-Actualizar-Eliminar) glorificada para un DB. es decir, se le dice al controlador que 'agregue un usuario', y luego simplemente le dice al modelo que 'agregue un usuario'. No se gana nada.

Sin embargo, en los proyectos donde las acciones que lleva a cabo no se aplican directamente a los cambios en el modelo, un controlador facilita mucho la vida y hace que el sistema sea más fácil de mantener.


1
"en proyectos donde las acciones que lleva a cabo no se aplican directamente a los cambios en el modelo" ¿Qué quiere decir con "modelo" aquí? ¿La base de datos? Porque todos con los que he hablado dicen que tales acciones aún pertenecen a un modelo, no a los controladores. (p. ej., que los controladores solo deberían tratar con cosas HTTP ...)
Billy ONeal

¿Qué cuenta como material HTTP? Incluiría lo siguiente en un controlador: Descomponer parámetros de solicitud HTTP, verificar los parámetros para la cordura básica, determinar qué se debe hacer, visitar los objetos del modelo apropiados (para leer, escribir o ambos), producir un resultado final basado en las respuestas del modelo , pasando eso a la vista. Un ejemplo tonto de algo para lo que solo se usaría un controlador podría ser un servicio web que genera un número aleatorio; en este caso, no hay un 'modelo' para mirar (al menos en mi mente ...)
Unk

Esas son todas las preocupaciones modelo. Incluso "decidir qué se debe hacer" (el "controlador frontal") es un modelo.
Billy ONeal

2
Sin mencionar que los controladores son útiles para no acoplar sus modelos a sus vistas. Además de permitirle conectar muchas vistas a muchos modelos a través de un controlador.
Raynos

1
@Billy: si permite que una vista "se meta" con el modelo, además de preguntarle por sus valores, terminará con vistas que se parecen más a los controladores. Pienso más en términos de la encarnación Modelo-GUI-Mediador de MVC. El controlador media entre el Modelo (comportamiento y datos del dominio) y la GUI (representación en pantalla del modelo). La vista solo pasa interacciones al controlador (el usuario hizo clic ...). El controlador decide qué (si alguno) necesita ser llamado en el modelo. Beneficios: ...
Marjan Venema

8

No deberías

Déjame reformular eso. Debe usar una arquitectura que separe la lógica de sus vistas. Si es necesario, debe usar una arquitectura que utilice un controlador (como MVC) si se requiere una lógica que no necesariamente se ajuste a un modelo (como, por ejemplo, un fragmento de URL de análisis transversal del árbol).

Viniendo de CI y Yii, pensé que tener un controlador dedicado era una idea genial. Sin embargo, cuando se desarrollan aplicaciones con interfaces RESTful adecuadas, la necesidad de un controlador para manejar la lógica no específica del modelo parece disminuir. Por lo tanto, cuando me mudé a Django y luego a Pyramid (ninguno de los cuales sigue la arquitectura MVC por completo), descubrí que el controlador no era realmente un componente requerido para las aplicaciones que estaba creando. Tenga en cuenta que ambos marcos tienen características "controlador'ish", como el envío de URL en Pyramid, pero es una cuestión de configuración, no una cuestión de tiempo de ejecución (como CController en Yii).

Al final del día, lo que es realmente importante es la separación de la vista de la lógica. Esto no solo limpia las cosas en términos de implementación, sino que también permite que los ingenieros de FE / BE trabajen en paralelo (cuando trabajan en un entorno de equipo).

(Nota al margen: no desarrollo aplicaciones web profesionalmente, por lo que puede haber algo que me falta)


Estoy totalmente de acuerdo, buena respuesta. El controlador no siempre es necesario, solo se entiende como una estrategia para que la vista se comunique con el modelo.
Falcon

@ Falcon: Mira, esa es mi confusión. He visto a más de una persona decir que la vista no debería hablar con el controlador; que debería hablar solo con la modelo ...
Billy ONeal

1
Si está utilizando una implementación MVC real, la vista no habla con el controlador (o el modelo para el caso). El controlador establece el estado del modelo, prepara los datos para la vista y los empuja a la vista.
Demian Brecht

@Demian: He escuchado lo contrario (que los controladores no deberían hacer nada efectivamente). A menudo. Ese es mi mayor problema con este patrón; nadie parece estar de acuerdo en lo que es.
Billy ONeal

3
Sí, a menudo escuché que si tienes 10 programadores en una habitación, obtendrás 9 definiciones diferentes de lo que es MVC. Realmente, el punto principal es la separación de las preocupaciones. Lo que pasa parece ser un debate religioso.
Demian Brecht

1

Sí, la terminología de esto es un desastre. Es difícil hablar porque nunca entiendes lo que alguien quiere decir con los términos.

En cuanto a por qué un controlador separado, la razón puede depender de la versión del controlador del que se habla.

Es posible que desee un controlador porque cuando ejecuta pruebas, la vista tiene un montón de widgets que no escribió y probablemente no desea probar. Sí, separó la implementación de la herencia, por lo que puede usar un trozo o simulación para probar otras cosas, pero cuando prueba su vista concreta en sí misma, es más difícil. Si tuvieras un controlador que no tuviera widgets ejecutando el mismo código, entonces podrías probarlo directamente, y tal vez no necesites probar los widgets a través de un script.

En mi humilde opinión, las otras versiones son más difíciles de mostrar para un beneficio concreto. Creo que es principalmente un problema de separación de preocupaciones: separe las preocupaciones de la GUI visual pura de la lógica que se aplica a la GUI pero que no forma parte del modelo de negocio (cosas como traducir actualizaciones del modelo en el que los widgets deberían estar visibles). Pero en la práctica, es probable que las dos clases estén tan estrechamente acopladas (incluso si se comunican a través de las interfaces) que es difícil estar demasiado molesto al fusionarlas en una sola vista, y solo estar atento a las formas en que la funcionalidad podría ser más reutilizable si estuvieran divididos


0

En pocas palabras: separación de preocupaciones. Además de todo lo que se habla sobre la forma "correcta" de hacer las cosas, tener un código más limpio, etc., puede decir que MVC le permite reutilizar su código más fácilmente. Básicamente, usted programa sus modelos y sus controladores y puede usarlos indistintamente en una aplicación web, una aplicación de escritorio, un servicio, en cualquier lugar sin mucho esfuerzo.


2
Eso no es diferente a simplemente definir una capa de interfaz de usuario y una capa funcional. No ha explicado por qué es necesario el bit del controlador.
Billy ONeal

-3

Bueno, la razón básica para usar una estructura MVC aparece en una configuración de la industria, donde un solo proceso de trabajo, se sigue un solo modelo para el desarrollo de cualquier aplicación. Entonces, en caso de que el proyecto pase de un módulo de una organización a otro, es mucho más fácil proporcionar una mejor comprensión del escenario de trabajo. Incorpora claridad de trabajo.
Mientras que usted, como individuo, tendría un enfoque diferente para su aplicación, cuando trabaje de manera combinada con un asociado, primero debatiría y aterrizaría sobre un modelo comúnmente acordado por los dos (usted y su asociado). Y en tal caso, separa las responsabilidades asignadas a usted y su asociado, respectivamente, con un margen distintivo.


-3

Creo que MVC se usa solo como una palabra de moda por los teóricos que son gerentes. Sin embargo, una vez dicho esto, la iteración actual de la web con un diseño HTML5 frecuente y receptivo, y el intento de crear una sola línea de programación de bases de datos que funcione en la web y en un iPhone se presta a las ideas generales de MVC. La tecnología front-end web se está moviendo literalmente a la velocidad de la luz en este momento con Jquery, nuevas iteraciones de control CSS, mientras que el lado del servidor se mueve al ritmo de un caracol.

Eventualmente, todo en el servidor será solo servicios o "applets" que bombearán los datos al front-end y, dependiendo del tipo de cliente que tenga, esos datos se consumirán y se mostrarán de manera diferente. En ese sentido, MVC tiene sentido.

A este respecto, creo en el mundo real actual, el MVVM es realmente un "patrón" mejor o como quiera llamarlo que un controlador porque un controlador siempre tiene que volver al modelo para cambiar la vista y esto es lento . En el patrón MVVM, ViewModel puede proporcionar actualizaciones inmediatas a la vista. Además, el modelo MVVM promueve los principios de diseño RESTful en mi humilde opinión.


¿Es esta simplemente su opinión, o puede respaldarla de alguna manera?
mosquito

3
(no votó en contra) Bueno, ha sido una palabra de moda que dura más de 40 años si es así.
Billy ONeal

2
Le animo a que investigue un poco más sobre los orígenes del patrón MVC y los patrones adicionales que generó, como MVP y MVVM. El patrón tiene mucha más historia de la que las palabras de moda actuales te harían creer.

1
De la historia del controlador de vista de modelo : "MVC fue inventado en Xerox Parc en los años 70, aparentemente por Trygve Reenskaug. Creo que su primera aparición pública fue en Smalltalk-80. Durante mucho tiempo prácticamente no hubo información pública sobre MVC, incluso en Smalltalk Documentación de 80. El primer artículo importante publicado en MVC fue "Un libro de cocina para usar el paradigma de interfaz de usuario modelo-vista-controlador en Smalltalk -80", por Glenn Krasner y Stephen Pope, publicado en la edición de agosto / septiembre de 1988 de la revista JournalOfObjectOrientedProgramming (JOOP) ".

Hay muchas palabras de moda mucho más importantes como KISS que han existido durante más tiempo y reciben mucha MENOS atención.
Michael Barber
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.