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()
    }
}