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