Middle
Papaskink apie MVVM (Model-View-ViewModel) modelį.
sobes.tech AI
Atsakymas iš AI
MVC (Model-View-Controller).
| Komponentas | Aprašymas | Atsakomybė |
|---|---|---|
| Modelis | Atstovauja duomenis ir verslo logiką programoje. Nėra priklausomas nuo View ar ViewModel. | Duomenų valdymas, verslo taisyklės, sąveika su serveriu/ar duomenų baze. |
| View | Vartotojo sąsaja. Rodo duomenis ir perduoda vartotojo veiksmus ViewModel. Nėra duomenų apdorojimo logikos. | Informacijos rodymas, vartotojo įvykių apdorojimas (bakstelėjimai, swipai ir kt.). |
| ViewModel | tarpininkas tarp Model ir View. Pateikia View duomenis patogiu formatu ir apdoroja vartotojo veiksmus, sąveikauja su Model. Nėra žinojimo, ar View naudojamas, ar ne, bendrauja tik per duomenų bindingą. | Duomenų konvertavimas iš Model į View, vartotojo sąveikų apdorojimas, verslo logika, nesusijusi su UI. |
Pagrindiniai principai:
- Data Binding: Duomenų sujungimas tarp View ir ViewModel. Kai duomenys keičiasi ViewModel, View automatiškai atnaujinamas, ir atvirkščiai.
- Testability: ViewModel lengvai testuojamas, nes jis nepriklauso nuo UI karkaso.
- Separation of Concerns: Aiškus komponentų vaidmenų atskyrimas.
Privalumai:
- Pagerinta testavimas.
- Švaresnis atsakomybės pasidalijimas.
- Supaprastina kodo bazę dirbant su sudėtingais UI.
Trūkumai:
- Gali būti perteklinis paprastoms programoms.
- Sudėtinga įgyvendinti Data Binding be išorinių karkasų (pvz., RxSwift, Combine).
Pavyzdinė struktūra:
// Modelis
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) metų"
}
// Metodas vartotojo veiksmų apdorojimui
func userTapped() {
print("Vartotojas \(user.name) paspaustas")
// Galimas sąveika su Model ar kita logika
}
}
// Peržiūra (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() {
// Duomenų binding (pavyzdys rankiniu būdu)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}