Programação Baseada
em Regras com RTTI
Mário Guedes
DESAFIOS DO DIA A DIA
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
...
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
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 é.
PROGRAMAÇÃO
BASEADA EM REGRAS
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;
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;
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;
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;
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;
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;
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
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
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;
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;
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;
DEMONSTRAÇÃO
PRÁTICA
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;
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;
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
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
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;
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
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”
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.
Links interessantes
• RTTI (Run-time Type Information)
Rodrigo Leonhardt
http://edn.embarcadero.com/br/article/41728
• Rob’s Technology Corner
Robert Love
http://robstechcorner.blogspot.com.br/search/label/RTTI
• Novidades no Delphi 2010
Rodrigo Carreiro Mourão
http://www.devmedia.com.br/curso/novidades-no-delphi-2010/210
• Eu Gosto do Delphi
Mário 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
• 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
• atendimento@embarcadero.com.br
• (11) 5643-1333
Obrigado!
Mário Guedes
mario.guedes@arrayof.com.br
http://eugostododelphi.blogspot.com
http://br.linkedin.com/in/jmarioguedes
http://facebook.com/eugostododelphi
http://twitter.com/eugostododelphi

Mais conteúdo relacionado

PPTX
Delphi Parallel Programming Library
PDF
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
PPTX
Nova Infraestrutura JSON: System.JSON na prática
PDF
Delphi Conference 2011 - Desmistificando as Expressões Regulares
PPTX
Conhecendo o Novo REST Framework
PDF
Node.JS - Campus Party Brasil 2011
PDF
Frameworks PHP
PDF
Ruby & Rails
Delphi Parallel Programming Library
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Nova Infraestrutura JSON: System.JSON na prática
Delphi Conference 2011 - Desmistificando as Expressões Regulares
Conhecendo o Novo REST Framework
Node.JS - Campus Party Brasil 2011
Frameworks PHP
Ruby & Rails

Mais procurados (20)

PPTX
Testes com javascript
PDF
Aula 02 - Introdução ao PHP
PPTX
C# 6.0 - Interopmix 2015
PDF
Conhecendo Ruby on Rails
PPTX
C# 6.0 - DotNetBaixada - Novembro/2015
PDF
40 php orientado a objetos
KEY
Python, a arma secreta do Google
PDF
Introdução à linguagem de programação Python
PDF
Desenvolvimento web com python e django
PPTX
Paralelismo na prática: Threads de uma vez por todas e sem medo!
PPTX
Node JS - Parte 1
PPTX
Javascript por debaixo dos panos
PPTX
Palestra Apresentando Python e Suas Aplicações
PDF
Python - Programando em alto nível
PDF
Conhecendo a JSR 223: Scripting for the Java Platform
PPT
Desenvolvimento web: PHP orientado a objetos
PDF
Aula03 PHP - Estruturas Condicionais
PPTX
Comandos gerais do PHP
Testes com javascript
Aula 02 - Introdução ao PHP
C# 6.0 - Interopmix 2015
Conhecendo Ruby on Rails
C# 6.0 - DotNetBaixada - Novembro/2015
40 php orientado a objetos
Python, a arma secreta do Google
Introdução à linguagem de programação Python
Desenvolvimento web com python e django
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Node JS - Parte 1
Javascript por debaixo dos panos
Palestra Apresentando Python e Suas Aplicações
Python - Programando em alto nível
Conhecendo a JSR 223: Scripting for the Java Platform
Desenvolvimento web: PHP orientado a objetos
Aula03 PHP - Estruturas Condicionais
Comandos gerais do PHP
Anúncio

Destaque (17)

ODP
Delphi Conference 2012 - Qualidade no Código
PDF
Oo delphi
ODP
Fortes Papo Developer
PPTX
Delphi Conference 2011 - Integração Contínua
ODP
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
ODP
Curso de Delphi - Banco de Dados
PDF
PDF
Git & Delphi
PPTX
Gnostice Suporte completo a PDF e Office - Embarcadero Conference 2015
PPTX
Delphi XE7 - O que há de novo?
PPTX
Linguagem Delphi-Introdução
PDF
Orientação a Objetos no Delphi - Controle de Estoque (III)
PDF
Orientação a Objetos no Delphi - Controle de Estoque (II)
PDF
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
PDF
Programação orientada a objetos em delphi
PDF
Orientação a Objetos no Delphi - Por onde começar (I)
PDF
Curso De Programação Em DelPhi
Delphi Conference 2012 - Qualidade no Código
Oo delphi
Fortes Papo Developer
Delphi Conference 2011 - Integração Contínua
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
Curso de Delphi - Banco de Dados
Git & Delphi
Gnostice Suporte completo a PDF e Office - Embarcadero Conference 2015
Delphi XE7 - O que há de novo?
Linguagem Delphi-Introdução
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (II)
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Programação orientada a objetos em delphi
Orientação a Objetos no Delphi - Por onde começar (I)
Curso De Programação Em DelPhi
Anúncio

Semelhante a Delphi Conference 2012 - Programação Baseado em Regras com RTTI (20)

KEY
Desenvolvimento iOS - Aula 1
PDF
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
PPTX
PDF
TDD com Código Legado - "Atualizado"
PDF
Agbd aula4 sql_ddl
PPTX
Novidades do SQL Server 2008
PPT
aula__tecnica_de_programação_algoritmo.ppt
PPTX
Linguagem C - Estruturas
PDF
Aula 2 - Introduçãoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
PPTX
PPTX
Fiqueemcasa.conf
PDF
11-codigo-limpo-parte-4.pdf
PPTX
Boas práticas técnica para um código limpo (Clean Code)
PDF
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
PPTX
As vantagens e desvantagens da aplicação de padrões de projeto
PPS
Projeto de Software
PDF
SQLAlchemy - Desenvolvendo uma aplicação com Python
PPT
Aula desesenvolvimento segunda semana
PDF
TDD com Código Legado
PPT
Estimativa de software usando pontos de função
Desenvolvimento iOS - Aula 1
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
TDD com Código Legado - "Atualizado"
Agbd aula4 sql_ddl
Novidades do SQL Server 2008
aula__tecnica_de_programação_algoritmo.ppt
Linguagem C - Estruturas
Aula 2 - Introduçãoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
Fiqueemcasa.conf
11-codigo-limpo-parte-4.pdf
Boas práticas técnica para um código limpo (Clean Code)
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
As vantagens e desvantagens da aplicação de padrões de projeto
Projeto de Software
SQLAlchemy - Desenvolvendo uma aplicação com Python
Aula desesenvolvimento segunda semana
TDD com Código Legado
Estimativa de software usando pontos de função

Mais de Mario Guedes (20)

PPTX
O que é e como devo usar o REDIS? - 1o Mobile REST Summit
PPTX
Fazendo barba, cabelo e bigode com REDIS
PDF
Integrando-se à Blockchain da Ethereum
PPTX
Entendendo HTTP para entender o REST
PPT
Expressão Regular - Cookbook
PDF
Geolocalização com Redis e Google Maps
PPTX
Foco no app, viva o serverless!
PPTX
Geolocalização com Redis e Google Maps
PPTX
Escalabilidade com Redis
PPTX
Escalando o backend com NGINX e Redis
PPTX
Turbinando o seu sistema com Redis!
PPTX
Microsserviço, Escalabilidade e Resiliência - #comofas?
PPTX
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
PPTX
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
PPTX
Extreme Experience 2018 | Python para quem sabe Delphi
PPTX
Intensive Delphi 2017 - E este tal de Redis hein?
PPTX
BOT: Conversando com o seu sistema
PPTX
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
PPTX
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
PPTX
Arquitetura escalável e resiliente com NGINX, DataSnap, REDIS e MongoDB
O que é e como devo usar o REDIS? - 1o Mobile REST Summit
Fazendo barba, cabelo e bigode com REDIS
Integrando-se à Blockchain da Ethereum
Entendendo HTTP para entender o REST
Expressão Regular - Cookbook
Geolocalização com Redis e Google Maps
Foco no app, viva o serverless!
Geolocalização com Redis e Google Maps
Escalabilidade com Redis
Escalando o backend com NGINX e Redis
Turbinando o seu sistema com Redis!
Microsserviço, Escalabilidade e Resiliência - #comofas?
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Python para quem sabe Delphi
Intensive Delphi 2017 - E este tal de Redis hein?
BOT: Conversando com o seu sistema
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Arquitetura escalável e resiliente com NGINX, DataSnap, REDIS e MongoDB

Último (12)

PPTX
Tipos de servidor em redes de computador.pptx
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PDF
Manejo integrado de pragas na cultura do algodão
PDF
Jira Software projetos completos com scrum
PPTX
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PDF
Processos no SAP Extended Warehouse Management, EWM100 Col26
PPTX
Analise Estatica de Compiladores para criar uma nova LP
PPT
Conceitos básicos de Redes Neurais Artificiais
PPTX
Utilizando code blockes por andre backes
Tipos de servidor em redes de computador.pptx
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Manejo integrado de pragas na cultura do algodão
Jira Software projetos completos com scrum
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Viasol Energia Solar -Soluções para geração e economia de energia
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Processos no SAP Extended Warehouse Management, EWM100 Col26
Analise Estatica de Compiladores para criar uma nova LP
Conceitos básicos de Redes Neurais Artificiais
Utilizando code blockes por andre backes

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

  • 1. Programação Baseada em Regras com RTTI Mário Guedes
  • 3. 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 ...
  • 4. 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
  • 5. 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 é.
  • 7. 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;
  • 9. 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;
  • 10. 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;
  • 11. 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;
  • 12. 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;
  • 13. 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;
  • 14. 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
  • 15. 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
  • 16. 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;
  • 17. 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;
  • 18. 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;
  • 20. 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;
  • 21. 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;
  • 22. 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
  • 23. 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
  • 24. 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;
  • 25. 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
  • 26. 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”
  • 27. 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.
  • 28. Links interessantes • RTTI (Run-time Type Information) Rodrigo Leonhardt http://edn.embarcadero.com/br/article/41728 • Rob’s Technology Corner Robert Love http://robstechcorner.blogspot.com.br/search/label/RTTI • Novidades no Delphi 2010 Rodrigo Carreiro Mourão http://www.devmedia.com.br/curso/novidades-no-delphi-2010/210 • Eu Gosto do Delphi Mário Guedes http://eugostododelphi.blogspot.com.br/search/label/rtti
  • 29. 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 • atendimento@embarcadero.com.br • (11) 5643-1333