Nedir Bu MVP (Model View Presenter) Tasarım Deseni?

İsmail Güngör
3 min readMar 21, 2019

Herkese merhaba,

Bu yazımda sizlere Android uygulamalarda temiz, okunabilir ve test edilebilir kod yazmak için büyük öneme sahip tasarım desenlerinden biri olan MVP’den bahsedeceğim.

Android uygulama geliştirmeye başladıktan 8 ay sonra kendime göre çok güzel kod yazıyordum. Yaptığım işleri fonksiyonlara ayırmıştım, kodum çok iyi çalışıyordu ve benim kodumu okuyan insanlar ne yapmaya çalıştığımı anlayabilirlerdi.

Ama bir dakika!

Daha önce kimseyle beraber büyük bir proje geliştirmemiştim ki! Buna nasıl karar verebiliyordum! Aslında çok da güzel kod yazmadığımı işe girip, takım arkadaşımla beraber kod yazmaya başladığımızda anladım.

Yazdığım kodda şu sorunları fark etmeye başladım:

  • Bütün kodları Activity içerisine gömüyordum. 1000 satıra ulaşan Activity sınıflarım vardı ve proje büyüdükçe Activity sınıfı da doğal olarak şişiyordu.
  • Neredeyse hiç yardımcı sınıf kullanmıyordum.
  • Yazdığım koda test yazamıyordum.
  • Takım arkadaşımla aynı iş üzerinde çalışmamız zorlaşıyor, kod sürekli “conflict” oluyordu.

Sonra MVP ile tanıştım. İlk başlarda alışma sürecim zor olsa da (neden bunu yapıyoruz ki, her şeyi şu buton click listener altına yazim düşüncesi aklımdan gitmiyordu bir türlü) zamanla faydasını daha çok görür oldum.

MVP’deki Model-View-Presenter Ne Anlama Gelmektedir?

Model: Kullanıcı arayüzünde (view) görüntülenecek veya başka bir şekilde davranacak verilerin işlendiği kısımdır (event gönderme vb.). Presenter’ın ihtiyaç duyduğu bilgileri sağlar. İş mantığı bu kısımda ele alınır.

View: Verilerin görüntülendiği ve işlem yapmak için kullanıcı ile etkileşime geçilen kısımdır. Activity, fragment, dialog vb.

Presenter: Model ile View arasındaki bağlantıyı sağlayan kısımdır. Verileri modelden alır ve UI mantığını uygular. Ayrıca View’dan gelen kullanıcı etkileşimlerine tepki verir.

MVP Nasıl Davranır?

MVP tasarım deseninde iki çeşit View kullanılabilir.

  • Supervising Controller View
  • Passive View

Benim tercih ettiğim ve bu yazıda kullandığım View çeşidi “Passive View”’dir.

View hiçbir şekilde iş mantığına sahip olmamalıdır. Model sınıfı ile etkileşimde bulunamaz. Presenter tarafından kendine verilen emirleri yerine getirmeli ve Presenter’a kullanıcının etkileşimlerini haber vermelidir.

Presenter ise View tarafından bilgilendirildikten sonra ki süreci yürütmekle görevlidir. UI mantığını tamamen Presenter yönetmektedir. Presenter, View’i interface üzerinden tanımaktadır.

Şöyle bir örnek yapalım. Ekranda bir Button ve Textview olsun. Button’a basınca Textview’de tarih görülsün.

MVP mantığı ile yaklaşırsak, View kullanıcının butona tıkladığını Presenter’a haber verecek, Presenter yardımcı bir sınıfa sahip olup bu sınıftan istenilen formatta tarih bilgisini alacak. Presenter aldığı bu tarih bilgisini View’a iletecek ve View tarih bilgisini ekranda gösterecektir.

Görsel olarak şu şekilde gösterebiliriz.

Artık kodlama zamanı!

En başta ihtiyacımız olan sınıfları düşünelim.

  • MainActivity
  • MainActivityPresenter
  • MainActivityContract (Presenter ile View’in iletişimde olması için)
  • DateCalculationManager (Bize tarih bilgisini hesaplayacak yardımcı sınıf)

MainActivityContract

View ile Presenter’in haberleşmesi interface üzerinden olur. Presenter, View objesini MainActivityContract.View interface’i üzerinden bilir ve UI mantığını bu interface’in sahip olduğu fonksiyonlarla yönetir.

MainActivity

MainActivityContract.View interface’i implement edilir. Presenter’ın ihtiyacı olduğu model sınıfları burada üretilerek Presenter’a verilir. Bahsettiğimiz View tanıma işlemi “setView()” fonksiyonu ile gerçekleştirilir. Ayrıca kullanıcı etkileşimleri için ilgili Presenter fonksiyonları çağrılarak Presenter uyarılır.

MainActivityPresenter

MainActivityContract.Presenter interface’i sınıfa implement edilir. Ayrıca Presenter’ın ihtiyacı olan model sınıfları burada tanımlanır.

Gelen uyarılara göre, Presenter UI mantığı için gereken bilgileri bu sınıflardan karşılar. Bkz. mDateCalculationManager.calculateDate()

DateCalculationManager

Bir model sınıfıdır. Presenter’ın ihtiyaç duyduğu tarih bilgisini sağlar. Ama nasıl sağlayacağına bu sınıf kendi karar verir. Yani iş mantığını bu sınıf yönetir.

Sonuç

MVP Tasarım Deseni;

  • bağımlıklıkları mümkün olduğunca ortadan kaldıran,
  • test edilebilir,
  • okunabilir,
  • rahatlıkla kod içerinde geliştirme yapılabilir

bir yapı sağlamaktadır.

Yazımı okuduğunuz için teşekkür ederim, sevgiyle kalın!

--

--