Você está na página 1de 30

Programao Baseada

em Regras com RTTI

Mrio Guedes

DESAFIOS DO DIA A DIA

Demandas atuais de
desenvolvimento
No de hoje que as solues de desenvolvimento
so cada vez mais complexas:
Plataformas diferentes

32 bits; 64 bits; Web; Mobile ...

Sistemas operacionais diferentes

Windows; Mac; Linux; iOS; Android ...

Integrao

Java; .NET; PHP; Python; Ruby ...


Sistemas legados; Telefonia; Governos; Web Services
...

Regras de Negcio

Enfim, vivemos em um momento onde as Regras de


Negcio so cada vez mais complexas e imprevisveis
e exigem respostas rpidas

Oportunidade
A nova RTTI (Delphi 2010) nos d a oportunidade
de entregar muito mais com menos cdigo;
Cdigo mais limpo: menos rudo;
Mas muitos de ns pensamos que para poucos e
iniciados;
Mas no .

PROGRAMAO
BASEADA EM REGRAS

Programao Baseada em
Regras
uma forma de abordar os desafios de
desenvolvimento;
Busca facilitar a rpida adaptao do software
uma mudana de regra de negcio;
No Delphi, podemos usar a RTTI, Generics e
Customs Attributes para atingir este objetivo;
No substitui nenhum paradigma: trata-se apenas
de uma estratgia;

RTTI

O que RTTI?

Informao de Tipo em Tempo de Execuo;

o framework oferecido pelo Delphi para prover Reflexo de


tipos;

Por tipo entenda:


Classes; Records; Ordinais; Interfaces; Primitivos (integer,
string , ...) e etc.;

O prprio Delphi usa a RTTI: afinal ele esta em tempo de execuo


e precisa, entre outras coisas, mostrar as propriedades dos objetos
no Object Inspector;

Desde o Delphi 2010 est muito mais simples de usar e muito mais
poderoso;

Generics

Introduzido no Delphi 2009, tipos genricos ou tipos


parametrizados nos permite criar moldes de classes e mtodos;

Proporciona baixo acoplamento de cdigo;

Extremamente til para listas de objetos e arrays:


TList<TMinhaClasse>
...
TArray<TMinhaClasse>

Usamos a notao:
<tipo>

function GerarLinha<T>(ADados: T): string;

Atributos Personalizados
A partir do Delphi 2010 temos um novo recurso na
RTTI que a classe TCustomAttributes;
uma maneira de atribuir uma qualidade, ou
uma informao a qualquer elemento da
programao:
Classe, Record, Campos, Mtodos, Parmetros,
etc;

Atributos Personalizados
caracterizado por uma classe descendente de
TCustomAttributes que por sua vez no
implementa nada de especial;
Ao atribuir a qualidade a um elemento usamos a
notao:
[Nome_da_Classe(Parmetros do Construtor)]
[TExemplo(Delphi XE 3)]
property Exemplo: string read FExemplo;

Com funciona?
A unidade System.RTTI possui todo o arsenal
necessrio para tirar proveito do recurso;
A unidade muito bem documentada, facilitando o
entendimento;
Oferece vrias classes de Reflexo;

Em geral, fazemos chamadas


recursivas e em loop para
conseguir as informaes
desejadas;

TRTTIContext
o tipo responsvel por iniciar os recursos da RTTI;

um record, e no uma classe!


Deve ser inicializado e finalizado:

_ctx := TRTTIContext.Create;
_ctx.Free;

Possui mtodos para retornar um TRTTIType:

GetType
GetTypes
FindType
GetPackages

TRTTIType
Prov informaes sobre um tipo;
Possui mtodos para obter:
Campos
Mtodos
Propriedades

Podemos verificar o tipo qual o TRTTIType se


refere atravs da propriedade TypeKind

TRTTIProperty
Prov informaes sobre uma propriedade;
Entre outras informaes oferecidas destaca-se:

IsReadable Indica se pode ser lido;


IsWritable Indica se pode ser escrito;
Visibility Indica o escopo de visibilidade;
GetValue Permite ler um valor de uma
determinada instncia;
SetValue Permite escrever um valor em uma
determinada instncia;

TValue
o tipo de reflexo que representa o valor de um
propriedade de uma determinado tipo em uma
determinada instncia ;
Para determinar o tipo do valor podemos usar o
mtodo: IsType<tipo>
Para recuperar o valor podemos usar o mtodo:
AsType<tipo>
Parece com o variant mas no tem nada a ver;

TCustomAttributes
Toda classe de reflexo possui o mtodo
GetAttributtes que retorna um
TArray<TCustomAttributes>

Devemos, ento, varrer esses atributos e tomar as


decises pertinentes ao domnio do problema que
esta sendo resolvido;

DEMONSTRAO
PRTICA

Exemplo de aplicao
Vamos imaginar um sistema que deve gerar um
documento eletrnico para o Governo, como por
exemplo o EFD-Pis/Cofins;

Vamos focar no aspecto de gerao das strings que


compe o tal documento;
Decidimos que cada layout de linha ser
representado por uma classe;

Layout hipottico - simplificado


Toda linha tem um nmero de identificao com 3
algarismos;
As informaes que compe cada linha so separadas
por pipe;
Datas so representadas por ddmmyyyy;

Valores monetrios no precisam de separador


decimal;
Importante observar a ordem das linhas e dos campos;

Layout hipottico - simplificado


Linha 000 Data de gerao do documento
Linha 001 Informaes da contabilidade

Nome do contador: mximo de 50 caracteres


CRC do contador: exatamente 10 caracteres

Linha 002 Dados da empresa

Nome da empresa: mximo de 50 caracteres


CNPJ: exatamente 14caracteres

Linha 003 Vendas

Data da venda: formato data


Nome do Cliente: mximo de 50 caracteres
Valor da compra: formato monetrio

Linha 999 Fechamento do documento

Estratgia de desenvolvimento
Ser desenvolvido uma classe base que atravs dos
atributos personalizados gerar a string corretamente:
TGeraLinha
Cada linha descrita no layout ter uma classe
correspondente, sendo que cada campo imprimvel
ser representado por uma propriedade publicada
(escopo published)
Cada propriedade que representa um campo
imprimvel ter os atributos personalizados
necessrios

Estratgia de desenvolvimento
As classes de gerao de linha sero instanciadas e
enfileiradas em uma lista especializada nos
permitindo gerar manipular as instncias a
qualquer momento;

Atributos personalizados
identificados - Regras
No nosso cenrio hipottico, identificamos algumas regras
possveis e suas caractersticas, a saber:

TCodigoLinhaAttribute

TOrdemImpressaoAttribute

TStringVariavelAttribute

TStringFixaAttribute

TDataAttribute

TMonetarioAttribute

E se?

Surgir uma nova linha ou outra no for mais necessria?


Podemos criar novas classes e descartar as que no forem mais
necessrias com esforo mnimo.

Mudarem a formatao dos campos como a data por exemplo?


Simplesmente v no cdigo-ninja e faa as adequaes
pertinentes.

Mudarem o tamanho de um campo ou a ordem dos campos de


uma determinada linha?
V na classe em questo e mude os valores necessrios nos
atributos personalizados.

Surgir um novo tipo de formatao, como o Boolean por exemplo?


Simplesmente crie um novo atributo personalizado e adeque o
cdigo-ninja

Consideraes finais
Vrias solues podem aplicar este recurso:

ORM
Serializao de objetos
Protocolos de comunicao
Gerao de documentos (EDI)
Classes Proxies de comunicao (Data Snap)

Faz parte da estratgia criar um gerador de cdigo,


ou seja, um aplicativo que a partir de uma fonte
(banco de dados, planilha, arquivo INI, etc.) gere os
tipos automaticamente.

Links interessantes

RTTI (Run-time Type Information)


Rodrigo Leonhardt
http://edn.embarcadero.com/br/article/41728

Robs Technology Corner


Robert Love
http://robstechcorner.blogspot.com.br/search/label/RTTI

Novidades no Delphi 2010


Rodrigo Carreiro Mouro
http://www.devmedia.com.br/curso/novidades-no-delphi-2010/210

Eu Gosto do Delphi
Mrio Guedes
http://eugostododelphi.blogspot.com.br/search/label/rtti

Perguntas?

Portal de Treinamentos e Vagas http://www.edobrasil.net/treinamentos


Embarcadero Developer Network - http://edn.embarcadero.com
Diretrio de MVPs - http://www.embarcadero.com.br/mvp-directory
Documentao dos Produtos - http://docs.embarcadero.com
CodeRage 7 - http://www.embarcadero.com/coderage
YouTube - http://youtube.com/user/embarcaderodobrasil
Twitter - https://twitter.com/EmbarcaderoBR http://twitter.com/EmbarcaderoTech
Blogs: http://blogs.embarcadero.com
Facebook:
https://www.facebook.com/pages/Embarcadero-Delphi-Brasil/399151510134179

atendimento@embarcadero.com.br
(11) 5643-1333

Obrigado!

Mrio Guedes
mario.guedes@arrayof.com.br

http://eugostododelphi.blogspot.com
http://br.linkedin.com/in/jmarioguedes
http://facebook.com/eugostododelphi
http://twitter.com/eugostododelphi

Você também pode gostar