[Cascavel-pm] WxPerl e MVC

Daniel Ruoso daniel em ruoso.com
Terça Março 20 16:17:24 PDT 2007


Ter, 2007-03-20 às 18:30 -0300, Alceu R. de Freitas Jr. escreveu:
> Estou tentando aplicar o padrão MVC numa aplicação em
> WxPerl mas não estou muito contente com os resultados,
> então venho pedir um pouco de sabedoria vocês.

Acredite, aplicar MVC no nível da aplicação não é propriamente uma coisa
simples mesmo que seja utilizando Swing (argh) do Java (eca). Existe uma
questão fundamental que é o fato que mesmo nos toolkits MVC sempre há
alguma coisa que não encaixa corretamente no modelo MVC.

No fim das contas, quando eu trabalhava com Java (eca), eu não consegui
utilizar o MVC do Swing (argh) por ele mesmo, precisei dar uma boa
ajuda. O que acabou acontecendo foi, ao invés de eu ter o seguinte:

<VIEW> -------  <MODEL>
     \         /
    <CONTROLLER>

Eu acabei tendo algo como

<VIEW> -----<ADAPTORS>------ <MODEL>
 |                             |
 | eventos de botão            |
 |                             |
 ----------<CONTROLLER>---------

Os objetos adaptor são objetos que ficam esperando por eventos no view e
para atualizar os dados no model e esperam por eventos no model para
fazer as atualizações no view. O nome disso é "Observer Pattern". No
caso do Java (eca), o meu model era uma subclasse de Hashtable que
disparava eventos nas mudanças dos atributos, da mesma forma pode ser
feito em Perl, com um tied hash que dispara os eventos quando algum
valor muda.

O controller também ouve eventos do Model, mas normalmente para fazer
alguns cálculos (soma dos itens em uma lista, por exemplo) e também ouve
eventos da view para disparar eventos (um botão de salvar clicado por
exemplo). Dessa forma, o hash vai ter todos os dados da interface sempre
atualizados e poderá ser enviado diretamente para a camada de negócios.

Vale lembrar que isso é um bocado diferente daquilo que se entende por
MVC na web, um dos primeiros posts que eu fiz no perlmonks foi sobre
isso [1]. 

O que eu faria seria ter o Controller como classe principal que faria
com que o View fosse exibido ou fechado dependendo dos eventos, que iria
iniciar os adaptors para conectar o Model ao View, de forma que apenas o
controller tem a referencia para os outros objetos, embora o adaptor
registre-se como "listener" dos eventos do model e do view.

Daniel

[1] http://www.perlmonks.org/?node_id=464418



Mais detalhes sobre a lista de discussão Cascavel-pm