3 Aralık 2016 Cumartesi

ASP.NET WebForms ve ASP.NET MVC Karşılaştırması

ASP.NET WebForms: Sürekle-bırak bileşenlerin kullanıldığı, olay-tabanlı programlama yapılabilen, hazır server side kontroller bulunduran ve hızlı geliştirmeye elverişli bir mimari yapı sunan, web yazılımı geliştirme platformudur.
Avantajları:
Zengin sunucu kontrolleri(Rich Server Controls) desteği; ASP.NET Web Forms'ta MVC'den farlı olarak sunucu taraflı çalışan kontroller yer almaktadır (Button, Label, Textbox, GridView, ListView, ScriptManager vs.). Bu hazır kontroller sayesinde birçok işlem kolaylıkla gerçekleştirilebilmektedir. ScriptManager  sayesinde daha az Javascript bilgisiyle AJAX işlemleri kolaylıkla yapılabilir ve sunucu kontrollerinin sürükle/bırak özelliği sayesinde daha az HTML kodu kullanarak sayfalar geliştirilebilir. Ayrıca; saf HTML'de bilindiği gibi bazı şeyler her yerde aynı gözükmeyebiliyor. Internet Explorer'da harika gözüken bir arayüz Firefox'da bozuk gözükebiliyor ya da tam tersi bir durum söz konusu olabiliyor. ASP.NET sunucu kontrolleri web tarayıcısını algılayıp ona uygun HTML içeriği sunabiliyor. Ayrıca ASP.NET Web Forms , bir sayfaya özel işlevsellikler ekleyebilen Page Controller desenini kullanır.
ViewState desteği; Normalde HTTP'nin "stateless" yapısından dolayı , HTML kontrolleri sunucu istekleri arasında değerlerini korumazlar. Ama Web Formlar'da bu durum her kontrolün son bilinen değerinin form içinde ViewState denilen bir yapıda tutulması ile aşılmaktadır. Web Forms için önemli derecede performans kaybı yaşatan View State, farklı açıdan bakıldığında yazılım geliştiricinin sayfa içinde tutması gereken değerleri/verileri kaybetmemek için sıklıkla kullandığı bir yöntemdir ViewState kullanımı sırasında çok büyük veriler saklanmadığı sürece bu konu Web forms için avantaj olarak düşünülebilir.
Olay tabanlı programlama(Event Driven Programming); Olay tabanlı programlama ile geliştirici, kullanıcı etkileşimi ile ilgilenmek için POST ve GET metotlarına bağlı kalmıyor. Bir düğmeyi sayfaya sürükleyip, ona çift tıklayarak kullanıcı düğmeye tıkladığında olacak şeyleri kod tarafında yazabiliyor. Bu yapı eğer dikkatli bir şekilde kullanılırsa, yazılım geliştiriciye büyük kolaylık sağlamaktadır. Oluşturulan olay (Event) metodu içerisinden Asp.Net'in diğer sunucu kontrollerine erişip, içerisindeki verilere müdahale edilebilmektedir.
Yukarıdaki sebeplerden dolayı yazılım geliştirici arka plandaki karmaşıklıklardan soyutlanmış olmaktadır. Sunucu kontrolleri ve ViewState'ler sayesinde daha az seviyede HTML ve JavaScript bilgisiyle yazılım geliştirici, kolay ve hızlı bir şekilde web uygulamaları geliştirebilmektedir.
Dezavantajları:
Proje Yapısı; ASP.NET Web Formları'nda varsayılan olarak gelen bir proje yapısı yoktur. Genel geçer bir proje yapısıda henüz oluşmamıştır. Herkes kendi yapısını oluşturabilir. Proje geliştikçede bu büyük bir sıkıntı olmaya başlayacaktır.
Test edilebilirlik(Unit Tests); Birim testleri yapmak çok zordur. Çünkü proje içerisindeki CodeBehind tarafında çok fazla olay tabanlı fonksiyon vardır. Ve bu fonksiyonlar iki tane parametre (Object sender, EventArgs e) içerir. Bu fonksiyonları test etmek için bu parametrelerin gönderilmesi gerekir.
Performans; Klasik ASP'deki sorunlara çözüm olan ViewState, çok kullanıldığında, aynı zamanda bir sorun haline gelebilmektedir. ViewState'ler sayfa içinde tutulduğu için sayfanın boyutunu arttırmakta ve bu da performansın düşmesine sebep olmaktadır.
HTML üzerinde daha az control; Bir çok durumda en sonunda nasıl bir HTML elde edeceğimizi bilmediğimiz için jQuery gibi JavaScript kütüphanelerinin entegrasyonu zorlaşmaktadır. Web forms ile çok fazla html kodları yönetilememektedir. Yani; sürükle bırak mantığı ile geliştirilen formlar RAD(Rapid Application Development) anlayışına uygundur ama web formlar sürekli bu şekilde geliştirildiğinde istemciye dönen HTML üzerindeki kontrol de azalır. Bu nedenle server-side olarak sunulan kontrollerin istemciye ulaştığında ID’lerini yönetmek, bu kontroller üzerinden ID Management yapmak ve JQuery gibi frameworkler ile entegrasyon yapmak çok zor hale gelir.
Arama Motoru Optimizasyonu; URL'ler bazı query string'ler ile şekillendirilebilen sabit ASPX sayfalarını göstermektedir. Bu URL’ler kullanıcı dostu olmadığı gibi aynı zamanda arama motorlarında da bulunabilirliği azaltmaktadır. Arama motoru optimizasyonu için biraz çaba harcamak gerekmektedir. Özellikle URL-Routing konusunda, hazır çözümler bulunmamaktadır.
Reusability(Tekrar kullanılabilirlik); Tekrar kullanılabilecek kodları yazmak genelde anlamsızdır. Bir formun CodeBehind tarafında tanımlanan bir GridBind olayının başka bir formun, CodeBehind sayfasında kullanılması mümkün değildir. Bunun için farklı stratejiler geliştirmek gerekir. Bu da yazılım maliyeti demektir.
Takım Çalışmasında Yetersiz; Aspx sayfaları ile onlara bağlı sunucu taraflı CodeBehind sayfaları ile beraber çalışılması gerekir. Çünkü istemci tarafı (aspx) sunucu tarafı (code-behind) ile birebir bağımlıdır. Aynı anda aynı sayfada birden fazla yazılım geliştiricinin çalışması kod karışıklığına neden olabilmektedir. Bu yüzden takım çalışmasına uygun çalışmak oldukça zordur.

ASP.NET MVC(Model-View-Controller):

Model'ler: Model; bileşeni, veriyi temsil eder. Uygulamanın veri alanıyla ilgili mantığını uygulayan parçasıdır. Model'ler uygulamadaki bir varlığın özelliklerini ve davranışlarını kapsar. Örneğin, Ürün adında bir nesne bir uygulamadaki ürünü temsil edebilir ve ÜrünAdı, ÜrünKodu gibi özelliklere sahip olabilir. Genellikle model nesneleri model durumunu veri tabanlarından alır ve veri tabanlarında saklar.
View'lar: View; model veya model'leri görsel bir sunuma dönüştürmekle sorumludur. Web uygulamalarında bu, kullanıcının tarayıcısında görüntülenecek HTML'in oluşturulması anlamına gelir. Tabii ki view'lar farklı formlara sahip olabilirler. Mesela aynı model HTML, PDF, XML hatta excel dokümanı olarak temsil edilebilir. View'lar "Separation of Concerns" mantığından dolayı verinin nasıl alındığıyla değil, sadece verinin nasıl gösterileceğiyle ilgilenmelidir. Kısacası view'lar kullanıcı arayüzünü temsil etmektedir.
Controller'lar: Controller; adından da anlaşılacağı gibi, uygulamanın işleyişini kontrol eder, view ve model arasında koordinatör gibi davranır. Controller kullanıcıdan girdiyi alır, sonra bazı işlemler gerçekleştirmek için model ile çalışır ve sonucu view'a aktarır. Diğer bileşenlerde olduğu gibi controller, verinin nasıl alındığıyla ya da sonucun kullanıcıya nasıl aktarıldığıyla ilgili bir bilgiye sahip değildir. Kısacası controller, MVC pattern içerisindeki kullanıcı etkileşimini sağlayan bileşendir diyebiliriz.
Özetle; Model; veriye ulaşan, View; veriyi sunan, Controller; veriyi işleyen katmandır.
Asp.Net MVC, hiçbir zaman Asp.Net Web            Forms’un rakibi değil bir alternatifi olarak ortaya çıkmıştır. Büyük veri kaynaklı internet projelerinde Asp.Net MVC kullanmak, hem sayfa hızlarında hem de server kaynakları kullanımında önemli bir performans artışı sağlar.
MVC Framework’ünün çıkmasının asıl nedeni ise User Interface ve Data katmanlarının birbirinden ayrılmasını zorunlu kılmaktır. Bu sayede geleceğe dönük, uygulamanın geliştirilebilirliği de artmaktadır. Daha az satır kod ile daha rahat ve kısa sürede değişiklikler yapılabilecektir. Yani tüm dünyada geçerliliği olan SOLID kod prensiplerine göre yazılım projeleri geliştirme imkanına sahip olunacaktır.
MVC ‘ye gereksinim duyulmasının diğer nedenleri; WebForms’daki kontrollerin istenildiği gibi yönetilememesi ve karmaşık sayfa çıktılarıdır. Asp.net WebForms projelerinde PostBack sonrasında da sayfadaki verilerin tutulması için kullanılan ViewState büyük ölçekli projelerde kullanıldığında boyutu giderek artmakta ve sayfaların geç açılmasının yanısıra Server’a da ayrıca yük bindirmektedir. Oysa Asp.Net MVC de ViewState ve PostBack yoktur.
Avantajları:
Proje Yapısı; ASP.NET MVC varsayılan olarak belirlenmiş bir proje yapısına sahiptir. Model-View ve Controller pattern’ına sahip, her kod geliştirme katmanı birbirinden bağımsız olarak ayrılmıştır. Bu pattern’ın kullanılması, uygulama geliştirmede karşılaşılan karmaşıklıkların önüne geçmiştir.
Test Edilebilirlik ve Reusability; MVC'de her kod geliştirme katmanı birbirinden bağımsız olarak geliştirilebilmektedir. Bu ise “Test Driven Development” yapabilmemizi sağlamaktadır. Yazılan kodun test edilebilirliği ise bize kodun tekrar kullanılabilirliğini(reusability) sağlar.Yani aynı kodu tekrar tekrar yazmaya gerek kalmaz. “Spagetti Kod” yazmaktan kurtulmuş oluruz.
Performans; ASP.NET MVC'de ViewState ve PostBack yoktur. ViewState kullanmadığı için ise sayfa içerisinde gereksiz veri tutulmamaktadır. Ayrıca; ViewState büyük ölçekli projelerde kullanıldığında boyutu giderek artmakta ve sayfaların geç açılmasının yanısıra Server’a da ayrıca yük bindirmektedir.Bu yüzden ViewState’in olmaması, çok ciddi bir performans artışı sağlamaktadır. Aynı kodun tekrar tekrar yazılmamasının da sayfa performansına katkısı vardır.
ASP.NET Web Forms ile geliştirilen projelerde, kullanılan kontroller nedeniyle (server side web controls) istemciye ciddi miktarda raw HTML döner. Sayfa render edildiğinde bu görülebilir. Fakat MVC’de HTML formlar Web formlara göre çok daha küçüktür, bu da sayfanın hızlı render edilmesini sağlamaktadır.
HTML üzerinde tam control; ASP.NET MVC, sunucu kontrollerini kullanmaz. Tek seçenek HTML input kontrollerini kullanmaktır. Yani en sonunda elde edeceğimiz HTML'in kontrolüne sahip  oluruz. HTML kontrollerinin yönetimi ve sunucuya istek gönderimi için; istemci taraflı yazılım API’lerinden, jQuery gibi JavaScript kütüphaneleri kullanılmaktadır.
Bağımsız development desteği; Asp.Net WebForms'ta bir işlem için sadece bir kişinin kodlama yapması daha sağlıklıdır. ASP.NET MVC katmanları birbirinden bağımsız olduğundan, çalışma takımındaki; bir kişi Controller, ikinci kişi View ve üçüncü kişi de Model üzerinde birbirinden bağımsız eş zamanlı olarak kod geliştirebilmektedir. Bu ise; efektif yazılım geliştirebilme, takım çalışması yapılabilmesi ve  yazılım geliştirme süresinin kısaltılabilmesi demektir.
Arama motoru optimizasyonu(SEO); Varsayılan olarak tanımlı bir URL routing bulunur. Bu routing sistemini spesifik olarak genişletme imkanımız vardır. Böylece anlaşılır URL’ler üretme imkanına sahip olunmaktadır. Üretilen spesifik URL’lerin SEO ya katkısı da oldukça fazladır.
Genişletilebilirlik; ASP.NET MVC Razor, Spark, NHaml, …v.s gibi birden fazla görüntü motorunu(View Engine) destekler. Hatta gerekirse yazılım geliştiriciler kendi görüntü motorlarını oluşturup implemente edebilmektedirler.
Dezavantajları:
Olay tabanlı programlamanın, ViewState ve PostBack’ in olmayışı, temel HTML, JS ve CSS bilgisine gereksinim duyulması, yeni başlayan Web Application Developer lar için biraz daha fazla öğrenme çabası gerektirmektedir.
ASP.NET WebForms’tan ASP.NET MVC’ye geçiş yapılmak istendiğinde; direk Upgrade veya Migration mümkün olmamaktadır.
ASP.NET WebForms mu? ASP.NET MVC mi?
Peki bir web yazılımı projesi geliştirirken, yukarıda bahsettiğimiz yazılım geliştirme platformlarından hangisini tercih etmeliyiz?
Yukarıda, ASP.NET WebForms  ve ASP.NET MVC platformlarının birbirinin yerine değil de yazılım proje gereksinimlerinin değişmesine bağlı olarak ortaya çıktığını ifade etmiştik. Yani bir Web uygulamasında aynı anda hem ASP.NET WebForms, hem de ASP.NET MVC API’leri kullanılabilmektedir. Bu yüzden; Yazılım ekibindeki personelin yazılım geliştirme yetenekleri, geliştirilecek olan yazılımın teknik ve donanımsal alt yapısı, geliştirilecek olan yazılımın diğer tüm gereksinimleri(istenilen bitirme süresi, …vs.) gibi kriterlere göre yukarıda belirttiğimiz avantaj ve dejavantajları göz önünde bulundurarak karar vermek gerekir. Örneğin kısa zamanda bitirilmesi istenen küçük bir proje için ASP.NET WebForms u , ancak büyük ölçekli bir yazılım projesi için ise ASP.NET MVC ‘yi tercih etmek daha doğru olur, gibi. Karar verebilmek için mutlaka; yazılım proje gereksinimlerinin, kullanılacak yazılım geliştirme platformunun avantaj ve dezavantajlarına göre ele alınarak değerlendirilmesi gerekmektedir.

Kaynaklar:

Hiç yorum yok :

Yorum Gönder