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ço1. 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
Dim sCode As System.IO.StringWriter sCode = New System.IO.StringWriter sCode.WriteLine("MessageBox.Show(""Este Sistema está utilizando compilação ON-THE-FLY"", ""LEIA"", MessageBoxButtons.OK, MessageBoxIcon.Information)") sCode.WriteLine("MessageBox.Show(""Ao invés desta mensagem eu poderia estar realizando processamento sob demanda do meu cliente!!!!"", ""LEIA!!"", MessageBoxButtons.OK, MessageBoxIcon.Information)") "Executando código Dim Retorno As System.IO.StringWriter RuntimeCompiler.Instancia(RuntimeCompiler.Linguagem.VisualBasic).Executar(sCode.ToString, Retorno, Nothing) If Not Retorno Is Nothing Then MessageBox.Show(Retorno.ToString) End If |
4. Código do evento Onclick do Botão obterDados:
Dim sCode As System.IO.StringWriter sCode = New System.IO.StringWriter sCode.WriteLine("Parametros.text= ""moderadores@dotnetraptors.com.br""") "Executando código Dim Retorno As System.IO.StringWriter RuntimeCompiler.Instancia(RuntimeCompiler.Linguagem.VisualBasic).Executar(sCode.ToString, Retorno, TextBox3) If Not Retorno Is Nothing Then MessageBox.Show(Retorno.ToString) End If |
5. Código do evento Onclick do Botão Salvar:
Dim sCode As System.IO.StringWriter sCode = New System.IO.StringWriter sCode.WriteLine("return false") "Executando código Dim Retorno As System.IO.StringWriter If Not RuntimeCompiler.Instancia(RuntimeCompiler.Linguagem.VisualBasic).Executar(sCode.ToString, Retorno, Nothing) Then MessageBox.Show("O REGISTRO NÃO PODE SER SALVO!!") Exit Sub End If |
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.
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET