W porównaniu do formularzy sieci Web, MVC jest jednocześnie podejściem niższego poziomu do generowania kodu HTML z większą kontrolą nad danymi wyjściowymi strony i podejściem wyższego poziomu, bardziej opartym na architekturze. Pozwól, że przechwycę formularze sieci Web i MVC i pokażę, dlaczego uważam, że porównanie faworyzuje formularze sieci Web w wielu sytuacjach - o ile nie wpadniesz w niektóre klasyczne pułapki formularzy sieci Web.
Formularze internetowe
W modelu formularzy sieci Web strony odpowiadają bezpośrednio żądaniom strony z przeglądarki. Tak więc, jeśli kierujesz użytkownika do listy książek, prawdopodobnie będziesz mieć stronę o nazwie „Booklist.aspx”, do której go skierujesz. Na tej stronie musisz podać wszystko, co jest potrzebne do wyświetlenia tej listy. Obejmuje to kod do pobierania danych, stosowania dowolnej logiki biznesowej i wyświetlania wyników. Jeśli na stronę wpływa logika architektury lub routingu, musisz również zakodować logikę architektoniczną na stronie. Tworzenie dobrych formularzy sieci Web zwykle obejmuje tworzenie zestawu klas pomocniczych w oddzielnej (testowalnej jednostkowo) bibliotece DLL. Te klasy będą obsługiwać logikę biznesową, dostęp do danych i decyzje dotyczące architektury / routingu.
MVC
MVC przyjmuje bardziej „architektoniczne” spojrzenie na tworzenie aplikacji internetowych: oferuje standardowe rusztowanie, na którym można budować. Udostępnia również narzędzia do automatycznego generowania klas modeli, widoków i kontrolerów w ramach ustalonej architektury. Na przykład, zarówno w Ruby on Rails (tylko „Rails” od teraz), jak i ASP.NET MVC zawsze zaczynasz od struktury katalogów, która odzwierciedla ich ogólny model architektury aplikacji internetowych. Aby dodać widok, model i kontroler, użyjesz polecenia takiego jak "Skrypt / wygeneruj szkielet Railsów {modelname}" (ASP.NET MVC oferuje podobne polecenia w IDE). W wynikowej klasie kontrolera będą metody („Działania”) dla Index (lista pokazów), Show, New oraz Edit and Destroy (przynajmniej w Railsach MVC jest podobne). Domyślnie te „
Układ katalogów i plików jest istotny w MVC. Na przykład w ASP.NET MVC metoda Index dla obiektu „Book” prawdopodobnie będzie miała tylko jedną linię: „Return View ();” Dzięki magii MVC spowoduje to wysłanie modelu książki na stronę „/View/Books/Index.aspx”, na której znajdziesz kod do wyświetlania książek. Podejście Railsów jest podobne, chociaż logika jest nieco bardziej wyraźna i mniej „magiczna”. Zobacz stronę w aplikacji MVC jest zwykle prostsze niż strona Web Forms, ponieważ nie trzeba martwić się jak najwięcej o routingu, logiki biznesowej lub przenoszenia danych.
Porównanie
Zalety MVC opierają się na czystym oddzieleniu problemów i czystszym, bardziej skoncentrowanym na HTML / CSS / AJAX / Javascript modelu tworzenia wyników. Zwiększa to testowalność, zapewnia bardziej ustandaryzowany projekt i otwiera drzwi do witryn internetowych typu „Web 2.0”.
Jednak są też pewne istotne wady.
Po pierwsze, chociaż łatwo jest uruchomić witrynę demonstracyjną, ogólny model architektoniczny wymaga znacznej nauki. Kiedy mówią „Konwencja w konfiguracji”, brzmi to dobrze - dopóki nie zdasz sobie sprawy, że musisz się nauczyć konwencji wartej przeczytania w książce. Co więcej, często jest to nieco irytujące, aby dowiedzieć się, co się dzieje, ponieważ są polegając na magii zamiast wyraźnych połączeń. Na przykład, że „Return View ();” wezwać powyżej? Dokładnie to samo wezwanie można znaleźć w innych akcjach, ale trafiają one w różne miejsca. Jeśli rozumiesz konwencję MVCwtedy wiesz, dlaczego tak się dzieje. Jednak z pewnością nie kwalifikuje się to jako przykład dobrego nazewnictwa lub łatwego do zrozumienia kodu, a nowym programistom jest znacznie trudniej przyswoić niż formularze internetowe (to nie jest tylko opinia: miałem letniego stażystę, który uczył się formularzy internetowych w zeszłym roku i MVC w tym roku, a różnice w produktywności były wyraźne - na korzyść Web Forms). Przy okazji, Railsy są trochę lepsze pod tym względem, chociaż Ruby on Rails oferuje dynamicznie nazwane metody, które również wymagają poważnego przyzwyczajenia.
Po drugie, MVC niejawnie zakłada, że tworzysz klasyczną witrynę sieci Web w stylu CRUD. Decyzje architektoniczne, a zwłaszcza generatory kodu, zostały stworzone z myślą o obsłudze tego typu aplikacji internetowych. Jeśli budujesz aplikację CRUD i chcesz przyjąć sprawdzoną architekturę (lub po prostu nie lubisz projektowania architektury), prawdopodobnie powinieneś rozważyć MVC. Jeśli jednak będziesz robić więcej niż CRUD i / lub masz wystarczające kompetencje w architekturze, MVC może wydawać się prostym kaftanem, dopóki naprawdę nie opanujesz podstawowego modelu routingu (który jest znacznie bardziej złożony niż po prostu routing w aplikacji WebForms). Nawet wtedy czułem, że zawsze walczę z modelem i martwię się o nieoczekiwane wyniki.
Po trzecie, jeśli nie obchodzi cię Linq (albo boisz się, że Linq-to-SQL zniknie, albo ponieważ uważasz, że Linq-to-Entities jest śmiesznie nadprodukowane i niewystarczające), to również nie chcesz przejść tę ścieżkę, ponieważ narzędzia do tworzenia szkieletów ASP.NET MVC są budowane wokół Linq (to był dla mnie zabójca). Model danych Railsów jest również dość niezdarny w porównaniu z tym, co można osiągnąć, jeśli masz doświadczenie w SQL (a zwłaszcza jeśli jesteś dobrze zorientowany w TSQL i procedurach składowanych!).
Po czwarte, zwolennicy MVC często wskazują, że widoki MVC są duchem bliższe modelowi HTML / CSS / AJAX sieci. Na przykład „pomocniki HTML” - małe wywołania kodu na stronie vew, które zamieniają zawartość i umieszczają ją w kontrolkach HTML - są znacznie łatwiejsze do zintegrowania z JavaScriptem niż kontrolkami formularzy sieci Web. Jednak ASP.NET 4.0 wprowadza możliwość nazywania formantów, a tym samym w znacznym stopniu eliminuje tę zaletę.
Po piąte, puryści MVC często wyśmiewają Viewstate. W niektórych przypadkach mają rację. Jednak Viewstate może być również doskonałym narzędziem i dobrodziejstwem dla produktywności. Dla porównania, obsługa Viewstate jest znacznie łatwiejsza niż próba zintegrowania kontrolek internetowych innych firm w aplikacji MVC. Podczas gdy integracja sterowania może stać się łatwiejsza dla MVC, wszystkie obecne wysiłki, które widziałem, cierpią z powodu konieczności zbudowania (nieco wrednego) kodu, aby połączyć te kontrolki z powrotem z klasą kontrolera widoku (to znaczy - aby obejść model MVC ).
Wnioski
Programowanie MVC podoba mi się na wiele sposobów (chociaż wolę Railsy od ASP.NET MVC z daleka). Myślę też, że ważne jest, abyśmy nie wpadli w pułapkę myślenia, że ASP.NET MVC jest „anty-wzorcem” ASP.NET Web Forms. Są różne, ale nie całkowicie obce i na pewno jest miejsce dla obu.
Jednak wolę tworzenie formularzy sieci Web, ponieważ w przypadku większości zadań jest to po prostu łatwiejsze do wykonania (wyjątkiem jest generowanie zestawu formularzy CRUD). Wydaje się również, że MVC do pewnego stopnia cierpi z powodu nadmiaru teorii. Rzeczywiście, spójrz na wiele pytań zadawanych tutaj na SO przez ludzi, którzy znają ASP.NET zorientowany na strony, ale próbują MVC. Bez wyjątku jest dużo zgrzytania zębami, ponieważ programiści stwierdzają, że nie mogą wykonywać podstawowych zadań bez skakania przez obręcze lub znoszenia ogromnej krzywej uczenia się. To właśnie sprawia, że formularze internetowe są lepsze od MVC w mojej książce: MVC sprawia, że płacisz rzeczywistą cenę , aby uzyskać nieco większą testowalność lub, co gorsza, po prostu być postrzeganym jako fajny, ponieważ używaszNajnowsza technologia.
Aktualizacja: Zostałem mocno skrytykowany w sekcji komentarzy - niektóre z nich całkiem uczciwe. Dlatego spędziłem kilka miesięcy na nauce Railsów i ASP.NET MVC, aby upewnić się, że nie przegapiłem kolejnej wielkiej rzeczy! Oczywiście pomaga to również zapewnić wyważoną i odpowiednią odpowiedź na pytanie. Powinieneś wiedzieć, że powyższa odpowiedź jest głównym przepisaniem mojej początkowej odpowiedzi na wypadek, gdyby komentarze wydawały się niezsynchronizowane.
Kiedy przyglądałem się bliżej MVC, przez chwilę pomyślałem, że skończę z głównym mea culpa. W końcu doszedłem do wniosku, że chociaż myślę, że musimy poświęcić dużo więcej energii na architekturę i testowalność formularzy sieci Web, MVC naprawdę nie odpowiada na to wezwanie. Tak więc serdecznie dziękuję ludziom, którzy dostarczyli inteligentnej krytyki mojej początkowej odpowiedzi.
Jeśli chodzi o tych, którzy postrzegali to jako bitwę religijną i którzy nieustannie organizowali powodzie przeciwne, nie rozumiem, dlaczego się przejmujesz (ponad 20 głosów w dół w ciągu kilku sekund przy wielu okazjach z pewnością nie jest normalne). Jeśli czytasz tę odpowiedź i zastanawiasz się, czy w mojej odpowiedzi jest coś naprawdę „złego”, biorąc pod uwagę, że wynik jest znacznie niższy niż w przypadku niektórych innych odpowiedzi, możesz być pewien, że mówi ona więcej o kilku osobach, które się nie zgadzają, niż ogólne poczucie społeczność (ogólnie ta została pozytywnie oceniona ponad 100 razy).
Faktem jest, że wielu programistów nie dba o MVC i rzeczywiście nie jest to pogląd mniejszości (nawet w MS, jak zdają się wskazywać na blogach).