SlideShare uma empresa Scribd logo
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

MySQL_MariaDB로의_전환_기술요소-202212.pptx
MySQL_MariaDB로의_전환_기술요소-202212.pptxMySQL_MariaDB로의_전환_기술요소-202212.pptx
MySQL_MariaDB로의_전환_기술요소-202212.pptx
NeoClova
 
MariaDB MaxScale monitor 매뉴얼
MariaDB MaxScale monitor 매뉴얼MariaDB MaxScale monitor 매뉴얼
MariaDB MaxScale monitor 매뉴얼
NeoClova
 
Introduction to Apache Solr
Introduction to Apache SolrIntroduction to Apache Solr
Introduction to Apache Solr
Christos Manios
 
OpenShift Container Platform 4.12 Release Notes
OpenShift Container Platform 4.12 Release NotesOpenShift Container Platform 4.12 Release Notes
OpenShift Container Platform 4.12 Release Notes
GerryJamisola1
 
Oracle statistics by example
Oracle statistics by exampleOracle statistics by example
Oracle statistics by example
Mauro Pagano
 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
Eueung Mulyana
 
AWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance Seminar
AWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance SeminarAWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance Seminar
AWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance SeminarAmazon Web Services Korea
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
NAVER D2
 
FSlogix ODFC POC Guide (version 1.3)
FSlogix ODFC POC Guide (version 1.3)FSlogix ODFC POC Guide (version 1.3)
FSlogix ODFC POC Guide (version 1.3)
Michael Baars
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptx
NeoClova
 
[GitOps] Argo CD on GKE (v0.9.2).pdf
[GitOps] Argo CD on GKE (v0.9.2).pdf[GitOps] Argo CD on GKE (v0.9.2).pdf
[GitOps] Argo CD on GKE (v0.9.2).pdf
Jo Hoon
 
Výhody a benefity nasazení Oracle Database Appliance
Výhody a benefity nasazení Oracle Database ApplianceVýhody a benefity nasazení Oracle Database Appliance
Výhody a benefity nasazení Oracle Database Appliance
MarketingArrowECS_CZ
 
Multi Stage Docker Build
Multi Stage Docker Build Multi Stage Docker Build
Multi Stage Docker Build
Prasenjit Sarkar
 
SeaweedFS introduction
SeaweedFS introductionSeaweedFS introduction
SeaweedFS introduction
chrislusf
 
Introduction To Docker
Introduction To  DockerIntroduction To  Docker
Introduction To Docker
Dr. Syed Hassan Amin
 
Overview of new features in Apache Ranger
Overview of new features in Apache RangerOverview of new features in Apache Ranger
Overview of new features in Apache Ranger
DataWorks Summit
 
Docker compose
Docker composeDocker compose
Docker compose
Felipe Ruhland
 
MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11
NeoClova
 
How To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - SlidesHow To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - Slides
Severalnines
 
Developing Microservices with Apache Camel
Developing Microservices with Apache CamelDeveloping Microservices with Apache Camel
Developing Microservices with Apache Camel
Claus Ibsen
 

Mais procurados (20)

MySQL_MariaDB로의_전환_기술요소-202212.pptx
MySQL_MariaDB로의_전환_기술요소-202212.pptxMySQL_MariaDB로의_전환_기술요소-202212.pptx
MySQL_MariaDB로의_전환_기술요소-202212.pptx
 
MariaDB MaxScale monitor 매뉴얼
MariaDB MaxScale monitor 매뉴얼MariaDB MaxScale monitor 매뉴얼
MariaDB MaxScale monitor 매뉴얼
 
Introduction to Apache Solr
Introduction to Apache SolrIntroduction to Apache Solr
Introduction to Apache Solr
 
OpenShift Container Platform 4.12 Release Notes
OpenShift Container Platform 4.12 Release NotesOpenShift Container Platform 4.12 Release Notes
OpenShift Container Platform 4.12 Release Notes
 
Oracle statistics by example
Oracle statistics by exampleOracle statistics by example
Oracle statistics by example
 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
 
AWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance Seminar
AWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance SeminarAWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance Seminar
AWS 유안타증권 HPC 적용사례 :: 유안타 증권 추정호 박사 :: AWS Finance Seminar
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
 
FSlogix ODFC POC Guide (version 1.3)
FSlogix ODFC POC Guide (version 1.3)FSlogix ODFC POC Guide (version 1.3)
FSlogix ODFC POC Guide (version 1.3)
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptx
 
[GitOps] Argo CD on GKE (v0.9.2).pdf
[GitOps] Argo CD on GKE (v0.9.2).pdf[GitOps] Argo CD on GKE (v0.9.2).pdf
[GitOps] Argo CD on GKE (v0.9.2).pdf
 
Výhody a benefity nasazení Oracle Database Appliance
Výhody a benefity nasazení Oracle Database ApplianceVýhody a benefity nasazení Oracle Database Appliance
Výhody a benefity nasazení Oracle Database Appliance
 
Multi Stage Docker Build
Multi Stage Docker Build Multi Stage Docker Build
Multi Stage Docker Build
 
SeaweedFS introduction
SeaweedFS introductionSeaweedFS introduction
SeaweedFS introduction
 
Introduction To Docker
Introduction To  DockerIntroduction To  Docker
Introduction To Docker
 
Overview of new features in Apache Ranger
Overview of new features in Apache RangerOverview of new features in Apache Ranger
Overview of new features in Apache Ranger
 
Docker compose
Docker composeDocker compose
Docker compose
 
MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11
 
How To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - SlidesHow To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - Slides
 
Developing Microservices with Apache Camel
Developing Microservices with Apache CamelDeveloping Microservices with Apache Camel
Developing Microservices with Apache Camel
 

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

Orchestrando na linha
Orchestrando na linhaOrchestrando na linha
Orchestrando na linha
matheuscmpm
 
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
DockerDocker
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
 
O que é Docker?
O que é Docker?O que é Docker?
O que é Docker?
Rodrigo Emereciano
 
Apresentacao docker
Apresentacao dockerApresentacao docker
Apresentacao docker
Mauricio Martins
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NET
José 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 Developers
Dextra Sistemas / Etec Itu
 
apostila-desenvolvimento-asp-net
 apostila-desenvolvimento-asp-net apostila-desenvolvimento-asp-net
apostila-desenvolvimento-asp-net
Sandra 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 ruby
Radamés Roriz
 
Usando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NETUsando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NET
Dextra Sistemas / Etec Itu
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
Lucas Augusto Carvalho
 
Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento web
Arlindo 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ção
Carlos Smaniotto
 
Object pascal
Object pascalObject pascal
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 Competente
Michael Cardoso
 
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGOEVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
Diogo Rocha Ferreira de Menezes
 
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
Luiz Costa
 
Introdução ao docker
Introdução ao dockerIntrodução ao docker
Introdução ao docker
Hugo Leonardo Costa e Silva
 

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 Summit
Mario 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 REDIS
Mario Guedes
 
Integrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da EthereumIntegrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da Ethereum
Mario Guedes
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
Mario Guedes
 
Expressão Regular - Cookbook
Expressão Regular - CookbookExpressão Regular - Cookbook
Expressão Regular - Cookbook
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 Maps
Mario 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 Maps
Mario 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 Redis
Mario 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 Delphi
Mario 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 Delphi
Mario 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 sistema
Mario 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ários
Mario 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”} ]