MVC, MVP ve MVVM mimari desenleri arasındaki farklar nelerdir?

Cevap

Üçü de UI uygulamalarında sunum (görünüm) ile iş mantığını ayırmayı amaçlar; fark, View ile mantık katmanının nasıl konuştuğundadır.

MVC (Model-View-Controller)

  • Model: veri ve iş kuralları.
  • View: veriyi gösterir.
  • Controller: kullanıcı girdisini alır, Model'i günceller, hangi View'un gösterileceğine karar verir.
  • Web framework'lerinde (Spring MVC, ASP.NET MVC, Rails, Django'da MTV olarak) yaygındır: istek Controller'a gelir, Controller Model'den veriyi alıp View/template'e verir.

MVP (Model-View-Presenter)

  • View pasiftir ve bir arayüz üzerinden Presenter'a olayları iletir.
  • Presenter, View'u arayüz üzerinden doğrudan günceller (view.showError(...)).
  • Presenter, View arayüzü mock'lanarak kolayca test edilir. Eski Android ve WinForms projelerinde yaygındı.

MVVM (Model-View-ViewModel)

  • ViewModel, View'un ihtiyaç duyduğu durumu (state) ve komutları gözlemlenebilir özellikler olarak sunar.
  • View, data binding ile ViewModel'e bağlanır; ViewModel View'u tanımaz.
  • WPF/.NET MAUI, Android Jetpack (ViewModel + StateFlow/Compose), SwiftUI ve Angular/Vue gibi reaktif dünyada yaygındır.
ÖzellikMVCMVPMVVM
View'u güncelleyenController / ModelPresenter (arayüzle)Binding (otomatik)
Mantık katmanı View'u tanır mı?Genelde evetArayüz üzerindenHayır
Test edilebilirlikOrtaYüksekYüksek
Tipik ortamSunucu taraflı webEski Android, WinFormsWPF, Jetpack Compose, SwiftUI

Kısa örnek (MVVM fikri)

class LoginViewModel(private val repo: AuthRepository) : ViewModel() {
    private val _state = MutableStateFlow(LoginState())
    val state: StateFlow<LoginState> = _state       // View bunu gözlemler

    fun onLoginClick(email: String, pass: String) = viewModelScope.launch {
        _state.update { it.copy(loading = true) }
        val ok = repo.login(email, pass)
        _state.update { it.copy(loading = false, error = if (ok) null else "Hatalı giriş") }
    }
}

Dezavantajlar

MVVM'de binding hatalarını ayıklamak zor olabilir ve küçük ekranlar için fazla tören (boilerplate) getirir. MVC'de Controller'ların şişmesi ("Massive View Controller") klasik bir sorundur.

  1. Clean code nedir? Yaygın code smell'ler nelerdir?OrtaOOP & Tasarım DesenleriYazılım Müh.
  2. Dependency Injection nedir? IoC container ne işe yarar?ZorOOP & Tasarım DesenleriYazılım Müh.
  3. Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  4. Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?OrtaOOP & Tasarım DesenleriYazılım Müh.
  5. Factory deseni nedir? Ne zaman kullanılır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  6. Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?ZorOOP & Tasarım DesenleriYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle