HK
Background
Blog'a Dön
28 Kasım 2025SİBER GÜVENLİK & YAZILIM

MVVM Mimarisi: Kod Karmaşasından Kurtuluş Rehberi

Author

Hilmi Kılavuz

Software Engineer

MVVM Mimarisi: Kod Karmaşasından Kurtuluş Rehberi

MVVM Mimarisi: Kod Karmaşasından Kurtuluş Rehberi

Yazılım geliştirmeye yeni başladığımızda, genellikle ilk odaklandığımız şey "kodu çalıştırmak" olur. Bir butona tıklandığında işlem gerçekleşiyorsa bizim için sorun yoktur. Ancak proje büyüdükçe, o masum kodlar birbiri içine geçmiş, yönetilemez bir sarmaşığa (nam-ı diğer Spagetti Kod) dönüşür.

İşte tam bu noktada, bizi bu kaosun içinden çıkaracak bir kahramana ihtiyaç duyarız: MVVM Mimarisi.

Bugünkü yazımda, modern mobil ve masaüstü uygulama geliştirmede bir standart haline gelen MVVM'in ne olduğunu, neden ortaya çıktığını ve hayatımızı nasıl kolaylaştırdığını somut örneklerle anlatacağım.


MVVM Nedir? (En Basit Haliyle)

MVVM, Model - View - ViewModel kelimelerinin baş harflerinden oluşur. Microsoft mimarları (Ken Cooper ve Ted Peters) tarafından tasarlanan bu yapı, yazılım dünyasındaki en temel prensiplerden biri olan Separation of Concerns (İlgi Alanlarının Ayrımı) ilkesine dayanır.

Teknik tanımlara boğulmadan önce, MVVM’i günlük hayattan bir Restoran Analojisi ile somutlaştıralım:


1. View (Müşteri / Masa)

  • Müşteri sadece yemeği görür ve sipariş verir.
  • Mutfağın ne kadar karışık olduğunu bilmez.
  • Yazılımda bu, kullanıcının gördüğü arayüz (UI) katmanıdır.

2. Model (Mutfak / Aşçı)

  • Yemeğin hazırlandığı yerdir.
  • Veri tabanı ya da API işlemlerinin yapıldığı katmandır.
  • Veri tabanı tablolarını sınıflara dönüştürdüğümüz yapı burada bulunur.
  • Bu işleme ORM (Object–Relational Mapping) denir.

3. ViewModel (Garson)

  • View (Müşteri) ve Model (Mutfak) arasındaki köprüdür.
  • Veriyi alır, düzenler ve uygun şekilde View'a verir.
  • Yemeği pişirmez ve yemez → Sadece taşır.
  • Yazılımda: Veriyi alır, işleyip arayüzün görebileceği forma sokar.

Somut Bir Senaryo: Instagram Profil Sayfası

Bir kullanıcının profil sayfasını yaptığımızı düşünelim.

  • Model:
    Kullanıcı verilerini (Ad, Soyad, Takipçi Sayısı) veritabanından çeker.
  • ViewModel:
    Modelden veriyi alır, işler. Örneğin "Hilmi" + "Kılavuz" → "Hilmi Kılavuz"
  • View:
    Boş kutuları olan bir ekran. ViewModel veriyi güncellediğinde ekrana yazılır.

Kotlin Üzerinden Bir Örnek

Senaryo: Veritabanından kullanıcı bilgisi çekme

Bu örnekte Room (ORM) kullanarak bir tabloyu Kotlin nesnesine dönüştüreceğiz.


1) Model Katmanı (ORM ile Nesneleştirme)

Burada SQL yazmak yerine, tabloyu bir sınıf olarak tanımlarız.

// MODEL (Veri ve ORM)
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users") // Bu sınıf artık bir SQL tablosudur (ORM)
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    val email: String
)

// Veriye erişim arayüzü (DAO)
@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUser(userId: Int): User // SQL verisi -> User Nesnesi (Otomatik dönüşüm)
}

2) ViewModel Katmanı (Mantık ve Köprü)

ViewModel, Model'den veriyi ister ve View'ın gözlemleyebileceği bir değişkene aktarır.

// VIEWMODEL (Köprü)
class UserViewModel(private val userDao: UserDao) : ViewModel() {

    // View'ın gözlemleyeceği veri kutusu (LiveData)
    val userData = MutableLiveData<User>()

    fun fetchUser(id: Int) {
        viewModelScope.launch {
            val user = userDao.getUser(id)
            userData.value = user 
        }
    }
}

3. View Katmanı (Arayüz)

Arayüzde ne SQL sorgusu var ne de iş mantığı.
Sadece ViewModel'i dinler (Observe).

// VIEW (Activity veya Fragment)
class UserActivity : AppCompatActivity() {
    
    // ... ViewModel tanımlamaları ...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // GÖZLEMLEME (Observer Pattern)
        // ViewModel'deki 'userData' değiştiği an burası çalışır.
        viewModel.userData.observe(this) { user ->
            // UI Güncellemesi
            textViewName.text = user.name
            textViewEmail.text = user.email
        }

        // Butona basınca veriyi iste
        buttonLoad.setOnClickListener {
            viewModel.fetchUser(1)
        }
    }
}

Dikkat ettiyseniz:

  1. Model (User): Veritabanı tablosunu bir nesne gibi modelledik (ORM).
  2. View (Activity): İçinde "Veritabanına bağlan", "Sorgu at" gibi hiçbir kod yok.
    Sadece "Veri gelirse ekrana yaz" diyor.
  3. Sonuç: Veritabanını değiştirsek bile View (Arayüz) kodlarımız bozulmayacak.
    İşte MVVM’in gücü budur.

Not: Bu örnekte Kotlin dili üzerinden örnek verdiğim için anlamadığınız terimler olabilir.
Bunu dert etmeyin; sadece ana mimari yapıyı anlamaya çalışın.


Tarihsel Süreç: Önceden Ne Kullanıyorduk?

MVVM gökten zembille inmedi.
Yazılımcılar yıllarca birçok acı çektikten sonra bu çözüme ulaştılar.

Peki, MVVM popüler olmadan önce ne yapıyorduk?


1. Spagetti Kod (God Object) Dönemi

Eskiden (ve maalesef bazen hâlâ), tüm kodlar tek bir dosyanın içine yazılırdı.

  • Android’de: Tüm veritabanı işlemleri MainActivity içindeydi.

2. MVC (Model-View-Controller) Dönemi

Bu karmaşayı azaltmak için MVC geldi.
Web geliştirmede hâlâ çok sık kullanılan bir mimaridir ve MVVM’e yapısal olarak benzer.


Neden MVVM’e Geçiş Yaptık?

Sektörün MVVM’e yönelmesinin (ve benim de projelerimde bunu tercih etmemin) çok temel sebepleri var:


1. Bağımsızlık

MVVM’de ViewModel, View’ı tanımaz.

Yani ViewModel'in içinde şöyle kodlar göremezsiniz:

“Buton1’in rengini kırmızı yap.”

Bu sayede tasarımcı arayüzü tamamen değiştirse bile arka plandaki iş mantığı bozulmaz.


2. Test Edilebilirlik

Proje küçük bile olsa bu çok kritik bir avantajdır.

  • UI testleri zordur, uğraştırıcıdır ve yavaştır.
  • MVVM sayesinde ViewModel’i arayüz olmadan, sadece kodla test edebilirsiniz (Unit Test).

3. Veri Bağlama (Data Binding)

MVVM’in sihirli değneği.

Veri değiştiğinde arayüzü elle güncellemek zorunda değilsiniz.
Arayüz veriyi dinler ve otomatik olarak güncellenir.


Sonuç

MVVM başlangıçta biraz karmaşık görünebilir ve
Fazla kod yazıyoruz galiba…” hissi verebilir.

Ancak proje büyüdükçe:

  • Kodun temiz kaldığını,
  • Yönetilebilirliğin arttığını,
  • Hata ayıklamanın kolaylaştığını

gördüğünüzde:

“İyi ki MVVM kullanmışım.”

dersiniz.

Kendi projelerinizde bile sistematik çalışmak,
sorunları hızlı çözmek ve sürdürülebilir yapı kurmak istiyorsanız
bu mimariyi denemenizi kesinlikle öneririm.


Değerli vaktinizi ayırıp okuduğunuz için teşekkür ederim.
Sağlıcakla kalın.