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?

sexta-feira, 5 de junho de 2009

Definições – Assunto importante

 

Olá pessoal,
Já faz algum tempo que fico sem postar no meu blog, minha volta para o Coral Kemuel tem tomado bastante tempo :)

Se você estuda ou estudou em qualquer lugar com certeza você já usufruiu da maravilha que é pesquisar assuntos no Google.

Um professor amigo meu chamado Renato (vulgo “Presuntinho”) me dizia que a internet é uma grande fonte de informação mas não de conhecimento, pode ter certeza, isso é verdade.
Quando você resolve aproveitar conteúdo de internet para seus trabalhos, acadêmicos ou não, você deve tomar muito cuidado.

Uma situação muito comum para consultar o “pai” Google é para se pegar definições, pois bem, eu me deparei com algumas que particularmente considero bizarras. Não vou colocar QUEM escreveu, isso não é o importante, o importante é o QUE.

“O flex é um jquery com recursos de transferencia assycornima de dados, suporte a chat sem a necessidade de um código fonte pesado, inumeros controles não disponiveis em ajax, de código aberto e compativel com asp.net (e java, e php, e ruby).”

Pois é, no texto acima o cara tentou dar uma definição do adobe flex. Abaixo segue a definição dada pela própria adobe:

“O Flex é uma estrutura de código aberto altamente produtiva e gratuita para a criação e manutenção de aplicativos Web expressivos implantados de maneira consistente nos principais navegadores, desktops e sistemas operacionais.”
Fonte: http://www.adobe.com/br/products/flex/?promoid=BOZRZ

Agora vamos ver uma definição que foi dada para OOP:

“O OOP é uma técnica de programação de forma estruturada com a finalidade de reaproveitar o código existente e implementar novas classes quando necessário.”

Usar o termo “programação estruturada” na definição de programação orientada a objetos na minha opinião é um equívoco, veja o que eu peguei do wikipéia:

“(A programação estruturada) Foi a forma dominante na criação de software entre a programação linear e a programação orientada por objetos.” Fonte: http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_estruturada

Agora imagina o “campeão” apresentando um trabalho na faculdade na frente “do professor” dando definição de OOP e no meio na frase ele solta “programação estruturada”. O que será que ele vai dizer?

Minha recomendação para evitar esses problemas? Leia, leia muito. Leia livros cite referências, autores …

Comunidade .Net precisamos evoluir nesse sentido leiam as discussões no GUJ sobre DDD e veja como eles se preocupam com definições.