Saturday, March 23, 2013

WPF - Padrão MVVM


MVVM Pattern

MVVM é uma sigla paa Model-View-ViewModel, que é um padrão de design de softwares comum em
aplicações WPF.

O WPF é um framework da Microsoft que possui uma feature de databinding muito poderosa. O uso mais comum desta feature é vincular um determinado Modelo de dados a uma View, mas também é possível fazer o bind de dois componentes WPF.

O padrão MVVM é uma maneira conveniente de fazer o bind entre a View e os dados, assim como o MVC.

Mas se o ASP.NET MVC funciona com um controller que traduz as requisições Get e Post do cliente, como funciona o WPF, em termos de ações do usuário?

Na época do windows forms era muito comum registrar Event Handlers para os controles do Form, delegando a funcionalidade para um código implementado no Code Behind.

Este approach traz algumas desvantagens. Entre elas:


  • Você não consegue Mockar a View para testes por causa do acoplamento entre a view e o code behind
  • Quase sempre que você altera uma View, você precisa alterar o code behind
  • A lógica do code behind não é reaproveitada



Com o MVVM é possível tira toda alógica da camada de apresentação da View através dos Comandos
(outra  feature do WPF). Os comandos são suportados pela maioria dos controles e podem ser vinculados a eles assim como fazemos com os dados. Desta maneira movemos toda a lógica de apesentação para o ViewModel.

Este approach traz as seguintes vantagens:


  • Testes unitarios no ViewModel
  • Alteramos a view sem precisar alterar o ViewModel
  • O ViewModel pode ser reutilizado por outras Views



Diferenças entre MVC , MVP e MVVM.

MVC

No padrão MVC temos um Controller que recebe dados inputados pelo usuário. Dependendo do tipo
de input, o controller cria uma nova View, ou modifica o modelo. Ou seja, o modelo e  View são criados pelo controller. A view depende do modelo diretamente, e o modelo desconhece todos os outros objetos.



MVP

No padrão MVP (Model-View-presenter) quem recebe o input do usuário é a View que encaminha as  informações para o Presenter. O presenter por sua vez, modifica a view ou o modelo, de acordo com o  input do usuário. Existe uma dependência bidirecional entre o Presenter e a View (fortemente acoplados) e o modelo desconhece todos os outros objetos. Este padrão é comum em aplicações WPF antigas e aplicações WinForms.




MVVM

Neste padrão a View recebe os dados inputados pelo usuário e encaminha para o ViewModel (usando
commands). A View por sua vez recebe dados do ViewModel por databinding. Neste padrão o modelo
também desconhece os outros objetos e não existe uma dependência biderecional entre a View e o
ViewModel  (menos acoplamento).



1 comment: