DEV Community

Gabriel Teixeira da Silva
Gabriel Teixeira da Silva

Posted on

MVVM para Iniciantes: Desvendando o Padrão de Arquitetura

MVVM para Iniciantes: Desvendando o Padrão de Arquitetura

A arquitetura MVVM (Model-View-ViewModel) é uma das abordagens mais populares e eficazes para organizar o código em aplicações modernas. Ela busca separar responsabilidades, tornando o código mais limpo, testável e escalável — características essenciais em projetos de médio e grande porte.

Neste artigo, vamos mergulhar no conceito de MVVM, entender suas camadas, vantagens e desafios, e ainda ver exemplos práticos para que você possa aplicar esse padrão em seus próprios projetos.


🧭 O Que é o MVVM?

O MVVM é um padrão de arquitetura criado por John Gossman em 2005, inicialmente para o framework Microsoft WPF (Windows Presentation Foundation).

Com o passar dos anos, sua adoção se expandiu e hoje está presente em diversas tecnologias como Angular, Vue, React, Flutter, SwiftUI, Jetpack Compose, e até mesmo em frameworks backend que lidam com a camada de apresentação.

O objetivo do MVVM é desacoplar a lógica da interface do usuário da lógica de negócios e manipulação de dados.

Isso permite que desenvolvedores trabalhem em diferentes partes da aplicação sem interferir uns nos outros, além de facilitar testes unitários e manutenção.

A estrutura básica é composta por três elementos:

Model  ↔  ViewModel  ↔  View
Enter fullscreen mode Exit fullscreen mode

Cada camada tem um papel claro e definido, como veremos a seguir.


🧩 Entendendo as Camadas do MVVM

1. Model — O Coração dos Dados

O Model representa os dados da aplicação e a lógica de negócios.

Ele é responsável por acessar APIs, consultar bancos de dados, aplicar validações e regras do domínio.

Boas práticas:

  • Evite depender da UI;
  • Centralize regras de negócio aqui;
  • Mantenha o Model independente do framework utilizado.

Exemplo:

// models/User.ts
export interface User {
  id: number;
  name: string;
  email: string;
}
Enter fullscreen mode Exit fullscreen mode

2. View — A Interface do Usuário

A View é responsável apenas por exibir informações e interagir com o usuário.

Ela observa o ViewModel e reage automaticamente às mudanças, sem precisar lidar com regras de negócio.

Boas práticas:

  • Não coloque lógica de negócio aqui;
  • Use data binding sempre que possível;
  • Deixe a View “burra”, focada apenas em apresentar dados.

Exemplo (Vue.js):

<!-- UserView.vue -->
<template>
  <section>
    <h1>{{ user.name }}</h1>
    <p>{{ user.email }}</p>
  </section>
</template>
Enter fullscreen mode Exit fullscreen mode

3. ViewModel — O Elo Entre o Model e a View

O ViewModel atua como intermediário entre o Model e a View.

Ele é responsável por preparar e transformar os dados vindos do Model para que possam ser exibidos na View.

Em frameworks reativos, o ViewModel geralmente usa mecanismos como observables, reactive refs ou state hooks para notificar a View sobre mudanças.

Exemplo (Vue + Composition API):

// viewmodels/useUserViewModel.ts
import { ref, onMounted } from 'vue';
import type { User } from '../models/User';

export function useUserViewModel() {
  const user = ref<User | null>(null);

  async function fetchUser() {
    const response = await fetch('/api/user/1');
    user.value = await response.json();
  }

  onMounted(fetchUser);

  return { user, fetchUser };
}
Enter fullscreen mode Exit fullscreen mode

E na View:

<!-- UserView.vue -->
<template>
  <div v-if="user">
    <h1>{{ user.name }}</h1>
    <p>{{ user.email }}</p>
  </div>
</template>

<script setup lang="ts">
import { useUserViewModel } from '../viewmodels/useUserViewModel';
const { user } = useUserViewModel();
</script>
Enter fullscreen mode Exit fullscreen mode

🔄 Ciclo de Comunicação MVVM

  1. O usuário interage com a View (clicando, digitando, etc.);
  2. A View envia comandos ao ViewModel;
  3. O ViewModel processa a ação e atualiza o Model, se necessário;
  4. O Model retorna novos dados;
  5. O ViewModel notifica a View sobre a mudança;
  6. A View é atualizada automaticamente.

Esse fluxo cria uma camada de reatividade natural, evitando a manipulação direta do DOM e deixando a aplicação mais previsível.


🧪 Benefícios do MVVM

Separação de responsabilidades: cada parte tem um papel claro.

Facilidade de manutenção: alterar uma camada não quebra outra.

Alta testabilidade: o ViewModel pode ser testado sem interface gráfica.

Escalabilidade: o projeto cresce sem virar uma bagunça.

Reutilização de código: o mesmo ViewModel pode alimentar diferentes Views.


⚠️ Desvantagens e Desafios

Nem tudo são flores! O MVVM também traz desafios:

  • 📉 Curva de aprendizado: exige disciplina e organização.
  • 🧩 Complexidade inicial: pode parecer overkill em projetos pequenos.
  • 🔄 Sincronização de estados: requer atenção ao fluxo de dados para evitar inconsistências.
  • 🧠 Testes mal definidos: se o ViewModel ficar muito grande, o padrão se perde.

Dica: mantenha o ViewModel enxuto, focado apenas em coordenar a lógica entre Model e View.


🧱 MVVM vs MVC vs MVP

Padrão Papel do Intermediário Comunicação Exemplo de uso
MVC Controller View ↔ Controller ↔ Model Aplicações clássicas web e server-side
MVP Presenter View ↔ Presenter ↔ Model Aplicações Android antigas
MVVM ViewModel View ↔ Data Binding ↔ Model Apps reativos modernos (Vue, Angular, React, Flutter)

O MVVM se destaca justamente pela reatividade e ligação automática de dados (data binding), algo que o MVC e o MVP não implementam de forma nativa.


💡 Boas Práticas ao Usar MVVM

  • 1. Mantenha o ViewModel simples: nada de regras de negócio pesadas aqui.
  • 2. Evite dependências diretas entre View e Model.
  • 3. Use observables, refs ou estados globais bem definidos.
  • 4. Organize pastas por funcionalidade:
    • models/ → entidades e regras de domínio
    • viewmodels/ → lógica de exibição
    • views/ → componentes visuais
  • 5. Escreva testes para o ViewModel (é onde mora a maior parte da lógica).

🚀 Conclusão

O MVVM é mais do que um padrão de arquitetura — é uma filosofia de desenvolvimento que preza pela clareza, modularidade e previsibilidade do código.

Ele te ajuda a construir aplicações robustas, com código sustentável, fácil de evoluir e testar.

Mesmo que no início pareça mais complexo, com o tempo, o MVVM se torna um aliado poderoso para qualquer desenvolvedor que deseja criar soluções escaláveis e bem estruturadas.

Comece pequeno: implemente um ViewModel em um projeto simples e observe como tudo começa a fazer sentido.


✍️ Autor: Gabriel Silva

💻 Engenheiro de Software | Foco em Arquitetura, Acessibilidade e Desenvolvimento Web

📚 "Tentando escrever código limpo e acessível."

Top comments (1)

Collapse
 
gurigraphics profile image
Gurigraphics • Edited

Uma perspectiva "não convencional"

MVVM é MVC + Marketing

A análise é quase matemática: os dois tem M e V. Então, os eliminamos
Sobra de um lado o VM e de outro o C
Como só há dois, a responsabilidade de um, precisa que ser exatamente a mesma de outro
Caso contrário, a aplicação não funcionaria em ambas arquiteturas
Fim

Sobre databindings e reatividade
Isso é apenas uma "feature glorificada"
Não tem relação com a arquitetura
Eu posso usar js proxy no C e criar as mesmas reactividades e databindings
E com isso, magicamente, posso chamar o C de VM
Antes do hype das reatividades C já fazia algo similar com ajax, iframes, flash, applets java, active windows, etc

Outro detalhe: MVVM, na prática, não é utilizado como M+V+VM

Utilizam assim:
View ↔ ViewModel ↔ Service/Repository ↔ Model

Ou seja é um VVMSRM

VM não faz chamadas http como um C faria
Quem faz as chamadas é o Service, que é uma dessas sub-camadas ocultas

Esse termo MVVM é totalmente equivocado
Mas foi mantido assim
E foi inicialmente utilizado com esse objetivo:
capitalização/marketing/diferenciação tecnológica

Enfim, a maioria não concorda com isso
E eu não concordo com a maioria =)