Comparé aux formulaires Web, MVC est simultanément une approche de niveau inférieur de la génération HTML avec un meilleur contrôle sur la sortie de la page et une approche de plus haut niveau, davantage axée sur l'architecture. Laissez-moi capturer Web Forms et MVC et montrer pourquoi je pense que la comparaison favorise les Web Forms dans de nombreuses situations - tant que vous ne tombez pas dans certains pièges classiques de Web Forms.
Formulaires Web
Dans le modèle Web Forms, vos pages correspondent directement à la demande de page du navigateur. Ainsi, si vous dirigez un utilisateur vers une liste de livres, vous aurez probablement une page quelque part appelée "Booklist.aspx" vers laquelle vous le dirigerez. Dans cette page, vous devrez fournir tout le nécessaire pour afficher cette liste. Cela inclut le code pour extraire des données, appliquer toute logique métier et afficher les résultats. Si une logique architecturale ou de routage affecte la page, vous devrez également coder la logique architecturale sur la page. Un bon développement de formulaires Web implique généralement le développement d'un ensemble de classes de prise en charge dans une DLL distincte (testable à l'unité). Ces classes géreront la logique métier, l'accès aux données et les décisions d'architecture / de routage.
MVC
MVC adopte une vision plus «architecturale» du développement d'applications Web: en offrant un échafaudage standardisé sur lequel bâtir. Il fournit également des outils pour générer automatiquement des classes de modèle, de vue et de contrôleur au sein de l'architecture établie. Par exemple, dans Ruby on Rails (juste "Rails" à partir de maintenant) et ASP.NET MVC, vous commencerez toujours avec une structure de répertoires qui reflète leur modèle global d'architecture d'application Web. Pour ajouter une vue, un modèle et un contrôleur, vous utiliserez une commande comme "Rails script / generate scaffold {modelname}" (ASP.NET MVC propose des commandes similaires dans l'EDI). Dans la classe de contrôleur résultante, il y aura des méthodes ("Actions") pour Index (afficher la liste), Afficher, Nouveau et Modifier et Détruire (au moins dans Rails, MVC est similaire). Par défaut, ces "
La disposition des répertoires et des fichiers est importante dans MVC. Par exemple, dans ASP.NET MVC, la méthode Index pour un objet «Book» n'aura probablement qu'une seule ligne: «Return View ();» Grâce à la magie de MVC, cela enverra le modèle Book à la page "/View/Books/Index.aspx" où vous trouverez du code pour afficher les livres. L'approche de Rails est similaire bien que la logique soit un peu plus explicite et moins «magique». A Voir la page dans une application MVC est généralement plus simple qu'une page Web Forms parce qu'ils ne sont pas à vous inquiéter autant sur le routage, la logique métier ou le traitement des données.
Comparaison
Les avantages de MVC tournent autour d'une séparation nette des préoccupations et d'un modèle plus propre et plus centré sur HTML / CSS / AJAX / Javascript pour produire votre sortie. Cela améliore la testabilité, fournit une conception plus standardisée et ouvre la porte à un type de site Web plus "Web 2.0".
Cependant, il existe également des inconvénients importants.
Premièrement, s'il est facile de lancer un site de démonstration, le modèle architectural global a une courbe d'apprentissage importante. Quand ils disent "Convention Over Configuration", cela sonne bien - jusqu'à ce que vous vous rendiez compte que vous avez un livre de conventions à apprendre. De plus, il est souvent un peu affolant de comprendre ce qui se passe parce que vous êtes fondez sur la magie plutôt que des appels explicites. Par exemple, ce "Return View ();" appeler ci-dessus? Le même appel peut être trouvé dans d'autres actions mais ils vont à des endroits différents. Si vous comprenez la convention MVCalors vous savez pourquoi cela est fait. Cependant, cela ne peut certainement pas être considéré comme un exemple de bonne dénomination ou de code facilement compréhensible et il est beaucoup plus difficile à comprendre pour les nouveaux développeurs que les formulaires Web (ce n'est pas seulement une opinion: j'ai demandé à un stagiaire d'été d'apprendre Web Forms l'année dernière. et MVC cette année et les différences de productivité ont été prononcées - en faveur des formulaires Web). BTW, Rails est un peu meilleur à cet égard, bien que Ruby on Rails propose des méthodes nommées dynamiquement qui nécessitent également un certain temps d'adaptation.
Deuxièmement, MVC suppose implicitement que vous créez un site Web de style CRUD classique. Les décisions architecturales et en particulier les générateurs de code sont toutes conçues pour prendre en charge ce type d'application Web. Si vous créez une application CRUD et que vous souhaitez adopter une architecture éprouvée (ou simplement n'aimer pas la conception d'architecture), vous devriez probablement envisager MVC. Cependant, si vous faites plus que CRUD et / ou si vous êtes raisonnablement compétent en architecture, MVC peut se sentir comme un carcan jusqu'à ce que vous maîtrisiez vraiment le modèle de routage sous-jacent (qui est considérablement plus complexe que le simple routage dans une application WebForms). Même dans ce cas, j'ai l'impression de toujours me battre contre le modèle et de m'inquiéter des résultats inattendus.
Troisièmement, si vous ne vous souciez pas de Linq (soit parce que vous avez peur que Linq-to-SQL va disparaître, soit parce que vous trouvez Linq-to-Entities ridiculement surproduit et sous-alimenté), vous ne voulez pas non plus suivre cette voie depuis que les outils de création d'échafaudage ASP.NET MVC sont construits autour de Linq (c'était le tueur pour moi). Le modèle de données de Rails est également assez maladroit par rapport à ce que vous pouvez réaliser si vous êtes expérimenté en SQL (et surtout si vous maîtrisez TSQL et les procédures stockées!).
Quatrièmement, les partisans de MVC soulignent souvent que les vues MVC sont plus proches dans l'esprit du modèle HTML / CSS / AJAX du Web. Par exemple, les "HTML Helpers" - les petits appels de code dans votre page vew qui intervertissent le contenu et le placent dans des contrôles HTML - sont beaucoup plus faciles à intégrer avec Javascript que les contrôles Web Forms. Cependant, ASP.NET 4.0 introduit la possibilité de nommer vos contrôles et élimine ainsi largement cet avantage.
Cinquièmement, les puristes de MVC se moquent souvent de Viewstate. Dans certains cas, ils ont raison de le faire. Cependant, Viewstate peut également être un excellent outil et une aubaine pour la productivité. À titre de comparaison, la gestion de Viewstate est beaucoup plus facile que d'essayer d'intégrer des contrôles Web tiers dans une application MVC. Bien que l'intégration des contrôles puisse devenir plus facile pour MVC, tous les efforts actuels que j'ai vus souffrent de la nécessité de créer un code (quelque peu grody) pour relier ces contrôles à la classe Controller de la vue (c'est-à-dire pour travailler autour du modèle MVC ).
Conclusions
J'aime le développement MVC à bien des égards (bien que je préfère de loin Rails à ASP.NET MVC). Je pense également qu'il est important de ne pas tomber dans le piège de penser qu'ASP.NET MVC est un «anti-modèle» des formulaires Web ASP.NET. Ils sont différents mais pas complètement étrangers et il y a certainement de la place pour les deux.
Cependant, je préfère le développement de formulaires Web car, pour la plupart des tâches , il est simplement plus facile de faire les choses (à l'exception de la génération d'un ensemble de formulaires CRUD). MVC semble également souffrir, dans une certaine mesure, d'un excès de théorie. En effet, regardez les nombreuses questions posées ici sur SO par des personnes qui connaissent ASP.NET orienté page mais qui essaient MVC. Sans exception, il y a beaucoup de grincements de dents car les développeurs constatent qu'ils ne peuvent pas effectuer des tâches de base sans sauter à travers des cerceaux ou endurer une énorme courbe d'apprentissage. C'est ce qui rend Web Forms supérieur à MVC dans mon livre: MVC vous fait payer un prix réel pour gagner un peu plus de testabilité ou, pire encore, pour être simplement considéré comme cool parce que vous utilisez ledernière technologie.
Mise à jour: J'ai été fortement critiqué dans la section des commentaires - certains sont assez justes. Ainsi, j'ai passé plusieurs mois à apprendre Rails et ASP.NET MVC juste pour m'assurer que je ne manquais pas vraiment la prochaine grande chose! Bien entendu, cela permet également de garantir que je donne une réponse équilibrée et appropriée à la question. Vous devez savoir que la réponse ci-dessus est une réécriture majeure de ma réponse initiale au cas où les commentaires semblent désynchronisés.
Pendant que je regardais de plus près MVC, j'ai pensé, pendant un petit moment, que je finirais avec un mea culpa majeur. En fin de compte, j'ai conclu que, même si je pense que nous devons dépenser beaucoup plus d'énergie sur l'architecture et la testabilité des formulaires Web, MVC ne répond vraiment pas à l'appel à ma place. Donc, un chaleureux «merci» aux gens qui ont fourni des critiques intelligentes de ma réponse initiale.
Quant à ceux qui ont vu cela comme une bataille religieuse et qui ont sans cesse organisé des inondations de votes négatifs, je ne comprends pas pourquoi vous vous embêtez (plus de 20 votes négatifs en quelques secondes d'intervalle à plusieurs reprises, ce n'est certainement pas normal). Si vous lisez cette réponse et que vous vous demandez s'il y a quelque chose de vraiment "faux" dans ma réponse étant donné que le score est bien inférieur à certaines des autres réponses, soyez assuré que cela en dit plus sur quelques personnes qui ne sont pas d'accord que sur le sens général de la communauté (dans l'ensemble, celle-ci a été votée plus de 100 fois).
Le fait est que de nombreux développeurs ne se soucient pas de MVC et, en effet, ce n'est pas une opinion minoritaire (même au sein de MS comme semblent l'indiquer les blogs).