Você está na página 1de 30

Mrio Guedes

Modularizao via BPL


Abordagem prtica para DataSnap & Front-end

Do que estamos falando?
O resultado final do nosso trabalho um grande executvel: .exe

Mas podemos quebr-lo em partes menores: MDULOS

A BPL - Borland Package Library, nos d esta possibilidade.
O Delphi um
timo exemplo de
aplicao modular.

Qual a diferena?
Um grande projeto com
dezenas de dependncias
Vrios pequenos
projetos com poucas
dependncias

Voc
Seu
executvel
BPL #1
BPL #2
Seu
executvel
Framework
Delphi
3os
Seu
Cdigo
Um simples Ol Mundo
0
2.000.000
4.000.000
6.000.000
8.000.000
10.000.000
12.000.000
Bytes
Monoltico - Debug 9.964.191
Monoltico - Release 2.105.344
Modularizado - Debug 2.397.893
Modularizado - Release 91.648
Pacote - Debug 20.567
Pacote - Release 8.192
Motivao
Melhor diviso de responsabilidades entre a equipe.

Melhor aderncia de um novato por no precisar lidar com
algo complexo imediatamente.

Menor escopo favorece maior domnio.

Permite que vrias pessoas trabalhem em uma mesma
soluo.

Permite a adoo de novas tecnologias sem refazer o sistema:
Exemplo: BDE dbExpress FireDAC ?

Aderncia s metodologias geis.


E mais vantagens!
Facilita a personalizao da soluo para os clientes finais
(plug-ins).

Diminuio do tamanho dos artefatos (exe, dll e bpl).

Facilita a atualizao do aplicativo, ficando quase to
instantneo quanto um aplicativo web.

Possibilidade de armazenar formulrios, imagens,
resources strings para internacionalizao, procedimentos,
enfim: uma biblioteca!

Interao 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 no na tecnologia em volta.
E volta mais cedo para casa.

Sua equipe
Ningum fica sobrecarregado. Ningum fica ocioso.
Temos efetivamente uma equipe.

Sua empresa
Custa caro manter um software vivo.

Seu cliente
Obtm respostas rpidas s demandas. Com qualidade e flexibilidade.

Seu consultor
e-mail no penltimo slide
Ressalvas
Um sistema desenvolvido em Delphi XE5 s carregar BPLs compiladas
em Delphi XE5. Conforme o Delphi avana cria-se incompatibilidades de
mapeamentos de tipos com o Delphi anterior.

Migrao de Delphi exige um trabalho extra para as compatibilizaes.

A carga da aplicao fica ligeiramente mais lenta, em especial se os
mdulos estiverem longe. Em geral um problema irrelevante.

Duas units com o mesmo nome no podero ser carregadas pela
mesma aplicao. Utilize namespace para evitar ambiguidades.

Na primeira instalao ser descarregado muito mais contedo do que
se espera (BPLs do Delphi e de componentes de terceiros).

Redistribuio
Um problema inicial a redistribuio 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
redistribuda.

Sugere-se no coloc-las no system32, mas sim criar um diretrio
especfico e colocar este diretrio na varivel de ambiente PATH.

Os arquivos do Delphi permitidos para redistribuio esto em:
\Embarcadero\RAD Studio\12.0\Redist

Para gerar uma lista das dependncias estticas (BPLs e DLLs) sugere-se
o aplicativo Dependency Walker:

http://www.dependencywalker.com/
Ortogonalidade
Delphi forever.
Utilize frameworks de boa reputao.
Crie seu prprio framework.
Crie as solues finais em cima do
seu framework.

Delphi
Frameworks de terceiros
Seu framework
Soluo
Ortogonalidade, em sistemas, refere-se ao nvel de independncia que um
mdulo tem em relao a outro mdulo.

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.

Um exemplo real
I
m
a
g
e
m

g
e
n
t
i
l
m
e
n
t
e

c
e
d
i
d
o

p
e
l
a

G
4

S
o
l
u
t
i
o
n
s

Conceitos que iro ajudar
OOP
Padres de Projetos
Interfaces
RTTI e Generics
ORM
DDD
Geradores automticos de cdigo
OTA
Integrao contnua
OOP e Padres de Projeto
Um maior domnio sobre a OOP importante para termos um real
proveito de todo o poder que o Delphi oferece.

Um tema que deve ser continuamente estudado Padres de Projeto.

Alguns padres que so aderentes:
Singleton: Instncia nica de uma classe.
Factory: Classes abstratas e classes concretas.
Faade: Fachada de facilidades.

A utilizao de Interfaces uma forma de abstrair as classes concretas.

A RTTI d mais poder abstrao.

Aplique o MVC
Model View Control um padro de projeto que prope
separar a regra de negcio da regra de visualizao.

de extrema importncia 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 negcio:

A interface muda constantemente e coexistem por um
longo tempo:

WinXP, Aero, Ribbon, Metropolis UI, Web, Mobile e etc.

As regras de negcio so perenes.
Arquivos DPK, DCP & BPL
Um projeto de pacote Delphi encabeado por um arquivo DPK
Delphi Package - e no por um arquivo DPR.

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

No o diretrio da BPL que deve ir para a Library Path do Delphi, e sim
o diretrio do DCP.

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

Sugere-se criar um diretrio especfico para as sadas do DCP e outro
especfico para a BPL.

O diretrio de sada das BPLs podem ir para a varivel de ambiente
PATH.
Configuraes de um Projeto DPK
Diretrio onde ser
gerado o DCP
Diretrio onde
ser gerado a
BPL
Diretrio onde
sero gerados os
DCUs
muito importante configurar consistentemente as
sadas dos artefatos produzidos pela compilao.

Evite conflitos com os seus colegas usando variveis
de ambiente.
Configuraes de um Projeto DPK
Cuidado! Muitas
configuraes so por
plataforma
Defina o aplicativo que
ser utilizado para a
depurao
Esta informao vai para o
nome do arquivo, facilitando
a identificao da verso.
A Descrio poder ser
recuperada posteriormente
Definir como run-time
retira cdigo
desnecessrio
Estrutura e gerenciamento de um DPK
Diretivas de compilao
Requires: Pacotes do qual este pacote depende
Contains: Unidades que pertencem a este pacote
Faa uso do
namespace
Nome do
DCP
Diretrios que
sero considerados
Adicionando dependncias
Deve-se ficar muito atento s dependncias e evitar a
importao implcita.

Em geral o Delphi detecta e sugere a adio das
dependncias. Mas isso no acontece para os pacotes
que ele no conhece.
Executvel fachada
Deve-se criar um executvel preparado para lidar com as
BPLs.

Temos dois modos de dependncia: esttica e dinmica.


Esta opo indica ao Delphi para gerar
o executvel dependente das BPLs ao
invs de incluir estaticamente as
units/dcu no exe final
Aqui vai a lista de BPLs que o
executvel carregar estaticamente. O
que no estiver na lista far parte do
executvel
Carga esttica
As BPLs so associadas estaticamente ao executvel.

Na prtica o compilador ir escrever no cabealho
do executvel o nome das dependncias.

O Windows, ao carregar este executvel, tomar
conhecimento das dependncias e carregar os
mdulos acoplando ao processo.

Isso implica que o executvel no ir carregar se as
dependncias no forem atendidas.
PATH
O Windows procura os mdulos estticos nos seguintes
locais:
http://msdn.microsoft.com/pt-br/library/7d83bc18(v=vs.90).aspx

Diretrio do aplicativo.

Diretrio corrente.

Diretrio de sistema: \Windows\System32.

Diretrio do Windows: \Windows.

Diretrios listados na varivel de ambiente PATH
(da esquerda para direita).

aqui que a BPL Hell se manifesta!


Carga dinmica
A carga dinmica lhe d maior flexibilidade de distribuio das BPLs
podendo-se efetivamente adotar o conceito de plug-ins.

Mas tira a fluidez na hora de codificar, pois o Delphi no conhece a BPL
em questo e portanto no consegue oferecer os mtodos,
parmetros, tipos e etc que esto contidos na BPL.

O requisito mnimo exportar um ou mais procedimentos. Perceba que
case sensitive.

Sugere-se ento que exporte uma funo que retorne uma interface ou
objeto que consiga ser manipulado pelo executvel fachada.

Aqui tambm entra o Padro de Projeto Factory, pois uma BPL poder
conter a classe abstrata e outras contero as classes concretas. Do
ponto de vista do executvel s se conhecer a classe abstrata.

Carga dinmica - Comandos
Em System.SysUtils temos algumas rotinas para
lidar com as BPLs:

LoadPackage: Carrega a BPL.

UnloadPackage: Descarrega a BPL.

GetPackageDescription: Retorna a descrio de uma
BPL.

GetPackageInfo: Retorna diversas informaes sobre a
BPL, como o nmero da verso.

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
mtodo.

GetClass: Retorna uma referncia de classe,
permitindo instanciar objetos.
EXEMPLOS PRTICOS
Juntando tudo
Proposta dos exemplos
Evoluiremos o exemplo entre os seguintes cenrios:
Aplicao Win32 monoltica
Aplicao Win32 modular
Aplicao DataSnap\REST modular

Ser utilizado um exemplo didtico 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

Modularizao de Aplicaes
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 (Computao)
Wikipdia
http://technet.microsoft.com/en-us/sysinternals/bb842062



Muito obrigado!
{
nome : Mrio Guedes ,
e-mail : mario.guedes@arrayof.com.br ,
blog : http://eugostododelphi.blogspot.com.br
perfis : [
{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/