Sobes.tech
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()
    }
}