Middle
Mesélj az MVVM (Model-View-ViewModel) mintáról.
sobes.tech MI
Válasz az MI-től
MVC (Model-View-Controller).
| Komponens | Leírás | Felelősség |
|---|---|---|
| Model | Az alkalmazás adatait és üzleti logikáját képviseli. Nem függ a View-tól vagy a ViewModel-tól. | Adatkezelés, üzleti szabályok, kommunikáció a szerverrel/adattárral. |
| View | Felhasználói felület. Megjeleníti az adatokat és továbbítja a felhasználói műveleteket a ViewModel-nek. Nem tartalmaz adatfeldolgozó logikát. | Információk megjelenítése, felhasználói események kezelése (érintések, csúsztatások stb.). |
| ViewModel | Közvetítő a Model és a View között. A View számára adatokat biztosít megfelelő formátumban, és kezeli a felhasználói műveleteket, kommunikálva a Model-lel. Nem tudja, hogy a View használatban van-e vagy sem, csak adat kötésen keresztül kommunikál. | A Model-ből származó adatok átalakítása a View számára, felhasználói interakciók kezelése, nem UI-hez kapcsolódó üzleti logika. |
Alapelvek:
- Data Binding: Adatok kötése a View és a ViewModel között. Amikor a ViewModel-ben változás történik, a View automatikusan frissül, és fordítva.
- Tesztelhetőség: A ViewModel könnyen tesztelhető, mivel nem függ a UI keretrendszertől.
- Felelősségek szétválasztása: A komponensek szerepeinek egyértelmű elkülönítése.
Előnyök:
- Jobb tesztelhetőség.
- Tisztább felelősségmegosztás.
- Bonyolult UI-k esetén a kódalap egyszerűsítése.
Hátrányok:
- Lehet, hogy túlzás egyszerű alkalmazásoknál.
- Bonyolult lehet a Data Binding megvalósítása külső keretrendszerek nélkül (pl. RxSwift, Combine).
Példa szerkezet:
// Modell
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) év"
}
// Felhasználói műveletek kezelése
func userTapped() {
print("Felhasználó \(user.name) megnyomva")
// Lehet, hogy interakcióba lép a Model-lel vagy más logikával
}
}
// Nézet (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() {
// Adat kötés (példa kézi kötés)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}