quarta-feira, 17 de junho de 2009

MVC ou MVP?

Eu conheço uma galera interessada em padrões de projeto mas como acontece com todo mundo (inclusive comigo) algumas dúvidas e confuções acabam surgindo.

Foi me passado o seguinte trecho do livro Patterns of Enterprise Application Architecture do Fowler. (Se você não leu, deveria!)

“The view is only about display of information; any changes to the information are handled by the third member of the MVC trinity: the controller. The controller takes user input, manipulates the model, and causes the view to update appropriately”

Combinado com a definição dada no livro o seguinte exemplo de MVC foi passado:

http://www.codeproject.com/KB/tips/ModelViewController.aspx?fid=1194034&select=2878520#xx2878520xx

Bom, qual o problema?
O problema é que o exemplo passado no link não é MVC, pelo menos não na versão purista, mas sim MVP.

Mas como eu sei a diferença?

Analise comigo o trecho do código no exemplo da classe CalcController:

public void OnClick( int number )
{
    view.Total = model.SetInput(number).ToString();
}

No exemplo, a controller além de atualizar a Model ainda informa a View da alteração que a Model sofreu.

Apesar do trecho citado do livro do Fowler não ser incisivo em relação a interação entre a Model e a View, no MVC a Model notifica a View através de eventos quando seu estado é alterado.

O exemplo na verdade utiliza uma versão adaptada do MVC conhecida como MVP (Model View Presenter), cuja principal diferença é a controller alterando a Model e notificando a View das alterações feitas.

Veja o exemplo apresentado no site da SUN sobre MVC:
http://java.sun.com/developer/technicalArticles/javase/mvc/

Mas existe algum problema com isso?
Tecnicamente não, os dois funcionam muito bem, o problema esta na fato de estar usando um padrão achando que esta usando outro.

Eu particularmente prefiro utilizar o MVP, principalmente quando se pensa em DDD eu procuro deixar somente código referente a regras de negócio no domínio.

Fica esse alerta pra quem esta começando a utilizar esses padrões, principalmente por que outros estão surgindo como MVVM por exemplo, já pensou se a gente não saber a diferença entre eles?

Um comentário:

Dizinho disse...

Tudo bem, eu assumo. Fui eu quem passou o trecho do Fowler e o link do Code Project tentando justificar minha alegação de estar usando MVC em um aplicativo quando, na opinião do Eduardo, o que estava sendo utilizado era MVP.

Eu concordo que me equivoquei. No entanto, não vou assumir esse erro sozinho. Muita gente com experiência no assunto não faz distinção entre MVP e MVC.

Até mesmo o técnico da SUN, no link que o Eduardo postou e que foi citado no Code Project, não faz distinção entre MVC e MVP. Ele usa o termo "Modified MVC" e nem se preocupa em usar MVP.