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.
| Özellik | MVC | MVP | MVVM |
|---|---|---|---|
| View'u güncelleyen | Controller / Model | Presenter (arayüzle) | Binding (otomatik) |
| Mantık katmanı View'u tanır mı? | Genelde evet | Arayüz üzerinden | Hayır |
| Test edilebilirlik | Orta | Yüksek | Yüksek |
| Tipik ortam | Sunucu taraflı web | Eski Android, WinForms | WPF, 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.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.