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