Sobes.tech
Middle

Fale sobre o padrão MVVM (Model-View-ViewModel).

sobes.tech IA

Resposta da IA

MVC (Model-View-Controller).

Componente Descrição Responsabilidade
Model Representa os dados e a lógica de negócio da aplicação. Não depende da View ou do ViewModel. Gestão de dados, regras de negócio, interação com servidor/base de dados.
View Interface de utilizador. Mostra dados e transmite ações do utilizador ao ViewModel. Não contém lógica de processamento de dados. Apresentação de informações, gestão de eventos do utilizador (toques, deslizes, etc.).
ViewModel Intermediário entre o Model e a View. Fornece à View dados num formato adequado para exibição e processa ações do utilizador, interagindo com o Model. Não sabe se a View está em uso ou não, comunica apenas através de ligação de dados. Transformar dados do Model para a View, gerir interações do utilizador, lógica de negócio não relacionada com a UI.

Princípios básicos:

  • Ligação de Dados: Vinculação de dados entre a View e o ViewModel. Quando os dados no ViewModel mudam, a View atualiza-se automaticamente, e vice-versa.
  • Testabilidade: O ViewModel é fácil de testar, pois não depende do framework de UI.
  • Separação de Responsabilidades: Divisão clara de papéis dos componentes.

Vantagens:

  • Melhor testabilidade.
  • Divisão mais limpa de responsabilidades.
  • Simplificação da base de código ao trabalhar com UI complexa.

Desvantagens:

  • Pode ser excessivo para aplicações simples.
  • Complexidade na implementação de Ligação de Dados sem frameworks externos (por exemplo, RxSwift, Combine).

Exemplo de estrutura:

// Modelo
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) anos"
    }

    // Método para lidar com ações do utilizador
    func userTapped() {
        print("Utilizador \(user.name) foi pressionado")
        // Possivelmente interage com o Model ou outra lógica
    }
}

// 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() {
        // Ligação de dados (exemplo de ligação manual)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

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