05 Ago, 2009 12:25

Programando para Windows Mobile usando MVC e Delegates - Parte 1

Por conta de um projeto para a UFRJ em Windows Mobile da Mobits, comecei a desenvolver em C# utilizando o Visual Studio 2008. Fora as dificuldades iniciais, um dos pontos mais críticos, utilizando o Visual Studio, foi quando nós tentamos seguir o padrão de projetos MVC.

Eu explico. Quando você utiliza o Visual Studio (principalmente para quem já programou nele anos atrás fazendo aplicativos para VB6), a tentação de colocar todo o seu código dentro das views (os formulários) é muito grande. Está tudo ali dentro, prontinho, basta clicar duas vezes no botão e já começar a codificar.

Mas aí é que reside o problema. Não vou gastar esse post relatando as vantagens de se programar seguindo os padrões de projeto, você encontra textos melhores aqui. Por acreditar que em projetos sérios eles valem a pena ser seguidos, comecei a fuçar vários lugares para descobrir como poderia lançar mão do padrão. Pesquisando, achei quais seriam as técnicas que serviriam para os meus propósitos: os eventos e os delegates.

Nesse primeiro post, eu vou falar um pouco sobre como utilizar os delegates para esse propósito. Em um segundo post, vou tentar explicar como funcionam os eventos e mostrar sua utilização para nossos propósitos.

Delegates

Não há na internet (ou pelo menos eu não procurei direito) um lugar que tenha uma explicação simples de como eles funcionam ou de como utilizá-los. Vamos ver se eu consigo de maneira simples e objetiva.

Os delegates, de um modo simples, são métodos com uma assinatura padrão estipulada na criação e são utilizados no tratamento de métodos e eventos. Eu não me preocupo como um resultado vai ser tratado, então eu delego a um outro objeto o tratamento desse resultado.

Dada essa definição formal, você tem que decidir como utilizar os delegates em seu projeto orientado a camadas. Uma opção seria utilizá-los em praticamente tudo, inclusive na utilização dos tratamento dos eventos da view. Todos os comandos seriam realizados no controller, acessados através dos delegates públicos criados na view.

Na view, eu tenho que criar os delegates que irão tratar os eventos. Para isso, eu tenho primeiro que declarar como será a assinatura dele:

public delegate void ViewEventsDelegate(object args, EventArgs e);

Com essa declaração, eu posso passar um método como parâmetro, desde que o método em questão também possua a assinatura especificada. Imaginando que temos um botão de salvar com nome BtnSalvar, e queremos associar um método para ser executado quando for acionado o evento Click, basta fazer:

public void AddSalvarClick(ViewEventsDelegate metodo) {
    BtnSalvar.Click += new EventHandler(metodo);
}

A vantagem dessa abordagem é que eu posso adicionar não só um método, mas vários para serem executados no mesmo evento. Não que eu tenha achado uma utilidade para isso, mas quem sabe um dia a gente venha precisar! :-)

Com a implementação feita no lado da view, basta que no controller eu diga quem irá implementar o evento. No nosso exemplo, suponha que a view seja ViewAmostras. No corpo do controller teremos:

public class Controller {
    ViewAmostras view; // tela que exibe as amostras

    //construtor
    public Controller() {
        view = new ViewAmostras();
        //sem a assinatura
        view.AddSalvarClick(this.Salvar); 
    }

    void Salvar(object sender, EventArgs e) {
        //implementacao do método de salvar
    }
}

Esta maneira de implementar tem seus prós e contras. Muitos podem considerar esse modo mais burocrático, ou complexo demais. Para os que zelam por Orientação a Objeto, essa é a forma mais correta, por diminuir o acoplamento entre as classes.

Independente do modo, o ideal é que, se o seu desejo é fazer um projeto utilizando MVC, fuja da tentação de fazer todo o código dentro do formulário. Nós já tivemos uma experiência de refatoração aqui na Mobits, e que foi muito tranquila justamente por estar separado em camadas.

No próximo post vou falar sobre os eventos, utilizando eles para notificar as alterações feitas no modelo.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.