Web Formları ile karşılaştırıldığında, MVC, sayfa çıktısı üzerinde daha fazla kontrole ve daha üst düzey, daha mimari güdümlü bir yaklaşıma sahip HTML üretimine eş zamanlı olarak daha düşük seviyeli bir yaklaşımdır. Web Formlarını ve MVC'yi yakalayayım ve neden bazı klasik Web Formları tuzaklarına düşmediğiniz sürece karşılaştırmanın birçok durumda Web Formlarını tercih ettiğini düşündüğümü göstereyim.
Web Formları
Web Formları modelinde, sayfalarınız doğrudan tarayıcıdan gelen sayfa isteğine karşılık gelir. Bu nedenle, bir kullanıcıyı Kitaplar listesine yönlendiriyorsanız, büyük olasılıkla "Booklist.aspx" adlı bir yerde onu yönlendireceğiniz bir sayfanız olur. Bu sayfada, listeyi göstermek için gereken her şeyi sağlamanız gerekir. Buna veri çekme, herhangi bir iş mantığı uygulama ve sonuçları görüntüleme kodu da dahildir. Sayfayı etkileyen herhangi bir mimari veya yönlendirme mantığı varsa, sayfadaki mimari mantığı da kodlamanız gerekir. İyi Web Formları geliştirme genellikle ayrı (birim-test edilebilir) bir DLL dosyasında bir dizi destekleyici sınıfın geliştirilmesini içerir. Bu sınıf (lar) iş mantığı, veri erişimi ve mimari / yönlendirme kararlarını ele alacaktır.
MVC
MVC, web uygulaması geliştirmenin daha "mimari" bir görünümünü alır: üzerine inşa edilecek standart bir iskele sunar. Ayrıca, yerleşik mimari içinde model, görünüm ve denetleyici sınıflarını otomatik olarak oluşturmak için araçlar sağlar. Örneğin, hem Ruby on Rails (sadece buradan "Rails") ve ASP.NET MVC'de her zaman genel web uygulama mimarisi modellerini yansıtan bir dizin yapısı ile başlayacaksınız. Bir görünüm, model ve denetleyici eklemek için Rails'in "Rails komut dosyası / yapı iskelesi {modelname}" gibi bir komut kullanırsınız (ASP.NET MVC, IDE'de benzer komutlar sunar). Ortaya çıkan denetleyici sınıfında, Dizin (listeyi göster), Göster, Yeni ve Düzenle ve Yok Et (en azından Rails'te, MVC benzerdir) için yöntemler ("Eylemler") olacaktır. Varsayılan olarak, bunlar "
MVC'de dizinlerin ve dosyaların düzeni önemlidir. Örneğin, ASP.NET MVC'de, "Kitap" nesnesinin Dizin yönteminin büyük olasılıkla tek bir satırı olacaktır: "Return View ();" MVC'nin büyüsü sayesinde bu, Kitap modelini Kitapları görüntülemek için kod bulacağınız "/View/Books/Index.aspx" sayfasına gönderir. Rails yaklaşımı benzer, ancak mantık biraz daha açık ve daha az "sihir". Bir MVC uygulamasındaki bir Görünüm sayfası genellikle bir Web Formları sayfasından daha kolaydır, çünkü yönlendirme, iş mantığı veya veri işleme hakkında endişelenmek zorunda kalmazlar.
karşılaştırma
MVC'nin avantajları, endişelerin temiz bir şekilde ayrılması ve çıktınızı üretmek için daha temiz, daha HTML / CSS / AJAX / Javascript merkezli bir model etrafında dönmektedir. Bu, test edilebilirliği artırır, daha standartlaştırılmış bir tasarım sağlar ve daha "Web 2.0" türünde bir web sitesine kapı açar.
Bununla birlikte, bazı önemli dezavantajlar da vardır.
Birincisi, bir demo sitesini çalıştırmak kolay olsa da, genel mimari modelin önemli bir öğrenme eğrisi vardır. "Konfigürasyon Üzerinden Konvansiyon" dediklerinde kulağa hoş geliyor - öğrenecek bir kitabın konvansiyonuna sahip olduğunuzu anlayana kadar. Ayrıca, sen çünkü ne olup bittiğini anlamaya biraz çıldırtıcı genellikle edilmektedir açık çağrılar yerine büyü güvenerek. Örneğin, "Dönüş Görünümü ();" yukarıdaki çağrı? Aynı çağrı diğer İşlemlerde de bulunabilir, ancak farklı yerlere giderler. Eğer anlamak MVC kongreo zaman bunun neden yapıldığını biliyorsun. Ancak, kesinlikle iyi bir adlandırma veya kolayca anlaşılabilir kod örneği olarak nitelendirilmez ve yeni geliştiricilerin Web Formlarından daha fazla alması çok daha zordur (bu sadece fikir değildir: Geçen yıl bir yaz stajyeri öğrenmiştim ve MVC bu yıl ve verimlilik farklılıkları - Web Formları lehine telaffuz edildi). BTW, Rails, bu konuda biraz daha iyidir, ancak Ruby on Rails, ciddi şekilde alışmak için dinamik olarak adlandırılmış yöntemlere sahiptir.
İkinci olarak, MVC dolaylı olarak klasik bir CRUD tarzı web sitesi oluşturduğunuzu varsayar. Mimari kararlar ve özellikle kod üreteçleri, bu tür bir web uygulamasını desteklemek için oluşturulmuştur. Bir CRUD uygulaması oluşturuyorsanız ve kanıtlanmış bir mimariyi benimsemek istiyorsanız (veya mimari tasarımdan hoşlanmıyorsanız), muhtemelen MVC'yi düşünmelisiniz. Bununla birlikte, CRUD'dan daha fazlasını yapacaksanız ve / veya mimariyle makul derecede yetkinseniz, MVC, temel yönlendirme modelinde (bir WebForms uygulamasında yönlendirmekten çok daha karmaşık olan) gerçekten ustalaşana kadar bir düz ceket gibi hissedebilir. O zaman bile, her zaman modelle savaştığımı ve beklenmedik sonuçlardan endişe duyduğumu hissettim.
Üçüncüsü, Linq ile ilgilenmiyorsanız (Linq-to-SQL'in kaybolacağından korktuğunuz için veya Linq-to-Entities'i gülünç bir şekilde aşırı üretildiğini ve güç altında bulunduğunu düşünüyorsanız) ASP.NET MVC iskele araçları Linq etrafında inşa beri bu yolu yürümek için (bu benim için katil oldu). Rails'in veri modeli, SQL'de deneyimli olmanız durumunda (ve özellikle TSQL ve saklı yordamlar konusunda bilgili iseniz) elde edebileceğinize kıyasla oldukça beceriksizdir.
Dördüncüsü, MVC taraftarları genellikle MVC görünümlerinin web'in HTML / CSS / AJAX modeline daha yakın olduğunu belirtir. Örneğin, "HTML Helpers" - vew sayfanızda içeriği değiştiren ve HTML denetimlerine yerleştiren küçük kod çağrıları - Javascript ile entegre edilmesi Web Formları denetimlerinden çok daha kolaydır. Ancak, ASP.NET 4.0 denetimlerinizi adlandırma yeteneği sunar ve bu nedenle bu avantajı büyük ölçüde ortadan kaldırır.
Beşinci olarak, MVC puristleri genellikle Viewstate'i deride tutarlar. Bazı durumlarda bunu yapma hakkı vardır. Bununla birlikte, Viewstate ayrıca harika bir araç ve üretkenlik için bir nimet olabilir. Karşılaştırma yapmak gerekirse, Viewstate'i kullanmak, bir üçüncü taraf web kontrollerini bir MVC uygulamasına entegre etmeye çalışmaktan çok daha kolaydır. MVC için kontrol entegrasyonu daha kolay olabilirken, gördüğüm tüm mevcut çabalar, bu kontrolleri görünümün Controller sınıfına (yani - MVC modeli etrafında çalışmak için) geri bağlamak için kod oluşturma ihtiyacından muzdariptir. ).
Sonuçlar
Ben MVC geliştirme birçok şekilde seviyorum (Rails ASP.NET MVC uzun bir atış için tercih rağmen). Ayrıca ASP.NET MVC'nin ASP.NET Web Formlarının bir "anti-desen" olduğunu düşünme tuzağına düşmemizin önemli olduğunu düşünüyorum. Onlar farklı ama tamamen yabancı değil ve kesinlikle her ikisi için de yer var.
Ancak, Web Formları geliştirmeyi tercih ediyorum çünkü çoğu görev için işleri halletmek daha kolaydır (istisna bir dizi CRUD formunun oluşturulmasıdır). MVC ayrıca bir ölçüde teorinin fazlalığından muzdarip gibi görünüyor . Gerçekten de, burada sayfa yönelimli ASP.NET bilen ama MVC deneyen insanlar tarafından SO üzerinde sorulan birçok sorulara bakın. İstisnasız, geliştiriciler çemberlerden geçmeden veya büyük bir öğrenme eğrisine dayanmadan temel görevleri yapamayacaklarını fark ettikçe dişlerin çok fazla gıcırdaması var. Bu kitabımda MVC üstün Web Formları kılan: MVC bir ödeme yapar gerçek dünya fiyatı veya daha kötüsü biraz daha test edilebilir kazanmak için basitçe görülecek serin kullandığınız çünküson teknoloji.
Güncelleme: Yorumlar bölümünde ağır eleştirildim - bazıları oldukça adil. Böylece, sadece bir sonraki büyük şeyde gerçekten eksik olmadığımdan emin olmak için birkaç ay geçirdim Rails ve ASP.NET MVC öğrenmek! Tabii ki, aynı zamanda soruya dengeli ve uygun bir cevap vermemi de sağlıyor. Yukarıdaki yanıtın, yorumların eşzamanlı görünmemesi durumunda ilk cevabımın büyük bir yeniden yazımı olduğunu bilmelisiniz.
MVC'ye daha yakından bakarken, bir süre için büyük bir mea culpa ile sonuçlanacağımı düşündüm. Sonunda, Web Formları mimarisine ve test edilebilirliğine çok daha fazla enerji harcamamız gerektiğini düşünürken, MVC'nin benim için çağrıya gerçekten cevap vermediği sonucuna vardım. Yani, ilk cevabımı akıllıca eleştiren insanlara içten bir "teşekkür ederim".
Bunu dini bir savaş olarak gören ve acımasızca aşağıdan gelen sel baskınları yapanlara gelince, neden rahatsız ettiğinizi anlamıyorum (birkaç kez birbirinden birkaç saniye içinde 20'den fazla oy kullanmak kesinlikle normal değildir). Bu cevabı okuyorsanız ve puanın diğer cevaplardan çok daha düşük olduğu düşünüldüğünde cevabımda gerçekten "yanlış" bir şey olup olmadığını merak ediyorsanız, genel anlamda topluluk (genel olarak, bu 100 defadan fazla oy kullanıldı).
Gerçek şu ki, birçok geliştirici MVC'yi umursamıyor ve aslında bu bir azınlık görüşü değil (blogların belirttiği gibi MS içinde bile).