Desenvolvimento - Visual Basic .NET

On the Fly Code: Aproximando-se da “Solução Perfeita” no desenvolvimento de produtos

Quantas vezes lidamos com situações bem delicadas com relação à customização de nossos produtos por nossos clientes/clientes potenciais? Neste artigo tentarei mostrar um bom recurso tecnológico para que possamos atender nosso cliente de forma completa...

por Pedro Castelo Branco Lourenço



1. A solução “Perfeita”

Quando nossos clientes(ou potenciais) colocam o nosso produto sobre a mesa e começam a girá-lo, acabam encontrando pontos onde o mesmo não os atenderá da forma esperada. Digamos que de certa forma isso é natural, pois provavelmente o produto fora desenvolvido de forma generalista demais o que não possibilita que o mesmo se alinhe às expectativas reais do nosso cliente. A solução para este problema é o que chamamos de customização, que é justamente um trabalho de adequação do produto à real necessidade do cliente.

Muitas vezes, o processo de customização é um processo caro e implica na implementação de novas funcionalidades no código do produto. Em contrapartida, estas implementações não podem deixar de ser generalistas, pois estamos falando de um “produto de caixinha”. Este artigo se propõe a apresentar uma solução inteligente para que possamos alcançar a “solução perfeita”, que é algo que tende a contemplar a realidade de negócio do nosso cliente.


fig. 1.a.: A solução perfeita tende a contemplar a realidade de negócio do nosso cliente

2. Trabalhando com Geração Dinâmica de Código

Uma ótima solução para que consigamos chegar cada vez mais perto da tão sonhada “solução perfeita” é uilizarmos o que muitos chamam de geração de código “on the fly”, que é basicamente a compilação/execução de código em tempo de execução. É um processo um pouco complexo e utiliza o recurso de Reflection do .NET Framework. Esta opção atende à diversos casos como rotinas de integração de sistemas(geração de gatilhos via aplicação), validações e qualquer implementação de código que não seja extremamente radical. A chave para a análise para a adoção desta solução é se perguntar se o que está sendo implementado requer a intervenção direta no kernel do produto, ou é simplesmente uma extensibilidade do mesmo para que o mesmo chegue mais perto à realidade do negócio sem uma necessidade de escrita de extensos códigos. A arquitetura da solução que iremos propor segue abaixo:


fig. 2.a.: Arquitetura de Geração/Execução de Código Dinâmico
De acordo com a Figura 2, a solução que faremos neste artigo trata da execução do código dinâmico no mesmo appDomain da aplicação. Para que consigamos executar o código dinâmico em outro appDomain, será necessário o uso de remoting, o que aumenta substancialmente o grau de complexidade da solução. Neste artigo não exploraremos esta possibilidade. Outro ponto interessante que vale a pena lembrar de acordo com o diagrama acima é justamente o local de onde virão nossos códigos dinâmicos. Esses códigos podem vir de qualquer lugar: Banco de Dados(como mostrado na Figura), Arquivo texto e N outras possibilidades.A chave é que a “Porção de Código”(String) à ser executada será passada para a nossa classe e ela assumirá o controle para a execução do código.

3. O Papel do nosso “RuntimeCompiler”

Primeiro temos que definir o papel dessa nossa ferramenta que batizaremos de RunTimeCompiler. A função básica desta ferramenta(que na verdade é uma classe) será a compilação, execução e retorno de execução(resultado de processamento ou possíveis erros). Será uma classe sem muita complexidade. Para implementá-la utilizaremos o Design Pattern SingleTon que permitirá a existência de somente uma instância dessa classe para toda nossa aplicação.

O código a ser compilado “on the fly” poderá ser escrito em VB.NET ou C#, ficando a cargo do desenvolvedor definir qual linguagem ele irá utilizar. O padrão que utilizarei neste artigo será a linguagem VB.NET, mas veremos que nossa classe possuirá uma propriedade que indica qual linguagem a ser utilizada. Para a implementação da classe RunTimeCompiler utilizarei a linguagem VB.NET e ressalto que como todos sabemos não teremos problema algum para utilizar a classe de uma aplicação escrita em qualquer libguagem que se apoie no .NET Framework(incluindo C#). Eis a estrutura da nossa classe na notação UML:


fig. 3.a.: Definição da Classe RuntimeCompiler gerada no Microsoft Visio
Iremos abaixo expandir operações realizadas pela classe e como ela as realiza. O código da Classe também estará disponível para download no fim do artigo.

4. Implementação do “RuntimeCompiler”

A implementação da classe RuntimeCompiler fora dividida nas seguintes regiões que serão “expandidas” abaixo:


fig. 4.a.: Regiões de Implementação da Classe RuntimeCompiler


fig. 5.a.: Criando o Formulário de Clientes
2. Vejam a interface do nosso "Formulário de Clientes" com os campos que necessitamos:

fig. 5.b.: Formulário de Clientes, interface final...
3. Código do método Onload do nosso form:
4. Código do evento Onclick do Botão obterDados:
5. Código do evento Onclick do Botão Salvar:
Como podemos ver, nossa aplicação de testes é muito simples, mas espero que tenha dado a dimensão do poder do nosso RunTimeCompiler. Através desta ferramenta poderemos fazer diversas implementações de código bem específicas que o cliente possa demandar à respeito do nosso produto.


6. Concluindo...

Espero que este artigo tenha mostrado o poder que podemos nos aproximar cada vez mais da “solução perfeita”. Grandes CEO´s vêem no atendimento às necessidades dos seus clientes, o futuro do crescimento lucrativo de suas empresas, então porque não passamos a ter esta visão? Só assim conseguiremos atingir a Solução perfeita. Existem uma série de melhorias que pode ser implementada no nosso RuntimeCompiler. O que eu quis deixar claro nesse artigo é que existe um caminho, e precisamos seguí-lo.

Pedro Castelo Branco Lourenço

Pedro Castelo Branco Lourenço - Graduando em Ciências da Computação pela Universidade FUMEC de Belo Horizonte.
Membro do Conselho de Moderadores dos DotNetRaptors(
http://www.dotnetraptors.com.br). Trabalha atualmente como Analista de Tecnologia na STI - Soluçôes em Tecnologia da Informação.(www.stinfo.com.br), exclusivamente com tecnologias Microsoft, principalmente com definição e implementação de soluções na plataforma .NET.