Sobes.tech
Junior

O que são os padrões MV?

sobes.tech IA

Resposta da IA

Os padrões MV (Model-View-ViewModel, Model-View-Presenter, Model-View-Controller) são padrões arquiteturais que separam a apresentação (View), a lógica de negócio (Model) e a lógica de apresentação (ViewModel/Presenter). O objetivo é melhorar a manutenção, testabilidade e escalabilidade da aplicação através da separação de responsabilidades.

MVC (Model-View-Controller)

  • Model: Representa dados e lógica de negócio.
  • View: Mostra dados do Model.
  • Controller: Processa ações do utilizador, atualiza o Model e escolhe a View para mostrar.

No Android, a View (atividade/fragmento) frequentemente combina funções de View e Controller, o que dificulta os testes.

MVP (Model-View-Presenter)

  • Model: Representa dados e lógica de negócio.
  • View: Interface passiva que mostra dados passados pelo Presenter e transmite ações do utilizador.
  • Presenter: Contém a lógica de apresentação, interage com o Model e atualiza a View através de uma interface.

Proporciona uma melhor separação entre View e lógica, tornando o Presenter mais fácil de testar.

// Exemplo de interface View em MVP
interface UserProfileView {
    fun showLoading()
    fun hideLoading()
    fun displayUserInfo(user: User)
    fun showError(message: String)
}

// Exemplo de Presenter
class UserProfilePresenter(private val view: UserProfileView, private val repository: UserRepository) {
    fun loadUserProfile(userId: String) {
        view.showLoading()
        repository.getUser(userId) { user ->
            view.hideLoading()
            if (user != null) {
                view.displayUserInfo(user)
            } else {
                view.showError("Falha ao carregar o utilizador")
            }
        }
    }
}

MVVM (Model-View-ViewModel)

  • Model: Representa dados e lógica de negócio. Usa Observable para notificar mudanças.
  • View: Mostra dados do ViewModel e envia ações do utilizador. Usa data binding para ligar a View e o ViewModel.
  • ViewModel: Fornece dados para a View num formato conveniente, contém a lógica de apresentação. Não tem acesso direto à View.

Utiliza mecanismos de observação (LiveData, Flow) e data binding para atualizar automaticamente a View quando os dados no ViewModel mudam. Torna o ViewModel totalmente independente do framework Android e facilmente testável.

// Exemplo de ViewModel com LiveData
class UserProfileViewModel(private val repository: UserRepository) : ViewModel() {
    private val _user = MutableLiveData<User?>()
    val user: LiveData<User?> = _user

    private val _loading = MutableLiveData<Boolean>()
    val loading: LiveData<Boolean> = _loading

    private val _error = MutableLiveData<String?>()
    val error: LiveData<String?> = _error

    fun loadUserProfile(userId: String) {
        _loading.value = true
        repository.getUser(userId) { user ->
            _loading.value = false
            if (user != null) {
                _user.value = user
                _error.value = null
            } else {
                _user.value = null
                _error.value = "Falha ao carregar o utilizador"
            }
        }
    }
}

Comparação:

Padrão Relação entre View e Lógica Testabilidade da Lógica Dependência da Lógica do Android
MVC Forte (em Android, View muitas vezes é o Controller) Média Alta
MVP Livre (através de interface View) Alta Baixa (Presenter não depende da UI Android)
MVVM Livre (através de observadores e data binding) Alta Ausente (ViewModel não depende da UI Android)

A escolha do padrão depende dos requisitos do projeto e das preferências da equipa. MVVM com componentes Android Jetpack (ViewModel, LiveData, Data Binding) é a abordagem recomendada no desenvolvimento Android moderno.