SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascriptLaís Lima
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPDaniel Brandão
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015Renato Groff
 
Conhecendo Ruby on Rails
Conhecendo Ruby on RailsConhecendo Ruby on Rails
Conhecendo Ruby on RailsSergio Henrique
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015Renato Groff
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetosFrancisco Santos
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação PythonCarlos Schults
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e djangoIgor Sobreira
 
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Mario Guedes
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas AplicaçõesPalestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas AplicaçõesMarcos Thomaz
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Conhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java PlatformConhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java PlatformMilfont Consulting
 
Desenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosDesenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosLucas Vegi
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisDaniel Brandão
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHPPaulo Dayvson
 

Tendances (20)

Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015
 
Conhecendo Ruby on Rails
Conhecendo Ruby on RailsConhecendo Ruby on Rails
Conhecendo Ruby on Rails
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação Python
 
Mini Curso de PHP
Mini Curso de PHPMini Curso de PHP
Mini Curso de PHP
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!
 
Node JS - Parte 1
Node JS - Parte 1Node JS - Parte 1
Node JS - Parte 1
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas AplicaçõesPalestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas Aplicações
 
Zope
ZopeZope
Zope
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Conhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java PlatformConhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java Platform
 
Desenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosDesenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetos
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas Condicionais
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
 

En vedette

Delphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no CódigoDelphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no CódigoJosé Araújo
 
Fortes Papo Developer
Fortes Papo DeveloperFortes Papo Developer
Fortes Papo DeveloperJosé Araújo
 
Delphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração ContínuaDelphi Conference 2011 - Integração Contínua
Delphi Conference 2011 - Integração ContínuaJosé Araújo
 
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados9º FireBird Developer Day - Automatizar Manutenção do Banco de Dados
9º FireBird Developer Day - Automatizar Manutenção do Banco de DadosJosé Araújo
 
Curso de Delphi - Banco de Dados
Curso de Delphi - Banco de DadosCurso de Delphi - Banco de Dados
Curso de Delphi - Banco de DadosJosé Araújo
 
Gnostice Suporte completo a PDF e Office - Embarcadero Conference 2015
Gnostice Suporte completo a PDF e Office �- Embarcadero Conference 2015Gnostice Suporte completo a PDF e Office �- Embarcadero Conference 2015
Gnostice Suporte completo a PDF e Office - Embarcadero Conference 2015Vic Fernandes
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Ryan Padilha
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Ryan Padilha
 
Design Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelDesign Pattern MVC – Arquitetura de Software Coesa e Flexível
Design Pattern MVC – Arquitetura de Software Coesa e FlexívelRyan Padilha
 
Programação orientada a objetos em delphi
Programação orientada a objetos em delphiProgramação orientada a objetos em delphi
Programação orientada a objetos em delphiHelder Lopes
 
Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)Ryan Padilha
 
Curso De Programação Em DelPhi
Curso De Programação Em DelPhiCurso De Programação Em DelPhi
Curso De Programação Em DelPhiMikeNandes
 

En vedette (17)

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

Similaire à Programação Baseada em Regras com RTTI

Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdfQuitriaSilva550
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"Cesar Romero
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextFull Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextRodrigo Urubatan
 
As vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoAs vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoGabriel Galdino
 
Aula desesenvolvimento segunda semana
Aula desesenvolvimento segunda semanaAula desesenvolvimento segunda semana
Aula desesenvolvimento segunda semanaGabriel Moura
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código LegadoCesar Romero
 
Estimativa de software usando pontos de função
Estimativa de software usando pontos de funçãoEstimativa de software usando pontos de função
Estimativa de software usando pontos de funçãoClaudio Martins
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - IntroduçãoMarco Pinheiro
 

Similaire à Programação Baseada em Regras com RTTI (20)

Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
 
Aula02
Aula02Aula02
Aula02
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Agbd aula4 sql_ddl
Agbd aula4 sql_ddlAgbd aula4 sql_ddl
Agbd aula4 sql_ddl
 
Novidades do SQL Server 2008
Novidades do SQL Server 2008Novidades do SQL Server 2008
Novidades do SQL Server 2008
 
Linguagem C - Estruturas
Linguagem C - EstruturasLinguagem C - Estruturas
Linguagem C - Estruturas
 
Clean code
Clean codeClean code
Clean code
 
Fiqueemcasa.conf
Fiqueemcasa.confFiqueemcasa.conf
Fiqueemcasa.conf
 
11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextFull Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
 
As vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoAs vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projeto
 
Projeto de Software
Projeto de SoftwareProjeto de Software
Projeto de Software
 
SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python
 
Aula desesenvolvimento segunda semana
Aula desesenvolvimento segunda semanaAula desesenvolvimento segunda semana
Aula desesenvolvimento segunda semana
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código Legado
 
Estimativa de software usando pontos de função
Estimativa de software usando pontos de funçãoEstimativa de software usando pontos de função
Estimativa de software usando pontos de função
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Aula1
Aula1Aula1
Aula1
 

Plus de Mario Guedes

O que é e como devo usar o REDIS? - 1o Mobile REST Summit
O que é e como devo usar o REDIS? - 1o Mobile REST SummitO que é e como devo usar o REDIS? - 1o Mobile REST Summit
O que é e como devo usar o REDIS? - 1o Mobile REST SummitMario Guedes
 
Fazendo barba, cabelo e bigode com REDIS
Fazendo barba, cabelo e bigode com REDISFazendo barba, cabelo e bigode com REDIS
Fazendo barba, cabelo e bigode com REDISMario Guedes
 
Integrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da EthereumIntegrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da EthereumMario Guedes
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTMario Guedes
 
Expressão Regular - Cookbook
Expressão Regular - CookbookExpressão Regular - Cookbook
Expressão Regular - CookbookMario Guedes
 
Geolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsGeolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsMario Guedes
 
Foco no app, viva o serverless!
Foco no app, viva o serverless!Foco no app, viva o serverless!
Foco no app, viva o serverless!Mario Guedes
 
Geolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsGeolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsMario Guedes
 
Escalabilidade com Redis
Escalabilidade com Redis Escalabilidade com Redis
Escalabilidade com Redis Mario Guedes
 
Escalando o backend com NGINX e Redis
Escalando o backend com NGINX e RedisEscalando o backend com NGINX e Redis
Escalando o backend com NGINX e RedisMario Guedes
 
Turbinando o seu sistema com Redis!
Turbinando o seu sistema com Redis!Turbinando o seu sistema com Redis!
Turbinando o seu sistema com Redis!Mario Guedes
 
Microsserviço, Escalabilidade e Resiliência - #comofas?
Microsserviço, Escalabilidade e Resiliência - #comofas?Microsserviço, Escalabilidade e Resiliência - #comofas?
Microsserviço, Escalabilidade e Resiliência - #comofas?Mario Guedes
 
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no DelphiTDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no DelphiMario Guedes
 
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...Mario Guedes
 
Extreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe DelphiExtreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe DelphiMario Guedes
 
Intensive Delphi 2017 - E este tal de Redis hein?
Intensive Delphi 2017 - E este tal de Redis hein?Intensive Delphi 2017 - E este tal de Redis hein?
Intensive Delphi 2017 - E este tal de Redis hein?Mario Guedes
 
BOT: Conversando com o seu sistema
BOT: Conversando com o seu sistemaBOT: Conversando com o seu sistema
BOT: Conversando com o seu sistemaMario Guedes
 
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...Mario Guedes
 
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuáriosExtreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuáriosMario Guedes
 
Arquitetura escalável e resiliente com NGINX, DataSnap, REDIS e MongoDB
Arquitetura escalável e resiliente com NGINX, DataSnap, REDIS e MongoDBArquitetura escalável e resiliente com NGINX, DataSnap, REDIS e MongoDB
Arquitetura escalável e resiliente com NGINX, DataSnap, REDIS e MongoDBMario Guedes
 

Plus de Mario Guedes (20)

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

Programação Baseada 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