Middle
MVVM (Model-View-ViewModel) desenini anlat.
sobes.tech yapay zeka
AI'dan gelen yanıt
MVC (Model-Görünüm-Denetleyici).
| Bileşen | Açıklama | Sorumluluk |
|---|---|---|
| Model | Uygulamanın verilerini ve iş mantığını temsil eder. Görünüm veya ViewModel'den bağımsızdır. | Verilerin yönetimi, iş kuralları, sunucu/veritabanı ile etkileşim. |
| View | Kullanıcı arayüzü. Verileri gösterir ve kullanıcı eylemlerini ViewModel'e iletir. Veri işleme mantığı içermez. | Bilgi gösterimi, kullanıcı olaylarının (dokunuşlar, kaydırmalar vb.) yönetimi. |
| ViewModel | Model ile View arasında aracıdır. Görünüm için uygun biçimde veriler sağlar ve kullanıcı eylemlerini işler, Model ile etkileşime geçer. Görünümün kullanılıp kullanılmadığını bilmez, sadece veri bağlama yoluyla iletişim kurar. | Model'den gelen verileri View için dönüştürmek, kullanıcı etkileşimlerini yönetmek, UI ile ilgisi olmayan iş mantığı. |
Temel ilkeler:
- Veri Bağlama: View ve ViewModel arasında veri bağlama. ViewModel'deki veriler değiştiğinde, View otomatik olarak güncellenir ve tersi de geçerlidir.
- Test Edilebilirlik: ViewModel, UI çerçevesine bağlı olmadığı için kolayca test edilebilir.
- Sorumlulukların Ayrılması: Bileşenlerin rollerinin net ayrımı.
Avantajlar:
- Geliştirilmiş test edilebilirlik.
- Daha temiz sorumluluk ayrımı.
- Karmaşık UI ile çalışırken kod tabanını basitleştirme.
Dezavantajlar:
- Basit uygulamalar için fazla olabilir.
- Üçüncü taraf framework'ler olmadan Veri Bağlama'nın uygulanması (örneğin, RxSwift, Combine) karmaşık olabilir.
Örnek yapı:
// Model
struct User {
let name: String
let age: Int
}
// ViewModel
class UserViewModel {
private let user: User
init(user: User) {
self.user = user
}
var displayName: String {
return user.name
}
var displayAge: String {
return "\(user.age) yaşında"
}
// Kullanıcı eylemlerini işleme metodu
func userTapped() {
print("Kullanıcı \(user.name) tıklandı")
// Model veya başka bir mantıkla etkileşime geçebilir
}
}
// Görünüm (UIViewController)
class UserViewController: UIViewController {
private var viewModel: UserViewModel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var ageLabel: UILabel!
func configure(with viewModel: UserViewModel) {
self.viewModel = viewModel
updateUI()
}
private func updateUI() {
// Veri Bağlama (örnek manuel bağlama)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}