segunda-feira, 27 de abril de 2009

Reflection

Apesar de o C# se destacar por ser uma linguagem estática, de código gerenciado e fortemente tipada, volta e meia nos deparamos com a necessidade de acessar recursos que estão fora deste ambiente gerenciado, de uma forma um pouco mais dinâmica.

Essa não é uma necessidade nova, porém recentemente muito tem se falado de linguagens dinâmicas na plataforma .NET, como os IronPhyton e IronRuby, e até um Dynamic C#, que parece que vai estar aí na versão 4 da linguagem.Enquanto essas novidades não chegam e mostram serviço, a solução mais comum que temos para esse tipo de necessidade é o famoso Reflection do .NET.

O Reflection nos oferece uma forma de encapsularmos assemblies. Ou seja, você pode utilizar o Reflection para acessar um assembly que não esteja diretamente referenciado em seu projeto, e obviamente, utilizar as classes e métodos do mesmo, fazendo um acesso dinâmico a estes recursos.

Veja na listagem abaixo um exemplo clássico de como acessar um assembly através de Reflection. O resultado você confere na figura logo a seguir

System.Reflection.Assembly o = 
System.Reflection.Assembly.Load(
"mscorlib.dll");
MessageBox.Show(o.GetName().ToString());




Mas qual a vantagem de utilizarmos o Reflection? O exemplo mais prático e útil que eu conheço do uso do Reflection, é a chamada dinâmica de métodos, seja de um assembly externo ou não.

Imagine que durante a execução da sua aplicação você tenha que calcular os Impostos de uma Nota Fiscal. Porém, o calculo do Imposto depende diretamente do Estado de Destino desta Nota. Sendo assim temos uma rotina ou método para cada Estado.

Que tal colocar essas informações na tabela de Estado, e fazer uma chamada dinâmica à estes métodos. Veja na próxima figura como ficaria a nossa tabela de Estados.



Note que a coluna Metodo armazena apenas uma string que irá representar o nome do método a ser chamado. Sendo assim, podemos ter estes métodos onde desejarmos, veja o exemplo da próxima listagem:



private void button1_Click(object sender, EventArgs e)
{
// Essa informacao pose ser pesquisada no
// database
string NomeMetodo = "Imposto_MG";

// Você pode enviar quantos parametros quiser
object[] Parametros = new object[1];
Parametros[0] = 100.00;

double Vr_Imposto = 0;

// Procurando metodo pelo Nome, no assembly
// atual
System.Reflection.MethodInfo metodo =
this.GetType().GetMethod(NomeMetodo);
if (metodo != null)
Vr_Imposto =
(double)metodo.Invoke(this, Parametros);

MessageBox.Show(Vr_Imposto.ToString());
}

/// Rotina para calculo do Imposto para SP
public double Imposto_SP(double Vr_Nota)
{
return Vr_Nota * 0.12;
}

/// Rotina para calculo do Imposto para RJ
public double Imposto_RJ(double Vr_Nota)
{
return Vr_Nota * 0.07;
}

/// Rotina para calculo do Imposto para MG
public double Imposto_MG(double Vr_Nota)
{
return Vr_Nota * 0.18;
}

Veja que temos três métodos para o calculo do Imposto, um para cada Estado cadastrado na tabela. Em todos os métodos recebemos como parâmetro o valor da Nota Fiscal, e retornarmos o imposto calculado.

Neste exemplo estamos fazendo a chamada no evento click de um botão qualquer. Veja que o nome do método foi colocado como Imposto_MG, mas esta informação obviamente deve ser recuperada do database, ou da onde você desejar.

Note que estamos criando um objeto para encapsular os parâmetros, e em seguida através do método GetMethod, criamos uma referencia ao método com o nome que está na variável NomeMetodo. Em seguida estamos fazendo a chamada deste método através do método Invoke.

Faça alguns testes e veja que o método chamado será sempre o indicado na string NomeMetodo.

É claro que o Reflection não se resume a isso, temos um namespace inteiro dedicado a ele (System.Reflection). Mas essa é sem dúvida uma ótima forma de fazer chamadas dinâmicas, tornando a lógica da sua aplicação bem mais flexível.

sexta-feira, 17 de abril de 2009

ASP.NET: WebForms X MVC

No começo deste mês de Abril foi o lançamento da versão numero 1 do ASP.NET MVC Framework. Você pode realizar o download gratuito através do seguinte site: http://www.asp.net/mvc/. Além do instalador, você também pode baixar uma infinidade de material de apoio, e também o código fonte que é aberto.

A Microsoft anuncia o MVC Framework como uma alternativa ao modelo tradicionalmente utilizado no ASP.NET, baseado no conceito de WebForms. Mas não significa que o MVC vem pra substituir os WebForms, ele vem como uma opção adicional no desenvolvimento de aplicações ASP.NET. O que em minha opinião é muito acertado.

E nesse contexto surge uma polêmica, quase que uma “briga” entre os que defendem os WebForms, e os que agora são a favor do modelo MVC.

Resumindo um pouco a história, o ASP.NET (WebForm) surgiu à oito anos atrás como uma forma de popularizar o desenvolvimento de aplicações Web, adotando o mesmo conceito de eventos que já tínhamos no Windows Forms.

Muita gente não gostou (e ainda não gosta). Reclamam dos eventos, do complexo request, da linguagem baseada em tags, das Sessions, Postbacks e por aí vai. Todas as reclamações, em um grau ou outro tem seu fundamento.

Mas apesar dos defeitos (muitos deles contornáveis), os WebForms sempre tiveram ótimas qualidades, tanto que muita gente utilizou e ainda utiliza. Eu diria que a grande vantagem do ASP.NET WebForms são as ferramentas que o acompanham. Tanto ferramentas da Microsoft quanto de terceiros, que aumentam muito a produtividade.

Ferramentas que oferecem recursos visuais para o desenvolvimento da aplicação, ou os famosos Wizards! Ahh... Esse sim, o grande mal dos desenvolvedores! (rsrsrs) Essa inclusive é outra “briga”. Ou você nunca ouviu (ou disse) a frase: “Programador de verdade não usa Wizard, faz tudo na unha!”. (rsrsrs) É hilário.

Eu sou plenamente a favor de Wizards, geradores de código ou qualquer ferramenta que automatize partes ou todo o processo do desenvolvimento de software! É claro que como desenvolvedores, temos a obrigação de saber fazer sozinhos o que os Wizards fazem, e também saber o momento certo de utilizá-los (tem muita ferramenta ruim por aí, deve se saber identificar).

Mas toda automação se converte em produtividade, que por sua vez se converte em lucro. Qualquer programador com um pouco de visão empreendedora sabe tirar proveito disso. E parte da popularidade e do sucesso do ASP.NET WebForm está aí, na facilidade e produtividade que trouxe no desenvolvimento de aplicações Web.

É nesse cenário que chega o ASP.NET MVC. Como uma opção da casa, para criar no ASP.NET aplicações sob o cultuado padrão MVC (Model-View-Controller). E é claro que ele trás algumas vantagens, como:

- Facilidade para implementação de testes unitários, e possibilidade de um desenvolvimento TDD (Desenvolvimento orientado à testes);

- Maior controle sobre o código HTML gerado, o que agrada bastante aquele povo ali de cima que não gosta das taglibs;

- Uma arquitetura baseada no mapeamento de rotas (ASP.NET Routing), em substituição aos eventos, o que realmente é uma forma mais elegante de se controlar as requisições.

Isso só pra citar as mais evidentes.

Porém, se você está acostumado a utilizar os controles de interface dos WebForms, como GridView, FormsView, etc. Ou usa alguma bilblioteca de terceiros como o DevExpress, esqueça do MVC por enquanto. No MVC nenhum controle desses funciona! E isso vai de encontro ao quesito produtividade. Porque por enquanto meu amigo, o desenvolvimento de aplicações ASP.NET MVC é todo baseado em código.

Até existem alguns Wizards (vejam só.. rsrs) pra facilitar a geração de parte desse código, mas nada comparado ao resultado final que um XtraGrid do DevExpress oferece (http://demos.devexpress.com/ASPxGridViewDemos/Default.aspx), só pra citar um exemplo.

No final das contas essa discussão entre WebForms X MVC é ótima e tomara que perdure. O ASP.NET nunca foi tão democrático. Não importa se um é melhor que o outro, o que importa é que você pode usar qualquer um deles, então faça a sua escolha e siga em frente.

Vamos esperar para, quem sabe um dia, o ASP.NET MVC oferecer a mesma produtividade que os WebForms oferecem hoje. Esse sim seria o ASP.NET ideal!

Mas eu ainda vou fazer uma camiseta: “Eu uso Wizards, e daí?”. Aceito pedidos, alguém topa? (rsrsr)