MVVM

alierkoc
4 min readMay 26, 2023

--

Bu yazımda MVVM mimarisini anlattığım bir yazı ile sizlerleyim. Bu yazımda MVVM yapısının mantığı hakkında bilgi vermeye çalışacağım. Keyifli ,açıklayıcı ve öğretici olmasını dileğiyle sözü çok uzatmadan hadi başlayalım .

Kotlin, modern bir programlama dilidir ve Android uygulama geliştirme sürecinde yaygın olarak kullanılmaktadır. MVVM ise (Model-View-ViewModel), Kotlin ve diğer birçok programlama dilinde kullanılan bir tasarım desenidir.

Hepimiz ilk kodlamaya başladıktan bir süre sonra MVVM (Model-View-ViewModel), yapısını duymuşuzdur. Başlarda kısa bir süre alışmak zor olsa da ileri de bizi içinden çıkılmaz, kontrol etmesi zor kod bloklarından kurtarır ve Kotlin ile MVVM kullanmak, uygulamanın daha modüler, bakımı kolay ve test edilebilir olmasını sağlar. Ayrıca, kullanıcı ara yüzünün ve iş mantığının birbirinden ayrılmasını sağlayarak geliştirme sürecini daha verimli hale getirir. (Başlarda inandırıcı olmayabilir ama sözüme güvenin :D ) MVVM içerisindeki yapıları ele alacak ve kısaca bahsedecek olursak :

  • Model: Uygulamanın veri kaynaklarını temsil eder. Bu veriler genellikle bir sunucudan alınan veriler, yerel bir veri tabanı veya diğer veri kaynakları olabilir.
  • View: Kullanıcı ara yüzünü temsil eder. Kullanıcı ile etkileşim halinde olan bileşendir. Genellikle XML tabanlı layout dosyaları kullanılarak tasarlanır.
  • ViewModel: Model ile View arasındaki bağlantı noktasıdır. View tarafından ihtiyaç duyulan verileri sağlar ve kullanıcı etkileşimlerini yönetir. ViewModel, View’den bağımsız olarak test edilebilir ve yeniden kullanılabilir.
MVVM Görsel Örnek

Biraz sıkıcı geldiyse hemen bir örnekle olayı anlatıyorum :) Bu örneğimizde posta alma olayını MVVM yapısına benzetecek olursak :

  • Model: Posta verilerini ve ilgili iş mantığını temsil eder. Model, posta kutusundan gelen verileri tutar, posta nesnelerini tanımlar ve gerektiğinde posta verilerini günceller. Örneğin, postanın konusu, gönderenin adı, tarihi vb. gibi bilgileri içerebilir.
  • View: Kullanıcı ara yüzünü (UI) temsil eder. Bu, kullanıcının posta listesini görüntülediği veya bir postayı seçtiği ekranı içerebilir. View, kullanıcının etkileşimde bulunduğu bileşenleri içerir ve kullanıcının postaları görmesini sağlar.
  • ViewModel: Model ve View arasında bir bağlantı görevi görür. ViewModel, View’a gerekli verileri sağlar ve View’daki kullanıcı etkileşimlerini yakalar. Postaları Model’den alır, gerekirse işler (örneğin, tarih sırasına göre sıralama) ve View’a sunar. ViewModel aynı zamanda kullanıcının bir postayı seçtiğinde ne yapılacağını belirler ve Model’e gerekli güncelleme taleplerini iletebilir.

Kısacası, Model posta verilerini tutar, View kullanıcıya postaları gösterir ve ViewModel, Model ve View arasında etkileşimi yönetir. ViewModel, kullanıcının taleplerini işler, Model’den veri alır ve View’a sunar. Böylece, MVVM yapısı, posta alma olayını ele alırken veri yönetimini (Model), kullanıcı arayüzünü (View) ve bu iki bileşen arasında bağlantıyı (ViewModel) sağlar.

MVVM hakkında giriş seviyesinde de olsa bilgi sahibi oldunuz artık :) Hadi şimdi de biraz kod yazarak ellerimizi ısındıralım ve bu yapının kod olarak mantığını almaya çalışalım.

Yukarıdaki posta örneğine paralel olarak kodumuzu yazalım;

1.Model (Veri Modeli): Model, posta uygulamasında kullanılan veri nesnelerini temsil eder. Örneğin, bir “Mail” sınıfı oluşturabiliriz, bu sınıf e-posta mesajının başlık, içerik ve gönderen gibi bilgilerini içerir.

data class Mail(
val subject: String,
val content: String,
val sender: String
)

2.View (Kullanıcı Arayüzü): View, kullanıcıya verileri gösteren ve kullanıcı etkileşimlerini yakalayan bileşendir. Örneğin, posta listesini gösteren bir RecyclerView ve posta ayrıntılarını gösteren bir ayrıntı ekranı olabilir.

3. ViewModel: ViewModel, Model ve View arasında iletişimi sağlar. Verileri Model’den alır ve View tarafından kullanılabilir hale getirir. Kullanıcı etkileşimlerini alır ve Model’e işlemek için gerekli iş mantığını uygular. Ayrıca, View’deki değişiklikleri Model’e yansıtabilir. Örneğin, postaların alınması ve seçilen postanın ayrıntılarının alınması gibi işlemleri gerçekleştirebiliriz

class MailViewModel : ViewModel() {
private val _mails = MutableLiveData<List<Mail>>()

private val _selectedMail = MutableLiveData<Mail>()

// Postaları almak için bir işlev
fun fetchMails() {
// Postaların alınması için gereken işlemler burada yapılır
// Örneğin, bir API çağrısı veya yerel veritabanı sorgusu yapılabilir
// Sonuçları _mails LiveData'sına atarız
val fetchedMails = // Postaların alındığı yer
_mails.value = fetchedMails
}
// Seçilen postayı ayarlamak için bir işlev
fun selectMail(mail: Mail) {
_selectedMail.value = mail
}
}

Bu örnekte, MailViewModel sınıfı ViewModel sınıfından türetilmiştir. ViewModel, MutableLiveData kullanarak postaları ve seçilen postayı depolar. fetchMails() işlevi, postaların alındığı simüle edilen bir işlemdir ve _mails LiveData’sına sonuçları atar. selectMail() işlevi ise seçilen postayı ayarlar.

4.View ile ViewModel Arasındaki Bağlantı:

View, ViewModel ile iletişim kurar ve ViewModel’den verileri alır. Bu iletişim, genellikle veri bağlama (view binding vs ) kullanılarak gerçekleştirilir. Örneğin, posta listesini ViewModel’den alıp RecyclerView ile göstermek için veri bağlama yöntemlerini kullanabilir.

Özetleyecek ve Veda Konuşması Yapacak Olursak :

MVVM, özellikle büyük ve karmaşık uygulamalarda faydalıdır. Kodun daha kolay anlaşılır ve bakımı daha kolay hale gelir. Ayrıca, test edilebilirlik açısından da avantaj sağlar. Kotlin gibi modern programlama dilleri ve Android gibi platformlar, MVVM ile uyumlu ve destekleyici yapılar sunarlar. Umarım MVVM mantığını anlama açısından güzel ve açıklayıcı bir yazı olmuştur. Vakit ayırdığınız için teşekkürler iyi çalışmalar…

--

--