Sobes.tech
Middle

მითხარი MVVM (Model-View-ViewModel) ნიმუშის შესახებ.

sobes.tech AI

პასუხი AI-სგან

MVC (Model-View-Controller).

კომპონენტი აღწერა პასუხისმგებლობა
Model წარმოადგენს მონაცემებს და ბიზნეს ლოგიკას აპლიკაციის. არ არის დამოკიდებული View ან ViewModel-ზე. მონაცემების მართვა, ბიზნეს წესები, სერვერზე/მონაცემთა ბაზასთან ურთიერთობა.
View მომხმარებლის ინტერფეისი. აჩვენებს მონაცემებს და გადასცემს მომხმარებლის მოქმედებებს ViewModel-ს. არ შეიცავს მონაცემების დამუშავების ლოგიკას. ინფორმაციის ჩვენება, მომხმარებლის მოვლენების დამუშავება (ტაპები, სვაიპები და ა.შ.).
ViewModel შუამავალი Model და View-ს შორის. უზრუნველყოფს View-ს მონაცემებს მოსახერხებელ ფორმატში და დამუშავებს მომხმარებლის მოქმედებებს, ურთიერთქმედებს Model-თან. არ იცის, გამოიყენება თუ არა View, კომუნიკაცია ხდება მხოლოდ data binding-ის მეშვეობით. მონაცემების გარდაქმნა Model-დან View-ისთვის, მომხმარებლის ინტერაქციების დამუშავება, ბიზნეს ლოგიკა, რომელიც არ არის დაკავშირებული UI-სთან.

ძირითადი პრინციპები:

  • Data Binding: მონაცემების დაკავშირება View და ViewModel-ს შორის. როდესაც მონაცემები იცვლება ViewModel-ში, View ავტომატურად განახლდება, და პირიქით.
  • Testability: ViewModel-ს ადვილია ტესტირება, რადგან ის არ არის დამოკიდებული UI-ფრემვორკზე.
  • Separation of Concerns: კომპონენტების როლების მკაფიო განყოფილება.

უპირატესობები:

  • გაუმჯობესებული ტესტირებადობა.
  • უფრო სუფთა პასუხისმგებლობების განყოფილება.
  • კოდის ბაზის გამარტივება კომპლექსური UI-თან მუშაობისას.

მოხერხებულობები:

  • შეიძლება იყოს ზედმეტი მარტივ პროგრამებისთვის.
  • Data Binding-ის განხორციელება რთულია გარეგანი ფრეიმვორკების გარეშე (მაგ. RxSwift, Combine).

მაგალითის სტრუქტურა:

// Model
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) წლის"
    }

    // მეთოდი მომხმარებლის მოქმედებების დამუშავებისთვის
    func userTapped() {
        print("მომხმარებელი \(user.name) დაჭერილია")
        // ურთიერთქმედება Model-ის ან სხვა ლოგიკასთან
    }
}

// View (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() {
        // Data Binding (მოჩვენებითი რჩევა)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

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