delphi conference 2012 - programação baseado em regras com rtti

30
Programação Baseada em Regras com RTTI Mário Guedes

Upload: mario-guedes

Post on 29-Jun-2015

1.238 views

Category:

Technology


3 download

DESCRIPTION

Material de apoio à palestra sobre RTTI no Delphi Conference 2012. Mostra uma abordagem prática quanto a introspecção de classe no Delphi.

TRANSCRIPT

Page 1: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Programação Baseada em Regras com RTTI

Mário Guedes

Page 2: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

DESAFIOS DO DIA A DIA

Page 3: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Demandas atuais de desenvolvimento

• Não é de hoje que as soluções de desenvolvimento são cada vez mais complexas:

• Plataformas diferentes

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

• Sistemas operacionais diferentes

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

• Integração

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

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

Page 4: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Regras de Negócio

Enfim, vivemos em um momento onde as Regras de Negócio são cada vez mais complexas e imprevisíveis

e exigem respostas rápidas

Page 5: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Oportunidade

• A nova RTTI (Delphi 2010) nos dá a oportunidade de entregar muito mais com menos código;

• Código mais limpo: menos ruído;

Mas muitos de nós pensamos que é para poucos e iniciados;

Mas não é.

Page 6: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

PROGRAMAÇÃO BASEADA EM REGRAS

Page 7: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Programação Baseada em Regras

• É uma forma de abordar os desafios de desenvolvimento;

• Busca facilitar a rápida adaptação do software à uma mudança de regra de negócio;

• No Delphi, podemos usar a RTTI, Generics e Customs Attributes para atingir este objetivo;

• Não substitui nenhum paradigma: trata-se apenas de uma estratégia;

Page 8: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

RTTI

Page 9: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

O que é RTTI?

• Informação de Tipo em Tempo de Execução;

• É o framework oferecido pelo Delphi para prover Reflexão de tipos;

• Por tipo entenda: • Classes; Records; Ordinais; Interfaces; Primitivos (integer,

string , ...) e etc.;

• O próprio Delphi usa a RTTI: afinal ele esta em tempo de execução 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;

Page 10: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Generics

• Introduzido no Delphi 2009, tipos genéricos ou tipos parametrizados nos permite criar “moldes” de classes e métodos;

• Proporciona baixo acoplamento de código;

• Extremamente útil para listas de objetos e arrays: TList<TMinhaClasse> ... TArray<TMinhaClasse>

• Usamos a notação: <tipo> function GerarLinha<T>(ADados: T): string;

Page 11: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

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 “informação” a qualquer elemento da programação:

• Classe, Record, Campos, Métodos, Parâmetros, etc;

Page 12: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Atributos Personalizados

• É caracterizado por uma classe descendente de TCustomAttributes que por sua vez não implementa nada de especial;

• Ao atribuir a “qualidade” a um elemento usamos a notação: [Nome_da_Classe(Parâmetros do Construtor)]

[TExemplo(‘Delphi XE 3’)]

property Exemplo: string read FExemplo;

Page 13: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Com funciona?

• A unidade System.RTTI possui todo o arsenal necessário para tirar proveito do recurso;

• A unidade é muito bem documentada, facilitando o entendimento;

• Oferece várias classes de Reflexão;

• Em geral, fazemos chamadas recursivas e em loop para conseguir as informações desejadas;

Page 14: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

TRTTIContext

• É o tipo responsável por iniciar os recursos da RTTI;

• É um record, e não uma classe!

• Deve ser inicializado e finalizado: _ctx := TRTTIContext.Create; _ctx.Free;

• Possui métodos para retornar um TRTTIType: • GetType • GetTypes • FindType • GetPackages

Page 15: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

TRTTIType

• Provê informações sobre um tipo;

• Possui métodos para obter:

• Campos

• Métodos

• Propriedades

• Podemos verificar o tipo à qual o TRTTIType se refere através da propriedade TypeKind

Page 16: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

TRTTIProperty

• Provê informações sobre uma propriedade;

• Entre outras informações 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 instância;

• SetValue – Permite escrever um valor em uma determinada instância;

Page 17: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

TValue

• É o tipo de reflexão que representa o valor de um propriedade de uma determinado tipo em uma determinada instância ;

• Para determinar o tipo do valor podemos usar o método: IsType<tipo>

• Para recuperar o valor podemos usar o método: AsType<tipo>

• Parece com o variant mas não tem nada a ver;

Page 18: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

TCustomAttributes

• Toda classe de reflexão possui o método GetAttributtes que retorna um TArray<TCustomAttributes>

• Devemos, então, varrer esses atributos e tomar as decisões pertinentes ao domínio do problema que esta sendo resolvido;

Page 19: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

DEMONSTRAÇÃO PRÁTICA

Page 20: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Exemplo de aplicação

• Vamos imaginar um sistema que deve gerar um documento eletrônico para o Governo, como por exemplo o EFD-Pis/Cofins;

• Vamos focar no aspecto de geração das strings que compõe o tal documento;

• Decidimos que cada layout de linha será representado por uma classe;

Page 21: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Layout hipotético - simplificado

• Toda linha tem um número de identificação com 3 algarismos;

• As informações que compõe cada linha são separadas por pipe;

• Datas são representadas por ddmmyyyy;

• Valores monetários não precisam de separador decimal;

• Importante observar a ordem das linhas e dos campos;

Page 22: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Layout hipotético - simplificado

• Linha 000 – Data de geração do documento • Linha 001 – Informações da contabilidade

• Nome do contador: máximo de 50 caracteres • CRC do contador: exatamente 10 caracteres

• Linha 002 – Dados da empresa • Nome da empresa: máximo de 50 caracteres • CNPJ: exatamente 14caracteres

• Linha 003 – Vendas • Data da venda: formato data • Nome do Cliente: máximo de 50 caracteres • Valor da compra: formato monetário

• Linha 999 – Fechamento do documento

Page 23: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Estratégia de desenvolvimento

• Será desenvolvido uma classe base que através dos atributos personalizados gerará a string corretamente: TGeraLinha

• Cada linha descrita no layout terá uma classe correspondente, sendo que cada campo imprimível será representado por uma propriedade publicada (escopo published)

• Cada propriedade que representa um campo imprimível terá os atributos personalizados necessários

Page 24: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Estratégia de desenvolvimento

• As classes de geração de linha serão instanciadas e enfileiradas em uma lista especializada nos permitindo gerar manipular as instâncias a qualquer momento;

Page 25: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Atributos personalizados identificados - Regras

No nosso cenário hipotético, identificamos algumas regras possíveis e suas características, a saber: • TCodigoLinhaAttribute

• TOrdemImpressaoAttribute

• TStringVariavelAttribute

• TStringFixaAttribute

• TDataAttribute

• TMonetarioAttribute

Page 26: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

E se?

• Surgir uma nova linha ou outra não for mais necessária? Podemos criar novas classes e descartar as que não forem mais necessárias com esforço mínimo.

• Mudarem a formatação dos campos como a data por exemplo? Simplesmente vá no “código-ninja” e faça as adequações pertinentes.

• Mudarem o tamanho de um campo ou a ordem dos campos de uma determinada linha? Vá na classe em questão e mude os valores necessários nos atributos personalizados.

• Surgir um novo tipo de formatação, como o Boolean por exemplo? Simplesmente crie um novo atributo personalizado e adeque o “código-ninja”

Page 27: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Considerações finais

• Várias soluções podem aplicar este recurso: • ORM

• Serialização de objetos

• Protocolos de comunicação

• Geração de documentos (EDI)

• Classes Proxies de comunicação (Data Snap)

• Faz parte da estratégia criar um gerador de código, ou seja, um aplicativo que a partir de uma fonte (banco de dados, planilha, arquivo INI, etc.) gere os tipos automaticamente.

Page 29: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Perguntas?

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

• Embarcadero Developer Network - http://edn.embarcadero.com

• Diretório de MVP’s - http://www.embarcadero.com.br/mvp-directory

• Documentação 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

[email protected] • (11) 5643-1333

Page 30: Delphi Conference 2012 - Programação Baseado em Regras com RTTI

Obrigado!

Mário Guedes [email protected]

http://eugostododelphi.blogspot.com

http://br.linkedin.com/in/jmarioguedes

http://facebook.com/eugostododelphi

http://twitter.com/eugostododelphi