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