[Cascavel-pm] WxPerl e MVC

Alceu R. de Freitas Jr. glasswalk3r em yahoo.com.br
Terça Março 20 14:30:15 PDT 2007


Olá monges,

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.

Eu criei uma aplicação de exemplo com três classes
(Model, View e Controler). Até aí tudo bem. O problema
é que eu tenho que mapear que, dado um evento
(pressionar um botão) eu teria que disparar uma
chamada de método do Controler, que por sua vez
acionaria o modelo (recuperando dados) e alterar a
view (via método).

O problema é que no WxPerl um evento de botão deve ser
mapeado diretamente (?) no frame aonde o botão foi
definido, então acabei fazendo duas coisas:

1 - A classe Controler guarda referências para
instâncias das classes View e Model.

2 - A classe View possui uma referência para
Controler.

Isso ficou dessa forma (vou postar apenas parte do
código, a lista aceita anexos?):

package View::Frame;

use Wx qw(wxTE_MULTILINE wxICON_ERROR wxTE_READONLY
wxDefaultSize wxVSCROLL);
use base qw(Wx::Frame Class::Accessor);
use Wx::Event qw(EVT_BUTTON);

__PACKAGE__->follow_best_practice();
__PACKAGE__->mk_ro_accessors(qw(start_button
write_panel read_panel));

sub set_event_taker {

    my $self = shift;

    $self->{event_taker} = shift;

    EVT_BUTTON( $self, 3, \&show_result );

}

E na classe Controler:

package Controler;

use warnings;
use strict;

use lib 'C:\temp';
use Model;
use View;

use base qw(Class::Accessor);
__PACKAGE__->follow_best_practice;
__PACKAGE__->mk_ro_accessors(qw(view model));

sub new {

    my $class = shift;

    my $self = { view => View->new(), model =>
Model->new() };

    bless $self, __PACKAGE__;

    return $self;

}


sub button_clicked {

    my ( $self, $query ) = @_;
    my $properties_ref;

    eval {

        my $model = $self->get_model;
        $model->init($query);
        $properties_ref = $model->get_properties;

    };

    if ($@) {

        return "$@";

    }
    else {

        return $properties_ref;

    }

}

E finalmente, no script que inicia a aplicação:

use lib 'c:\temp';
use Controler;

my $controler = Controler->new();
my $view    = $controler->get_view();

#registering the code that will treat the button event
my $frame = $view->GetTopWindow;
$frame->set_event_taker($controler);

$view->MainLoop;

Isso me pareceu complicado demais, sem considerar o
tra balho extra. Eu poderia tentar mapear eventos
dentro da classe Controler, mas perderia a
flexibilidade de poder mudar de View sem muito
esforço.

Alguma dica? Estaria eu utilizando o WxPerl ou MVC (ou
ambos) de forma errada?

[]'s


Alceu Rodrigues de Freitas Junior
--------------------------------------
glasswalk3r em yahoo.com.br
http://www.imortais.cjb.net
-----------------------------------------------------------------------
A well-used door needs no oil on its hinges.
A swift-flowing stream does not grow stagnant.
Neither sound nor thoughts can travel through a vacuum.
Software rots if not used.
These are great mysteries -- The Tao Of Programming, 5.1

__________________________________________________
Fale com seus amigos  de graça com o novo Yahoo! Messenger 
http://br.messenger.yahoo.com/ 


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