İlkay İlknur

just a developer...

MVVM (Model-View-ViewModel) Nedir ?

Merhaba Arkadaşlar,

Bir uygulamayı geliştirirken göz önüne almamız gereken en önemli noktalardan biri de uygulamanın genişletilebilir, bakılabilir ve ölçeklenebilir bir biçimde geliştirilmesi noktasıdır. Özellikle uygulamalarımızı geliştirirken uygulamaların daha sonra hiç değişmeyeceğini düşünerek genelde geliştirmelerimizi yapmaktayız. Daha spesifik olarak konuşursak Silverlight kullanarak geliştirdiğimiz uygulamalarda da doğrudan ekranın arkasında bulunan .cs uzantılı dosya içerisinde tüm uygulama mantıklarını, arayüz mantıklarını ve daha pek çok başka konularla ilgili kodları yazmaktayız. Bu şekilde bir uygulama geliştirdiğimizde dolayısıyla tüm servis çağırımları, ekran işlemleri karmakarışık bir biçimde burada bulunmakta. Uygulamamıza yeni bir istek geldiğinde ise dolayısıyla burada bulunan kodları karıştırmaktayız ve kodlar içerisinde ister istemez kaybolmaktayız. Yada örneğin web üzerinde geliştirdiğimiz Silverlight uygulamamızı Windows Phone 7 üzerinde çalışacak bir biçimde yazmamız gerektiğinde elimizde hazır bir yapı olmadığı için ister istemez tüm mantıkları sıfırdan bu sefer WP7 uygulaması için yazmaktayız. Aslında baktığımızda uygulama geliştirme mantıkları birbiriyle neredeyse aynı olan 2 farklı platformdaki uygulamaların sadece arayüz kısımlarını değiştirmek suretiyle birbirine çevrilmesi mümkün olabilir gibi geliyor aslında ? Çok fazla yaptığımız hatalardan bahsedip çıldırmadan biraz daha derine inelim ve bu kötü alışkanlıklardan nasıl kurtulabiliriz bir bakalım.

Uygulama geliştirirken göz önünde tutmamız gereken noktalardan biri de uygulama içerisindeki kavramların birbirinden ayrık biçimde çalışacak biçimde geliştirilmesi(Seperation of concerns). Bu şekilde bir uygulama geliştirme mantığı benimsediğimizde uygulamamız içerisinde bulunan yapılar birbiri ile sıkı sıkıya bağlı olmayacak ve böylece birinde yapılacak olan değişiklikler diğer yapıları olabildiğince az etkileyecek. Aslında bu söylediklerimizin hepsi gerek web uygulaması olsun gerek windows uygulaması olsun gerek se mobil uygulama olsun tüm uygulama türlerinde geçerli. Web tarafına baktığımızda aslında kavramların birbirinden ayrılmasını sağlayan bir pattern (Model-View-Controller(MVC)) bulunmakta.

Silverlight tarafına baktığımızda yapı klasik web uygulamalarına göre biraz farklı. Aynı farklılıklar ise aslında benzer yapıları itibariyle WPF ve Windows Phone uygulamalarında da bulunmakta. Bu bahsettiğimiz uygulamalara baktığımızda ise yaklaşık 1-1.5 senedir kullanılmakta olan bir yapı bir mimari model karşımıza çıkmakta. Bu yapının adı ise Model-View-ViewModel yani MVVM. MVVM patternının temeline indiğimizde ise Martin Fowler'ın önermiş olduğu Presentation Model'i görmekteyiz. Aslında MVVM, Presentation Model mimarisinin WPF ve Silverlight teknolojileri için özelleştirilmiş bir halidir. Doğrudan Silverlight ve WPF için özelleştirilmiş bir uygulama geliştirme mimarisi olduğu içinde haliyle bu teknolojilerin tüm özelllikleri fazlasıyla bu mimari model içerisinde kullanılmakta.

Şimdi isterseniz MVVM yapısının temel parçalarından kısaca bahsedelim.

Model :  Model, uygulama içerisinde kullanacağımız olan datadır. Bu datalar WCF RIA Services ile döndürülen entityler olabileceği gibi doğrudan tanımlanmış POCO nesneleri de olabilir.

View : View, datanın sunulduğu katmandır. Tüm görsellikler View'da yer alır. Kısaca verinin sunulduğu yerdir(Ekran).

ViewModel : ViewModel ise Model ile View'ı bağlayan yapıdır.  View ile Model arasında bir yapıştırıcı görevi görür. View doğrudan ViewModel yardımıyla Model'e erişir ve bazı işlemleri gerçekleştirir. Teknolojik olarak WPF veya Silverlight teknolojilerinden konuşursak ViewModel aslında View'ın DataContext'idir.

MVVM yapısına baktığımız zaman WPF ve Silverlight teknolojilerinde bulunan Commanding, Binding, Behaviour gibi özelliklerin sıklıkla kullanıldığını görmekteyiz. Bir sonraki yazımızda da bu konuları uygulamalı olarak görüyor olacağız.

Bu kısa tanıtım yazımızı sonlandırırken MVVM'in getirdiği artıları aşağıdaki bir kaç madde ile özetleyebiliriz.

  • Commanding, Binding, Behaviour gibi özellikleri kullanarak dekleratif programlama özelliklerini kullanarak hızlı ve etkin uygulama geliştirme.
  • View arkasında bulunan kod dosyası içerisinde sıfır kod yazarak bağımlılıkları minimuma indirmek ve uygulama içerisinde katmanların bağımlılıklarını minimuma indirmek.
  • Daha genişletilebilir, bakımı yapılabilir ve test edilebilir uygulamalar geliştirmek.
  • Arayüzü kolay bir şekilde taşınabilen uygulamalar geliştirmek.
Evet arkadaşlar bu yazımızın da sonuna geldik. Bir sonraki yazımızda uygulamalı olarak MVVM'e giriş yapıyor olacağız ve MVVM için geliştirilmiş olan MVVM Light Toolkit yardımıyla ilk uygulamamızı ve temel yapıları daha detaylı biçimde inceliyor olacağız.
Görüşmek Üzere,


Yorum Gönder


Yorumlar

  • profile

    Dâvûd

    • 3
    • 4
    • 2012

    Güzel yazınız için teşekkürler Helvetia'lı bir adam şu MVVM Light'ı yazan USA de çalışıyor şurda http://channel9.msdn.com/Events/MIX/MIX10/EX14 videoları var.Aksanı da biraz garip ama anlaşılıyor,arayüzün taşınabilir olması,wpf wp7 gibi platformlar için kodum Model ve ModelView kısımlarının taşınabilir olduğunu göstermiş bir diğer videosunda da http://channel9.msdn.com/Events/MIX/MIX11/OPN03 ayrıca blendable diye bir kelime uyduruyor arkadaş,yani kodun view kısmının design timeda sağlıklı çalışması ve Design modda isek dummy data sağlayarak nasıl blend üstünde design modda veriyle tasarım yapabileceğimizi gösteriyor. Aslında kendisinin de belirttiği gibi MVVM bir teknoloji değil, bir tasarım deseni, yoğurdu yiyiş biçimi, o da önemli tabii üstüne başına bulaştırarak yemek var bide ağzınla yemek :D Webde böyle paylaşımlar görmek güzel.Devamını bekleriz, design pattern'larla ilili şu siteyi de tavsiye etmeden bu gevezeliğe bir son veremiyeceğim http://www.dofactory.com/Patterns/Patterns.aspx

  • profile

    ilkayilknur

    • 9
    • 12
    • 2011

    @Can Merhaba, MVVM konusu yazacak makalelerim arasında. Bu yazı dizisine devam ediyor olacağım. Ara verdiğim için özür dilerim arada başka makaleler yazmaya karar verdim. Ancak kısa bir sürede devam yazılarını yazmayı planlıyorum.

  • profile

    Can

    • 8
    • 12
    • 2011

    Devami uygulamali olarak gelecek denmis fakat ne yazikki gelmemis. Burak Selim in talebesinin bu sekil yarida birakmamasi gerekirdi egitimini yada verdigi sözü tutmaliydi.

  • profile

    Serdar

    • 29
    • 5
    • 2011

    Çok güzel ve temel bir anlatım olmuş. Teşekkürler.

  • profile

    Tarık

    • 31
    • 3
    • 2011

    Böyle bölüm bölüm anlatılması çok güzel olmuş,uzun uzadıya anlatınca ne anlıyoruz nede okuyacak göz kalıyor.