SlideShare uma empresa Scribd logo
1 de 30
Baixar para ler offline
Modularização via BPL
Abordagem prática para DataSnap & Front-end

Mário Guedes
Do que estamos falando?
• O resultado final do nosso trabalho é um grande executável: “.exe”
• Mas podemos quebrá-lo em partes menores: MÓDULOS
• A BPL - Borland Package Library, nos dá esta possibilidade.

O Delphi é um
ótimo exemplo de
aplicação modular.
Qual a diferença?
Seu
executável

BPL #1
Framework
Delphi

BPL #2

3os

Seu
Código

Você 

Um grande projeto com
dezenas de dependências

Seu
executável

Vários pequenos
projetos com poucas
dependências
Um simples “Olá Mundo”
12.000.000

Bytes
Monolítico - Debug

6.000.000
4.000.000
2.000.000

0

2.105.344
2.397.893

Modularizado - Release

91.648

Pacote - Debug

8.000.000

Monolítico - Release
Modularizado - Debug

10.000.000

9.964.191

20.567

Pacote - Release

8.192
Motivação
 Melhor divisão de responsabilidades entre a equipe.
 Melhor aderência de um novato por não precisar lidar com
algo complexo imediatamente.
 Menor escopo favorece maior domínio.
 Permite que várias pessoas trabalhem em uma mesma
solução.
 Permite a adoção de novas tecnologias sem refazer o sistema:
Exemplo: BDE  dbExpress  FireDAC  ?
 Aderência às metodologias ágeis.
E mais vantagens!
 Facilita a personalização da solução para os clientes finais
(plug-ins).
 Diminuição do tamanho dos artefatos (exe, dll e bpl).

 Facilita a atualização do aplicativo, ficando quase tão
instantâneo quanto um aplicativo web.
 Possibilidade de armazenar formulários, imagens,
resources strings para internacionalização, procedimentos,
enfim: uma biblioteca!
 Interação com tipos do Delphi: classes, records,
enumerados, string e etc.
Quem ganha com a modularidade?

Você
– Passa a focar no real problema a ser resolvido e não na tecnologia em volta.
E volta mais cedo para casa.

Sua equipe
– Ninguém fica sobrecarregado. Ninguém fica ocioso.
Temos efetivamente uma equipe.

Sua empresa
– Custa caro manter um software “vivo”.

Seu cliente
– Obtêm respostas rápidas às demandas. Com qualidade e flexibilidade.

Seu consultor
– e-mail no penúltimo slide 
Ressalvas

 Um sistema desenvolvido em Delphi XE5 só carregará BPLs compiladas
em Delphi XE5. Conforme o Delphi avança cria-se incompatibilidades de
mapeamentos de tipos com o Delphi anterior.
 Migração de Delphi exige um trabalho extra para as compatibilizações.
 A carga da aplicação fica ligeiramente mais lenta, em especial se os
módulos estiverem “longe”. Em geral é um problema irrelevante.

 Duas units com o mesmo nome não poderão ser carregadas pela
mesma aplicação. Utilize namespace para evitar ambiguidades.
 Na primeira instalação será descarregado muito mais conteúdo do que
se espera (BPLs do Delphi e de componentes de terceiros).
Redistribuição


Um problema inicial é a redistribuição das BPLs das quais o seu sistema
depende.



Cuidado com componentes de terceiros mal projetados: o correto é ter
uma BPL de “design time” e outra de “run time”, esta última será
redistribuída.



Sugere-se não colocá-las no system32, mas sim criar um diretório
específico e colocar este diretório na variável de ambiente PATH.



Os arquivos do Delphi permitidos para redistribuição estão em:
EmbarcaderoRAD Studio12.0Redist



Para gerar uma lista das dependências estáticas (BPLs e DLLs) sugere-se
o aplicativo Dependency Walker:
http://www.dependencywalker.com/
Ortogonalidade
Ortogonalidade, em sistemas, refere-se ao nível de independência que um
módulo tem em relação a outro módulo.
Quanto mais independente mais ortogonal.

Exemplo: Devemos conseguir mudar de gerenciador de banco de dados sem
afetar as telas do front-end e vice versa.

•
•
•
•

Delphi forever.
Utilize frameworks de boa reputação.
Crie seu próprio framework.
Crie as soluções finais em cima do
seu framework.

Delphi
Frameworks de terceiros
Seu framework
Solução
Imagem gentilmente cedido pela G4 Solutions

Um exemplo real
Conceitos que irão ajudar

•
•
•
•
•
•
•
•
•

OOP
Padrões de Projetos
Interfaces
RTTI e Generics
ORM
DDD
Geradores automáticos de código
OTA
Integração contínua
OOP e Padrões de Projeto

•

Um maior domínio sobre a OOP é importante para termos um real
proveito de todo o poder que o Delphi oferece.

•

Um tema que deve ser continuamente estudado é Padrões de Projeto.

•

Alguns padrões que são aderentes:
– Singleton: Instância única de uma classe.
– Factory: Classes abstratas e classes concretas.
– Façade: Fachada de facilidades.

•

A utilização de Interfaces é uma forma de abstrair as classes concretas.

•

A RTTI dá mais poder à abstração.
Aplique o MVC
• Model View Control é um padrão de projeto que propõe
separar a regra de negócio da regra de visualização.
• É de extrema importância para dar vida longa ao seu
aplicativo, pois o mundo é cada vez mais “poliglota”:
desktop, web, mobile, SQL, noSQL etc, etc e etc.
• Isole as regras de negócio:


A interface muda constantemente e coexistem por um
longo tempo:
WinXP, Aero, Ribbon, Metropolis UI, Web, Mobile e etc.



As regras de negócio são perenes.
Arquivos DPK, DCP & BPL
•

Um projeto de pacote Delphi é encabeçado por um arquivo DPK –
Delphi Package - e não por um arquivo DPR.

•

Um DCP - Delphi Compiled Package - é um mapeamento de uma BPL e
só tem serventia para a IDE do Delphi.

•

Não é o diretório da BPL que deve ir para a Library Path do Delphi, e sim
o diretório do DCP.

•

Separe as suas BPLs das do Delphi e componentes de terceiros.

•

Sugere-se criar um diretório específico para as saídas do DCP e outro
específico para a BPL.

•

O diretório de saída das BPLs podem ir para a variável de ambiente
PATH.
Configurações de um Projeto DPK
• É muito importante configurar consistentemente as
saídas dos artefatos produzidos pela compilação.
• Evite conflitos com os seus colegas usando variáveis
de ambiente.
Diretório onde será
gerado o DCP
Diretório onde
será gerado a
BPL
Diretório onde
serão gerados os
DCUs
Configurações de um Projeto DPK
Defina o aplicativo que
será utilizado para a
depuração

Cuidado! Muitas
configurações são por
plataforma

A Descrição poderá ser
recuperada posteriormente

Esta informação vai para o
nome do arquivo, facilitando
a identificação da versão.

Definir como run-time
retira código
desnecessário
Estrutura e gerenciamento de um DPK
Faça uso do
namespace

Diretivas de compilação
Nome do
DCP

Requires: Pacotes do qual este pacote depende

Contains: Unidades que pertencem a este pacote

Diretórios que
serão considerados
Adicionando dependências
• Deve-se ficar muito atento às dependências e evitar a
importação implícita.
• Em geral o Delphi detecta e sugere a adição das
dependências. Mas isso não acontece para os pacotes
que ele não conhece.
Executável fachada
•

Deve-se criar um executável preparado para lidar com as
BPLs.

•

Temos dois modos de dependência: estática e dinâmica.
Esta opção indica ao Delphi para gerar
o executável dependente das BPLs ao
invés de incluir estaticamente as
units/dcu no exe final

Aqui vai a lista de BPLs que o
executável carregará estaticamente. O
que não estiver na lista fará parte do
executável
Carga estática

• As BPLs são associadas estaticamente ao executável.
• Na prática o compilador irá escrever no cabeçalho
do executável o nome das dependências.
• O Windows, ao carregar este executável, tomará
conhecimento das dependências e carregará os
módulos acoplando ao processo.
• Isso implica que o executável não irá carregar se as
dependências não forem atendidas.
PATH
• O Windows procura os módulos estáticos nos seguintes
locais:
http://msdn.microsoft.com/pt-br/library/7d83bc18(v=vs.90).aspx

Diretório do aplicativo.
Diretório corrente.

Diretório de sistema: WindowsSystem32.
Diretório do Windows: Windows.

Diretórios listados na variável de ambiente PATH
(da esquerda para direita).

• É aqui que a BPL Hell se manifesta!
Carga dinâmica
•

A carga dinâmica lhe dá maior flexibilidade de distribuição das BPLs
podendo-se efetivamente adotar o conceito de plug-ins.

•

Mas tira a fluidez na hora de codificar, pois o Delphi não conhece a BPL
em questão e portanto não consegue oferecer os métodos,
parâmetros, tipos e etc que estão contidos na BPL.

•

O requisito mínimo é exportar um ou mais procedimentos. Perceba que
é case sensitive.

•

Sugere-se então que exporte uma função que retorne uma interface ou
objeto que consiga ser manipulado pelo executável fachada.

•

Aqui também entra o Padrão de Projeto “Factory”, pois uma BPL poderá
conter a classe abstrata e outras conterão as classes concretas. Do
ponto de vista do executável só se conhecerá a classe abstrata.
Carga dinâmica - Comandos

• Em System.SysUtils temos algumas rotinas para
lidar com as BPLs:
•

LoadPackage: Carrega a BPL.

•

UnloadPackage: Descarrega a BPL.

•

GetPackageDescription: Retorna a descrição de uma
BPL.

•

GetPackageInfo: Retorna diversas informações sobre a
BPL, como o número da versão.
Comandos para interagir com a BPL

• Para lidar com os recursos oferecidos pela BPL
podemos usar alguns comandos
(Winapi.Windows):
• GetProcAddress: Retorna o ponteiro de um
método.
• GetClass: Retorna uma referência de classe,
permitindo instanciar objetos.
Juntando tudo

EXEMPLOS PRÁTICOS
Proposta dos exemplos

• Evoluiremos o exemplo entre os seguintes cenários:
– Aplicação Win32 monolítica
– Aplicação Win32 modular
– Aplicação DataSnapREST modular

• Será utilizado um exemplo didático de “Olá Mundo”.
• Baixe os exemplos de:
https://github.com/jmarioguedes/DC2013_BPL
Links
O formato PE
Vovó Vicki
http://www.numaboa.com.br/informatica/oraculo/230-formatos/1096-formato-pe
Advanced Dynamic Packages
Vino Rodrigues
http://delphi.cz/img/packages/advanced.pdf
Modularização de Aplicações
Álvaro Esteves Alves
http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=719
BPLs no Delphi
Paulo Quicoli
http://www.devmedia.com.br/websys.5/webreader.asp?cat=3&artigo=4709&revista=clubedelphi_142#a-4709
Pacotes em Delphi (Modulos)
Rafael Ferreira
http://www.portaldaprogramacao.com/artigos2.asp?n=882
Biblioteca (Computação)
Wikipédia
http://technet.microsoft.com/en-us/sysinternals/bb842062
Muito obrigado!
{
“nome”
“e-mail”
“blog”
“perfis”

}

:
:
:
:

“Mário Guedes” ,
“mario.guedes@arrayof.com.br” ,
“http://eugostododelphi.blogspot.com.br”
[
{“twitter”
: “eugostododelphi”} ,
{“facebook”
: “eugostododelphi”} ,
{“linkedin”
: “jmarioguedes”} ,
{“slideshare” : “jmarioguedes”} ,
{“github”
: “jmarioguedes”} ,
{“prezi”
: “jmarioguedes”}
]
Canais Embarcadero

Canais Embarcadero
http://edn.embarcadero.com
http://www.embarcadero.com/br
http://www.facebook.com/DelphiBrasil
http://www.facebook.com/EmbarcaderoBrasil
http://www.embarcadero.com/mvp-directory
http://www.embarcaderobr.com.br/treinamentos/

Mais conteúdo relacionado

Mais procurados

Python twisted
Python twistedPython twisted
Python twistedMahendra M
 
context free language
context free languagecontext free language
context free languagekhush_boo31
 
C++ programming introduction
C++ programming introductionC++ programming introduction
C++ programming introductionsandeep54552
 
CPU scheduling
CPU schedulingCPU scheduling
CPU schedulingAmir Khan
 
DSpace-CRIS & OpenAIRE
DSpace-CRIS & OpenAIREDSpace-CRIS & OpenAIRE
DSpace-CRIS & OpenAIRE4Science
 
MPI Introduction
MPI IntroductionMPI Introduction
MPI IntroductionRohit Banga
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#Doncho Minkov
 
9. Input Output in java
9. Input Output in java9. Input Output in java
9. Input Output in javaNilesh Dalvi
 
OOP in C++
OOP in C++OOP in C++
OOP in C++ppd1961
 
Sqoop on Spark for Data Ingestion
Sqoop on Spark for Data IngestionSqoop on Spark for Data Ingestion
Sqoop on Spark for Data IngestionDataWorks Summit
 
iptables 101- bottom-up
iptables 101- bottom-upiptables 101- bottom-up
iptables 101- bottom-upHungWei Chiu
 
Lecture 04 syntax analysis
Lecture 04 syntax analysisLecture 04 syntax analysis
Lecture 04 syntax analysisIffat Anjum
 
Dive into Catalyst
Dive into CatalystDive into Catalyst
Dive into CatalystCheng Lian
 

Mais procurados (20)

Python twisted
Python twistedPython twisted
Python twisted
 
Regular Expressions
Regular ExpressionsRegular Expressions
Regular Expressions
 
Topdown parsing
Topdown parsingTopdown parsing
Topdown parsing
 
context free language
context free languagecontext free language
context free language
 
C++ programming introduction
C++ programming introductionC++ programming introduction
C++ programming introduction
 
rtnetlink
rtnetlinkrtnetlink
rtnetlink
 
CPU scheduling
CPU schedulingCPU scheduling
CPU scheduling
 
DSpace-CRIS & OpenAIRE
DSpace-CRIS & OpenAIREDSpace-CRIS & OpenAIRE
DSpace-CRIS & OpenAIRE
 
MPI Introduction
MPI IntroductionMPI Introduction
MPI Introduction
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
 
9. Input Output in java
9. Input Output in java9. Input Output in java
9. Input Output in java
 
OOP in C++
OOP in C++OOP in C++
OOP in C++
 
Sqoop on Spark for Data Ingestion
Sqoop on Spark for Data IngestionSqoop on Spark for Data Ingestion
Sqoop on Spark for Data Ingestion
 
ZIO Queue
ZIO QueueZIO Queue
ZIO Queue
 
iptables 101- bottom-up
iptables 101- bottom-upiptables 101- bottom-up
iptables 101- bottom-up
 
Basic perl programs
Basic perl programsBasic perl programs
Basic perl programs
 
Rds data lake @ Robinhood
Rds data lake @ Robinhood Rds data lake @ Robinhood
Rds data lake @ Robinhood
 
Python.ppt
Python.pptPython.ppt
Python.ppt
 
Lecture 04 syntax analysis
Lecture 04 syntax analysisLecture 04 syntax analysis
Lecture 04 syntax analysis
 
Dive into Catalyst
Dive into CatalystDive into Catalyst
Dive into Catalyst
 

Semelhante a Modularização via BPL - Abordagem Prática para DataSnap & Front-end

Orchestrando na linha
Orchestrando na linhaOrchestrando na linha
Orchestrando na linhamatheuscmpm
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) Grupo Treinar
 
Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.Marcel Cattaneo
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETJosé Corrêa Viana
 
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDextra Sistemas / Etec Itu
 
apostila-desenvolvimento-asp-net
 apostila-desenvolvimento-asp-net apostila-desenvolvimento-asp-net
apostila-desenvolvimento-asp-netSandra Rocha
 
Escalando o ambiente de desenvolvimento com cli em ruby
Escalando o ambiente de desenvolvimento com cli em rubyEscalando o ambiente de desenvolvimento com cli em ruby
Escalando o ambiente de desenvolvimento com cli em rubyRadamés Roriz
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento webArlindo Santos
 
Beers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoBeers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoCarlos Smaniotto
 
Usp codelabs (docker)
Usp codelabs (docker)Usp codelabs (docker)
Usp codelabs (docker)TechCobli
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
 

Semelhante a Modularização via BPL - Abordagem Prática para DataSnap & Front-end (20)

Orchestrando na linha
Orchestrando na linhaOrchestrando na linha
Orchestrando na linha
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
 
Docker
DockerDocker
Docker
 
Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.Docker: Introdução à Conteinerização de Apps e Nuvem.
Docker: Introdução à Conteinerização de Apps e Nuvem.
 
O que é Docker?
O que é Docker?O que é Docker?
O que é Docker?
 
Apresentacao docker
Apresentacao dockerApresentacao docker
Apresentacao docker
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NET
 
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
 
apostila-desenvolvimento-asp-net
 apostila-desenvolvimento-asp-net apostila-desenvolvimento-asp-net
apostila-desenvolvimento-asp-net
 
Escalando o ambiente de desenvolvimento com cli em ruby
Escalando o ambiente de desenvolvimento com cli em rubyEscalando o ambiente de desenvolvimento com cli em ruby
Escalando o ambiente de desenvolvimento com cli em ruby
 
Usando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NETUsando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NET
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento web
 
Beers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoBeers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualização
 
Object pascal
Object pascalObject pascal
Object pascal
 
Usp codelabs (docker)
Usp codelabs (docker)Usp codelabs (docker)
Usp codelabs (docker)
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGOEVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
 
Introdução ao docker
Introdução ao dockerIntrodução ao docker
Introdução ao docker
 

Mais 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
 
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
 
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
 

Mais 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
 
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!
 
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
 

Modularização via BPL - Abordagem Prática para DataSnap & Front-end

  • 1. Modularização via BPL Abordagem prática para DataSnap & Front-end Mário Guedes
  • 2. Do que estamos falando? • O resultado final do nosso trabalho é um grande executável: “.exe” • Mas podemos quebrá-lo em partes menores: MÓDULOS • A BPL - Borland Package Library, nos dá esta possibilidade. O Delphi é um ótimo exemplo de aplicação modular.
  • 3. Qual a diferença? Seu executável BPL #1 Framework Delphi BPL #2 3os Seu Código Você  Um grande projeto com dezenas de dependências Seu executável Vários pequenos projetos com poucas dependências
  • 4. Um simples “Olá Mundo” 12.000.000 Bytes Monolítico - Debug 6.000.000 4.000.000 2.000.000 0 2.105.344 2.397.893 Modularizado - Release 91.648 Pacote - Debug 8.000.000 Monolítico - Release Modularizado - Debug 10.000.000 9.964.191 20.567 Pacote - Release 8.192
  • 5. Motivação  Melhor divisão de responsabilidades entre a equipe.  Melhor aderência de um novato por não precisar lidar com algo complexo imediatamente.  Menor escopo favorece maior domínio.  Permite que várias pessoas trabalhem em uma mesma solução.  Permite a adoção de novas tecnologias sem refazer o sistema: Exemplo: BDE  dbExpress  FireDAC  ?  Aderência às metodologias ágeis.
  • 6. E mais vantagens!  Facilita a personalização da solução para os clientes finais (plug-ins).  Diminuição do tamanho dos artefatos (exe, dll e bpl).  Facilita a atualização do aplicativo, ficando quase tão instantâneo quanto um aplicativo web.  Possibilidade de armazenar formulários, imagens, resources strings para internacionalização, procedimentos, enfim: uma biblioteca!  Interação com tipos do Delphi: classes, records, enumerados, string e etc.
  • 7. Quem ganha com a modularidade? Você – Passa a focar no real problema a ser resolvido e não na tecnologia em volta. E volta mais cedo para casa. Sua equipe – Ninguém fica sobrecarregado. Ninguém fica ocioso. Temos efetivamente uma equipe. Sua empresa – Custa caro manter um software “vivo”. Seu cliente – Obtêm respostas rápidas às demandas. Com qualidade e flexibilidade. Seu consultor – e-mail no penúltimo slide 
  • 8. Ressalvas  Um sistema desenvolvido em Delphi XE5 só carregará BPLs compiladas em Delphi XE5. Conforme o Delphi avança cria-se incompatibilidades de mapeamentos de tipos com o Delphi anterior.  Migração de Delphi exige um trabalho extra para as compatibilizações.  A carga da aplicação fica ligeiramente mais lenta, em especial se os módulos estiverem “longe”. Em geral é um problema irrelevante.  Duas units com o mesmo nome não poderão ser carregadas pela mesma aplicação. Utilize namespace para evitar ambiguidades.  Na primeira instalação será descarregado muito mais conteúdo do que se espera (BPLs do Delphi e de componentes de terceiros).
  • 9. Redistribuição  Um problema inicial é a redistribuição das BPLs das quais o seu sistema depende.  Cuidado com componentes de terceiros mal projetados: o correto é ter uma BPL de “design time” e outra de “run time”, esta última será redistribuída.  Sugere-se não colocá-las no system32, mas sim criar um diretório específico e colocar este diretório na variável de ambiente PATH.  Os arquivos do Delphi permitidos para redistribuição estão em: EmbarcaderoRAD Studio12.0Redist  Para gerar uma lista das dependências estáticas (BPLs e DLLs) sugere-se o aplicativo Dependency Walker: http://www.dependencywalker.com/
  • 10. Ortogonalidade Ortogonalidade, em sistemas, refere-se ao nível de independência que um módulo tem em relação a outro módulo. Quanto mais independente mais ortogonal. Exemplo: Devemos conseguir mudar de gerenciador de banco de dados sem afetar as telas do front-end e vice versa. • • • • Delphi forever. Utilize frameworks de boa reputação. Crie seu próprio framework. Crie as soluções finais em cima do seu framework. Delphi Frameworks de terceiros Seu framework Solução
  • 11. Imagem gentilmente cedido pela G4 Solutions Um exemplo real
  • 12. Conceitos que irão ajudar • • • • • • • • • OOP Padrões de Projetos Interfaces RTTI e Generics ORM DDD Geradores automáticos de código OTA Integração contínua
  • 13. OOP e Padrões de Projeto • Um maior domínio sobre a OOP é importante para termos um real proveito de todo o poder que o Delphi oferece. • Um tema que deve ser continuamente estudado é Padrões de Projeto. • Alguns padrões que são aderentes: – Singleton: Instância única de uma classe. – Factory: Classes abstratas e classes concretas. – Façade: Fachada de facilidades. • A utilização de Interfaces é uma forma de abstrair as classes concretas. • A RTTI dá mais poder à abstração.
  • 14. Aplique o MVC • Model View Control é um padrão de projeto que propõe separar a regra de negócio da regra de visualização. • É de extrema importância para dar vida longa ao seu aplicativo, pois o mundo é cada vez mais “poliglota”: desktop, web, mobile, SQL, noSQL etc, etc e etc. • Isole as regras de negócio:  A interface muda constantemente e coexistem por um longo tempo: WinXP, Aero, Ribbon, Metropolis UI, Web, Mobile e etc.  As regras de negócio são perenes.
  • 15. Arquivos DPK, DCP & BPL • Um projeto de pacote Delphi é encabeçado por um arquivo DPK – Delphi Package - e não por um arquivo DPR. • Um DCP - Delphi Compiled Package - é um mapeamento de uma BPL e só tem serventia para a IDE do Delphi. • Não é o diretório da BPL que deve ir para a Library Path do Delphi, e sim o diretório do DCP. • Separe as suas BPLs das do Delphi e componentes de terceiros. • Sugere-se criar um diretório específico para as saídas do DCP e outro específico para a BPL. • O diretório de saída das BPLs podem ir para a variável de ambiente PATH.
  • 16. Configurações de um Projeto DPK • É muito importante configurar consistentemente as saídas dos artefatos produzidos pela compilação. • Evite conflitos com os seus colegas usando variáveis de ambiente. Diretório onde será gerado o DCP Diretório onde será gerado a BPL Diretório onde serão gerados os DCUs
  • 17. Configurações de um Projeto DPK Defina o aplicativo que será utilizado para a depuração Cuidado! Muitas configurações são por plataforma A Descrição poderá ser recuperada posteriormente Esta informação vai para o nome do arquivo, facilitando a identificação da versão. Definir como run-time retira código desnecessário
  • 18. Estrutura e gerenciamento de um DPK Faça uso do namespace Diretivas de compilação Nome do DCP Requires: Pacotes do qual este pacote depende Contains: Unidades que pertencem a este pacote Diretórios que serão considerados
  • 19. Adicionando dependências • Deve-se ficar muito atento às dependências e evitar a importação implícita. • Em geral o Delphi detecta e sugere a adição das dependências. Mas isso não acontece para os pacotes que ele não conhece.
  • 20. Executável fachada • Deve-se criar um executável preparado para lidar com as BPLs. • Temos dois modos de dependência: estática e dinâmica. Esta opção indica ao Delphi para gerar o executável dependente das BPLs ao invés de incluir estaticamente as units/dcu no exe final Aqui vai a lista de BPLs que o executável carregará estaticamente. O que não estiver na lista fará parte do executável
  • 21. Carga estática • As BPLs são associadas estaticamente ao executável. • Na prática o compilador irá escrever no cabeçalho do executável o nome das dependências. • O Windows, ao carregar este executável, tomará conhecimento das dependências e carregará os módulos acoplando ao processo. • Isso implica que o executável não irá carregar se as dependências não forem atendidas.
  • 22. PATH • O Windows procura os módulos estáticos nos seguintes locais: http://msdn.microsoft.com/pt-br/library/7d83bc18(v=vs.90).aspx Diretório do aplicativo. Diretório corrente. Diretório de sistema: WindowsSystem32. Diretório do Windows: Windows. Diretórios listados na variável de ambiente PATH (da esquerda para direita). • É aqui que a BPL Hell se manifesta!
  • 23. Carga dinâmica • A carga dinâmica lhe dá maior flexibilidade de distribuição das BPLs podendo-se efetivamente adotar o conceito de plug-ins. • Mas tira a fluidez na hora de codificar, pois o Delphi não conhece a BPL em questão e portanto não consegue oferecer os métodos, parâmetros, tipos e etc que estão contidos na BPL. • O requisito mínimo é exportar um ou mais procedimentos. Perceba que é case sensitive. • Sugere-se então que exporte uma função que retorne uma interface ou objeto que consiga ser manipulado pelo executável fachada. • Aqui também entra o Padrão de Projeto “Factory”, pois uma BPL poderá conter a classe abstrata e outras conterão as classes concretas. Do ponto de vista do executável só se conhecerá a classe abstrata.
  • 24. Carga dinâmica - Comandos • Em System.SysUtils temos algumas rotinas para lidar com as BPLs: • LoadPackage: Carrega a BPL. • UnloadPackage: Descarrega a BPL. • GetPackageDescription: Retorna a descrição de uma BPL. • GetPackageInfo: Retorna diversas informações sobre a BPL, como o número da versão.
  • 25. Comandos para interagir com a BPL • Para lidar com os recursos oferecidos pela BPL podemos usar alguns comandos (Winapi.Windows): • GetProcAddress: Retorna o ponteiro de um método. • GetClass: Retorna uma referência de classe, permitindo instanciar objetos.
  • 27. Proposta dos exemplos • Evoluiremos o exemplo entre os seguintes cenários: – Aplicação Win32 monolítica – Aplicação Win32 modular – Aplicação DataSnapREST modular • Será utilizado um exemplo didático de “Olá Mundo”. • Baixe os exemplos de: https://github.com/jmarioguedes/DC2013_BPL
  • 28. Links O formato PE Vovó Vicki http://www.numaboa.com.br/informatica/oraculo/230-formatos/1096-formato-pe Advanced Dynamic Packages Vino Rodrigues http://delphi.cz/img/packages/advanced.pdf Modularização de Aplicações Álvaro Esteves Alves http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=719 BPLs no Delphi Paulo Quicoli http://www.devmedia.com.br/websys.5/webreader.asp?cat=3&artigo=4709&revista=clubedelphi_142#a-4709 Pacotes em Delphi (Modulos) Rafael Ferreira http://www.portaldaprogramacao.com/artigos2.asp?n=882 Biblioteca (Computação) Wikipédia http://technet.microsoft.com/en-us/sysinternals/bb842062
  • 29. Muito obrigado! { “nome” “e-mail” “blog” “perfis” } : : : : “Mário Guedes” , “mario.guedes@arrayof.com.br” , “http://eugostododelphi.blogspot.com.br” [ {“twitter” : “eugostododelphi”} , {“facebook” : “eugostododelphi”} , {“linkedin” : “jmarioguedes”} , {“slideshare” : “jmarioguedes”} , {“github” : “jmarioguedes”} , {“prezi” : “jmarioguedes”} ]