En comparación con los formularios web, MVC es al mismo tiempo un enfoque de nivel inferior para la generación de HTML con un mayor control sobre la salida de la página y un enfoque de nivel superior más orientado a la arquitectura. Permítanme capturar formularios web y MVC y mostrar por qué creo que la comparación favorece los formularios web en muchas situaciones, siempre y cuando no caigan en algunas trampas clásicas de formularios web.
Formularios web
En el modelo de formularios web, sus páginas corresponden directamente a la solicitud de página del navegador. Por lo tanto, si dirige a un usuario a una lista de Libros, es probable que tenga una página en algún lugar llamada "Booklist.aspx" a la que lo dirigirá. En esa página, deberá proporcionar todo lo necesario para mostrar esa lista. Esto incluye código para extraer datos, aplicar cualquier lógica de negocios y mostrar los resultados. Si hay alguna lógica arquitectónica o de enrutamiento que afecte a la página, también deberá codificar la lógica arquitectónica en la página. El buen desarrollo de formularios web generalmente implica el desarrollo de un conjunto de clases de soporte en una DLL separada (comprobable por unidad). Estas clases manejarán la lógica empresarial, el acceso a datos y las decisiones arquitectónicas / de enrutamiento.
MVC
MVC adopta una visión más "arquitectónica" del desarrollo de aplicaciones web: ofrece un andamio estandarizado sobre el cual construir. También proporciona herramientas para generar automáticamente clases de modelo, vista y controlador dentro de la arquitectura establecida. Por ejemplo, tanto en Ruby on Rails (solo "Rails" de aquí en adelante) como en ASP.NET MVC siempre comenzará con una estructura de directorios que refleje su modelo general de arquitectura de aplicaciones web. Para agregar una vista, modelo y controlador, usará un comando como "Rails script / generate scaffold {modelname}" de Rails (ASP.NET MVC ofrece comandos similares en el IDE). En la clase de controlador resultante, habrá métodos ("Acciones") para Índice (mostrar lista), Mostrar, Nuevo y Editar y Destruir (al menos en Rails, MVC es similar). Por defecto, estos "
El diseño de directorios y archivos es significativo en MVC. Por ejemplo, en ASP.NET MVC, el método de índice para un objeto "Libro" probablemente solo tendrá una línea: "Vista de retorno ();" A través de la magia de MVC, esto enviará el modelo de Libro a la página "/View/Books/Index.aspx" donde encontrará código para mostrar Libros. El enfoque de Rails es similar, aunque la lógica es un poco más explícita y menos "mágica". A Ver la página en una aplicación MVC es generalmente más simple que una página Web Forms, ya que no tienen que preocuparse tanto de enrutamiento, la lógica de negocio o el manejo de datos.
Comparación
Las ventajas de MVC giran en torno a una separación limpia de preocupaciones y un modelo más limpio, más centrado en HTML / CSS / AJAX / Javascript para producir su salida. Esto mejora la capacidad de prueba, proporciona un diseño más estandarizado y abre la puerta a un tipo de sitio web más "Web 2.0".
Sin embargo, también hay algunos inconvenientes importantes.
Primero, aunque es fácil poner en marcha un sitio de demostración, el modelo arquitectónico general tiene una curva de aprendizaje significativa. Cuando dicen "Convención sobre configuración" suena bien, hasta que te das cuenta de que tienes un libro de convenciones para aprender. Además, a menudo es un poco irritante para averiguar lo que está pasando, ya que está confiando en la magia en lugar de llamadas explícitas. Por ejemplo, que "Vista de retorno ();" llamar arriba? La misma llamada exacta se puede encontrar en otras acciones, pero van a diferentes lugares. Si entiendes la convención MVCentonces sabes por qué se hace esto. Sin embargo, ciertamente no califica como un ejemplo de buen nombre o código fácilmente comprensible y es mucho más difícil para los nuevos desarrolladores elegir que Web Forms (esto no es solo una opinión: tuve un pasante de verano que aprendió Web Forms el año pasado y MVC este año y las diferencias en productividad fueron pronunciadas, a favor de los formularios web). Por cierto, Rails es un poco mejor en este sentido, aunque Ruby on Rails presenta métodos dinámicamente nombrados que también requieren un poco de tiempo para acostumbrarse.
En segundo lugar, MVC asume implícitamente que está creando un sitio web clásico de estilo CRUD. Las decisiones arquitectónicas y especialmente los generadores de código están diseñados para admitir este tipo de aplicación web. Si está creando una aplicación CRUD y desea adoptar una arquitectura probada (o simplemente no le gusta el diseño de la arquitectura), entonces probablemente debería considerar MVC. Sin embargo, si va a hacer más que CRUD y / o es razonablemente competente con la arquitectura, MVC puede parecer una camisa de fuerza hasta que realmente domine el modelo de enrutamiento subyacente (que es considerablemente más complejo que simplemente enrutar en una aplicación WebForms). Incluso entonces, sentí que siempre estaba luchando contra el modelo y me preocupaban los resultados inesperados.
En tercer lugar, si no te interesa Linq (ya sea porque temes que Linq-to-SQL vaya a desaparecer o porque encuentres que Linq-to-Entities se ríe de forma excesiva y esté subproducido), entonces tampoco quieres caminar por este camino, ya que las herramientas de andamios ASP.NET MVC están construidas alrededor de Linq (este fue el asesino para mí). El modelo de datos de Rails también es bastante torpe en comparación con lo que puede lograr si tiene experiencia en SQL (¡y especialmente si está bien versado en TSQL y procedimientos almacenados!).
Cuarto, los defensores de MVC a menudo señalan que las vistas de MVC están más cerca en espíritu del modelo HTML / CSS / AJAX de la web. Por ejemplo, "HTML Helpers", las pequeñas llamadas de código en su página de vista que intercambian contenido y lo colocan en controles HTML, son mucho más fáciles de integrar con Javascript que los controles de formularios web. Sin embargo, ASP.NET 4.0 introduce la capacidad de nombrar sus controles y, por lo tanto, elimina en gran medida esta ventaja.
Quinto, los puristas de MVC a menudo se burlan de Viewstate. En algunos casos, tienen razón en hacerlo. Sin embargo, Viewstate también puede ser una gran herramienta y una bendición para la productividad. A modo de comparación, manejar Viewstate es mucho más fácil que intentar integrar controles web de terceros en una aplicación MVC. Si bien la integración de controles puede ser más fácil para MVC, todos los esfuerzos actuales que he visto sufren de la necesidad de construir un código (algo inestable) para vincular estos controles a la clase de Controlador de la vista (es decir, para evitar el modelo MVC )
Conclusiones
Me gusta el desarrollo de MVC de muchas maneras (aunque prefiero Rails a ASP.NET MVC por asomo). También creo que es importante que no caigamos en la trampa de pensar que ASP.NET MVC es un "antipatrón" de ASP.NET Web Forms. Son diferentes pero no completamente extraños y ciertamente hay espacio para ambos.
Sin embargo, prefiero el desarrollo de formularios web porque, para la mayoría de las tareas , es simplemente más fácil hacer las cosas (la excepción es la generación de un conjunto de formularios CRUD). MVC también parece sufrir, en cierta medida, un exceso de teoría. De hecho, mire las muchas preguntas formuladas aquí en SO por personas que conocen ASP.NET orientado a páginas pero que están probando MVC. Sin excepción, hay mucho crujir de dientes a medida que los desarrolladores descubren que no pueden realizar tareas básicas sin saltar a través de aros o soportar una gran curva de aprendizaje. Esto es lo que hace que Web Forms sea superior a MVC en mi libro: MVC te hace pagar un precio del mundo real para ganar un poco más de capacidad de prueba o, lo que es peor, para que te vean simplemente genial porque estás usando elúltima tecnología.
Actualización: Me han criticado mucho en la sección de comentarios, algunos de ellos bastante justos. Por lo tanto, ¡pasé varios meses aprendiendo Rails y ASP.NET MVC solo para asegurarme de que realmente no me estaba perdiendo la próxima gran cosa! Por supuesto, también ayuda a garantizar que proporcione una respuesta equilibrada y adecuada a la pregunta. Debes saber que la respuesta anterior es una gran reescritura de mi respuesta inicial en caso de que los comentarios no estén sincronizados.
Mientras miraba más de cerca a MVC, pensé, por un momento, que terminaría con un gran mea culpa. Al final, llegué a la conclusión de que, si bien creo que debemos gastar mucha más energía en la arquitectura y la capacidad de prueba de los formularios web, MVC realmente no responde la llamada por mí. Entonces, un cordial "gracias" a las personas que proporcionaron críticas inteligentes de mi respuesta inicial.
En cuanto a aquellos que vieron esto como una batalla religiosa y que diseñaron implacablemente las inundaciones de votos negativos, no entiendo por qué se molestan (más de 20 votos negativos en segundos en varias ocasiones ciertamente no es normal). Si está leyendo esta respuesta y se pregunta si hay algo realmente "incorrecto" en mi respuesta dado que el puntaje es mucho más bajo que algunas de las otras respuestas, puede estar seguro de que dice más sobre algunas personas que están en desacuerdo que el sentido general de la comunidad (en general, esta ha sido votada más de 100 veces).
El hecho es que muchos desarrolladores no se preocupan por MVC y, de hecho, esta no es una visión minoritaria (incluso dentro de MS como parecen indicar los blogs).