İ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,