Sobes.tech
Middle

O que é o padrão de arquitetura MVVM?

sobes.tech IA

Resposta da IA

O MVVM (Model-View-ViewModel) é um padrão arquitetónico que estrutura o código para dividir a lógica da aplicação em três componentes interligados:

  • Model: Representa os dados e a lógica de negócio. Não depende da interface de utilizador.
  • View: Mostra os dados do ViewModel e envia ações do utilizador (por exemplo, cliques) ao ViewModel. A View é passiva e não contém lógica de processamento de dados.
  • ViewModel: Atua como intermediário entre o Model e a View. Fornece dados do Model num formato adequado para visualização e processa as ações do utilizador, atualizando o Model. O ViewModel frequentemente usa mecanismos de ligação de dados (data binding) para atualizar automaticamente a View quando os dados mudam.

Princípios-chave:

  • Ligação bidirecional de dados: As alterações no ViewModel refletem-se automaticamente na View, e vice-versa (usando as ferramentas apropriadas).
  • Testabilidade: O ViewModel é fácil de testar isoladamente, pois não está ligado à interface de utilizador.
  • Separação de responsabilidades: A separação clara da lógica de apresentação, dados e lógica de negócio simplifica o desenvolvimento e manutenção.

É frequentemente utilizado em aplicações com UI declarativa, como Vue.js, React (com algumas variações), Angular.

Exemplo de estrutura mais simples:

// Modelo
class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

// ViewModel
class UserViewModel {
  constructor(user) {
    this.user = user;
    this.displayName = `${user.name} (${user.age})`;
  }

  incrementAge() {
    this.user.age++;
    this.displayName = `${this.user.name} (${this.user.age})`; // Atualiza displayName para a View
  }
}

// View (aproximadamente, como poderia parecer num framework declarativo)
/*
<template>
  <div>
    <p>{{ userViewModel.displayName }}</p>
    <button @click="userViewModel.incrementAge()">Aumentar idade</button>
  </div>
</template>

<script>
import { User } from './model';
import { UserViewModel } from './viewModel';

export default {
  data() {
    return {
      userViewModel: new UserViewModel(new User('Ivan', 30))
    };
  }
}
</script>
*/