Osman KURT

Kendime Not

Neden ASP.Net MVC Diyenlere Gelsin

ASP.NET Web Forms’un Nesi Yok ki!?

Aslında kısa cevap olarak, “fazlası” bile var denilebilir. Evet belki de Web Formları ilk zamanlarda çok iyi bir fikirdi. Fakat gerçekte durum biraz daha karışık. Gerçek hayatta Web Formlarını projelerde kullandıkça bazı durumlar ortaya çıkmıştır. Tabi bu durumlar zaman içinde bir çok kullanıcının deneyimi ile ortaya çıkmış eksikliklerdir. Bu eksiklik ya da gereksiz fazlalıkları şu şekilde maddelendirebiliriz:
•View State Ağırlığı: View State olarak bilinen, istekler arasında durumları muhafaza etme mekanizması, client ve server arasında çok büyük boyutlarda veri transferine sebep oluyor. Bu veri boyutu, mütevazi bir sitede bile yüzlerce kilobayta varabiliyor. Üstelik bu veri, gönderilmekle kalmıyor tekrar geri geliyor ve her istekte veri iletimindeki miktar katlanarak büyüyor. Bu server üzerindeki bandwidth kullanımını artırdığı gibi, sitenin yavaş tepkilerinden dolayı site ziyaretçilerinin sinirlerinin bozulmasına da sebebiyet veriyor.
•Sayfa Yaşam Döngüsü: Sayfa yaşam döngüsünün önemli bir parçası olan, client yani istemci tarafındaki event‘lar(olaylar) ile server tarafındaki event handler kodları arasındaki iletişim, aşırı derecede kompleks, karışık ve bir o kadar da narin, çıt kırıldım olabiliyor. Çok az geliştirici View State hataları olmadan çalışma zamanında bileşenlerin(kontrollerin) üzerinde düzgün bir şekilde değişiklik yapabiliyor ya da çok az geliştirici gizemli bir şekilde çalışmayan event handler‘ları farkedebiliyor.
•Kod Ayrımı Hakkındaki Yanlış Düşünceler: ASP.NET’in code-behind modeli, HTML kodları ile uygulama kodlarını farklı bir dosyada ayırmaya yarıyor. Sunum kısmı ile uygulama kod kısmını ayırdığı için bu model, oldukça alkış getirdi ve takdir gördü. Fakat gerçekte, geliştiriciler sunum kodları(server kontrollerini değiştirmek gibi..) ile uygulama mantık kodlarını(veritabanını kodları gibi…) bu korkunç code-behind sınıflarında birleştirmeye başladılar. Bu da çoğu zaman manasız ve narin, kolay bozulan bir sonuca dönüşmesine yol açmıştır ve açmaktadır.
•HTML Üzerinde Kısıtlı Kontrol: Server kontrolleri kendilerini HTML olarak render ederler yani bize sonuç HTML kodları olarak gelir. Fakat bu çoğu zaman sizin istediğiniz HTML kodundan gereksiz bir çok kod barındırır. ASP.NET 4′den önce genellikle bu çıktı kodu, web standartlarına uygun değildi veya bunlar üzerinde iyi bir CSS kullanımını zorlaştırıyordu. Ayrıca server kontrolleri Javascript tarafından ulaşılması zor olan, tahmin edilmesi zor ve karışık ID değerleri üretiyorlardı. Her ne kadar ASP.Net 4 ile bu problemler azaltılmışsa da beklediğiniz HTML’yi elde etmeniz halen sıkıntılı olabiliyor.
•Zayıf Soyutlama: Web Formları mümkün olduğunca HTML’yi sizden gizlemeye çalışır. Yeni ve özel bir davranışı tanımlamaya çalıştığınızda, genellikle bu soyutlamayı bozarsınız. Ki bu sizi postback event mekanizmasında ters mühendislik metodları kullanmanızı ya da istediğiniz HTML’yi elde etmek için duygusuz ve absürd kodlar yazmanıza sebep olur. Ben buna amele mantığı kod yazmak diyorum . Ek olarak tüm bu soyutlama hadisesi, işin ehli web geliştiricileri için sinir bozucu bir engelden öteye gidememektedir.
•Düşük Test Edilebilirlik: Her ne kadar unit-test yani otomatikleştirilmiş testlere ilgim olmasa da, unit-test kullanan geliştiriciler için Web Formları bir çileden ibaret olmuştur. Web Formlarının bu kapalı hali unit testi için uygunsuz bir durum teşkil etmektedir Projeye unit-test dahil etmenin zorluğu da cabası…

Her ne kadar ASP.NET 4 ile burada bahsedilen bazı problemlere çözüm getirilmeye çalışılmışsa da halen çoğu kısıtlamalar ve eksikliker aynen durumunu muhafaza etmektedir.

Model, View, Controller

MVC başlıca şu üç ana daldan oluşan bir yazılım geliştirme tekniğidir:
•Model: İletimde kullanılan ya da veritabanı gibi ortamlarda kullanılan veriyi ifade eden basit sınıflardır. Web programlamada bu genelde formun POST verileri ya da veritabanındaki bir tabloyu ifade eden bir sınıf olabilir. Sonuçta View ve Controller arasında veri iletimini Modeller ile gerçekleştirmekteyiz.
•View: Sunum kısmıdır. Yani bu web prgramlama için html sayfasıdır. Razor söz konusu olduğunda dosya uzantısı “.cshtml” dir. Eğer Aspx görünüm motoru kullanılıyorsa bu uzantı “.aspx” olacaktır. Görünüm motorları(View Engine) ve Razor hakkında ileride daha genişçe bahsedeceğiz.
•Controller: Esas iş gören uygulama kodlarıdır. Mesela bu, form verilerini veritabanına ekleyen bir sınıf olabilir. Sonuçta view katmanının kullanıcıya gösterilmesi için gerekli işlemleri controller gerçekleştirecektir.

Sizi çok terim ile boğmak istemiyorum. Daha fazla bilgi edinmek isterseniz burayı ziyaret edebilirisiniz.

Bir iletişim sayfasını gözümüzün önüne getirelim. Ne vardır basit bir iletişim sayfasında? Ad soyad, e-posta gibi bilgilerin girildiği bir textbox, mesajın yazılacağı bir textarea ve mesajın gönderileceği bir submit düğmesi. Submit düğmesine tıkladığınız anda, form post edilir ve gerekli kontroller yapılarak e-posta gönderilir ya da kullanıcıya hata verilir. MVC mantığı ile düşündüğümüzde, içinde textbox, textarea, button bulunduran sayfamız View katmanıdır. Form post olduktan sonra gelen verilerin uygunluğunu test eden ve e-postanın gönderimini sağlayan kısım ise Controller‘dır. Model ise bu iki katman arasında gelip giden form’un post verilerinin şablonudur. Bu örnek için textboxlardaki ad soyad ve e-posta bilgileri ve textarea’daki mesaj verisi Model ile ifade edilir.

Model ve Controller “.cs” uzantılı bir dosyada bulunan sınıflardan ibaretken View “.cshtml” uzantılı c# ve html kodlarının karışık olduğu bir dosyadır. Bu uzantıların C#’a ait uzantılar olduğunu ifade etmek istiyorum. Eğer Vb.Net kullanıyorsanız bu uzantılar “.vb” ve “.vbhtml” olacaktır. Veya Razor yerine başka bir görünüm motoru kullanıyorsanız “.cshtml” uzantısı değişiklik gösterecektir.

MVC aslında yeni bir teknoloji olmadığı gibi mucidi Microsoft da değildir. MVC, kökleri 1978 yılına dayanan ve Xerox PARC da Smalltalk projelerinde kullanılmış bir yöntemdir. Fakat günümüzde web programlamada ciddi ölçüde popülerlik kazanmıştır. Özellikle Ruby on Rails ile bu had safhaya ulaşmıştır. Ruby on Rails‘in bu popülerliği o kadar artmıştır ki Microsoft’un gözünü açmasına sebep olmuştur. Ruby on Rails‘in bu başarısını, kullandığı dilden çok, içine monte edilen MVC ve ORM mimarilerine bağlamak gerekir. Microsoft sadece MVC’ye el atmamış, ayrıca bir ORM mimarisi olan Entity Framework ve beraberinde LINQ de .NET’e dahil olmuştur. Evet ORM’nin ünlü olmasına sebep LINQ ve Entity Framework değildir aslında.

Şu an için bir çok dilde MVC yapısını kullanan kütüphaneler mevcuttur. Mesela php’de CakePhp, Symfony ve Mojavi MVC kütüphanelerine en güzel örneklerdendir. Fakat bulabileceğiniz çoğu MVC kütüphanesi Rails’den esinlenmiştir.

Belki şu an için kafanızda MVC ne olduğuna dair somut bir fikir oluşmamış olabilir. Makelenin sonununda vereceğimiz küçük örneği kendiniz yaparak somut fikir edineceğinizi tahmin ediyorum.

ASP.NET MVC

MVC mimarisi, Web Forms mimarisinden farklı bir yapıya sahiptir. Web Formlarında tut-taşı mantığı ile çok hızlı bir şekilde siteler oluşturabilirsiniz. Fakat iş yukarıda da bahsettiğimiz gibi özelleştirmeye ve temiz html kodlarına geldiğinde, durum biraz değişiyor. ASP.NET MVC, temiz, standartlara uyumlu html kodları üretmenin farkındadır. Ve barındırdığı Html yardımcı metodları, Web Formların aksine, ciddi ölçüde temiz ve standart uyumlu kodlar üretirler. Küçük bir kontrol için bile bir çok hantal ve karışık kodlar üretmek yerine, CSS ile şekillendirilmiş gayet basit ve hoş kodlar üretir.

Hemen akla gelen, Web Formlarındaki gibi, kodları hazır, menü ve tarih seçici gibi bileşenleri olsa iyi olmazmıydı. Bunun için en iyi çözüm jQuery gibi javascript bileşenleri olacaktır. İşin gerçeği Web Formları kullanırken bile Web Formlarının varsayılan bileşenleri yerine bu tarz bileşenleri daha fazla kullanmaktayız. Bununla birlikte ASP.NET MVC dahili jQuery desteğine sahiptir. Eğer bir fikir edinmek isterseniz buraya göz atabilirsiniz.

Web Formlarının aksine, ASP.NET MVC ile üretilmiş sayfalar View State namına hiç bir veri içermezler. Bu yüzden küçük bir site için bile yüzlerce kilobayt boyutunda olan bu hantallıktan kurtulmuş olursunuz.

Ayrıca ASP.NET MVC mükemmel bir yönelendirme sistemine sahiptir. Bu sayede şu şekildeki bir urlyi:

/web_motoru/Makaleler/Default.aspx?islem=goster&makale_id=41567&sayfa=1

daha temiz ve kullanıcılar için ve seo için daha uygun bir şekle zahmetsizce çevirebilirsiniz:

/makale/mvc-ve-razor/sayfa-1

Böylesine bir yapı hem SEO için hem kullanıcılar için hem de güvenlik için daha kullanışlı olacaktır.

Bunun dışında söyleyebileceğim başka bir şey de, ASP.NET MVC’nin açık kaynak kodlu olduğudur. Bunun bize getirdiği en büyük faydalardan biri şüphesiz debug aşamasında ortaya çıkmaktadır. Sistem bileşenlerinin nasıl çalıştığını görebileceğiniz gibi geliştiricilerin yorumlarını bile kodlarda görebilirsiniz.

Başka bir şey ise, MVC stateless dediğimiz bir yapıya sahiptir. Yani Web Formlarında olduğu gibi sayfanın o anki durumu kayıt altında tutulmaz. Tersine bu yapıya tamamen karşı bir yapıya sahiptir. Bu yüzdendir ki önceden bahsettiğimiz gibi View State’e ihtiyaç duymaz ve kullanmaz.

Razor

Microsoft sadece MVC ve ORM mimarilerini ASP.NET ortamına taşımakla kalmamış yeni bir görünüm motoru da kazandırmıştır. Görünüm Motoru(View Engine), uygulama kodları ile(bu makale için C#), html ve benzeri text tabanlı verileri iç içe kullanmanızı sağlar. ASP.NET MVC için tanımlanmış bir çok görünüm motoru bulunmaktadır. Bunların başlıcaları, Spark, SharpTiles, NHaml, WebForms(ASPX) ve Razor.

Kısacası; Spark, html benzeri bir gramere, SharpTiles java kullanıcılarına yakın bir gramere ve NHaml ise Rail benzeri bir gramere sahip. WebForms ise bildiğimiz ASPX görünüm motorudur. Tüm kodlar <% ve %> işaretleri arasına yazılır.

Razor, Microsoft tarafından geliştirilmiş olan yep yeni bir gramere sahip bir görünüm motorudur. Yeni gramer derken sakın korkmayın. Çünkü Razor diğer görünüm motorlarında olduğu gibi sizi yeni bir grameri öğrenmek zorunda bırakmaz. Kullanacağınız dil yine C# gibi bir .net dili olacaktır. Kısaca Razor:
•Az yer kaplayan, kompakt, anlamlı ve akıcı bir yapıya sahiptir.
•Öğrenmesi çok kolaydır.
•Sizi yeni bir dil öğrenmek zorunluğundan kurtarır.
•Çok çok iyi bir Intellisense desteği mevcuttur.
•Unit-test’lerine uygun bir yapısı mevcuttur.

Kaynak: Fatih Tolga ATA, bu yazı o kadar açıklayıcı olmuş ki soran arkadaşlar için iyi olur dedim :D

.Net yazılım uzmanı