Sobes.tech
Middle

Pastāsti par MVVM (Model-View-ViewModel) paraugu.

sobes.tech AI

Atbilde no AI

MVC (Model-View-Controller).

Komponenta Apraksts Atbildība
Modelis Attēlo datus un biznesa loģiku lietotnē. Nav atkarīgs no View vai ViewModel. Datu pārvaldība, biznesa noteikumi, saskare ar serveri/datu bāzi.
View Lietotāja interfeiss. Parāda datus un nodod lietotāja darbības ViewModel. Nav iekļauta datu apstrādes loģika. Informācijas attēlošana, lietotāja notikumu apstrāde (taps, swipes utt.).
ViewModel starpnieks starp Model un View. Nodrošina View ar datiem ērtā formātā un apstrādā lietotāja darbības, sadarbojoties ar Model. Nezina, vai View tiek izmantots vai nē, komunikācija notiek tikai caur datu bindingu. Datu pārveidošana no Model uz View, lietotāja mijiedarbības apstrāde, biznesa loģika, kas nav saistīta ar UI.

Galvenie principi:

  • Data Binding: Datu sasaistīšana starp View un ViewModel. Kad dati mainās ViewModel, View automātiski tiek atjaunināts, un otrādi.
  • Testability: ViewModel ir viegli testējams, jo tas nav atkarīgs no UI karkasa.
  • Sadalījums pēc funkcijām: Komponentu lomu skaidra sadale.

Priekšrocības:

  • Uzlabota testējamība.
  • Tīrāka atbildības sadale.
  • Koda bāzes vienkāršošana darbā ar sarežģītiem UI.

Trūkumi:

  • Var būt lieks vienkāršām lietojumprogrammām.
  • Datu bindinga īstenošana bez ārējiem rāmjiem (piemēram, RxSwift, Combine) ir sarežģīta.

Piemēra 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) gadi"
    }

    // Metode lietotāja darbību apstrādei
    func userTapped() {
        print("Lietotājs \(user.name) ir nospiests")
        // Iespējama saskare ar Model vai citu loģiku
    }
}

// Skats (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() {
        // Datu sasaistīšana (piemērs ar roku)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

    @IBAction func tapGestureRecognized(_ sender: Any) {
        viewModel.userTapped()
    }
}