SlideShare a Scribd company logo
1 of 105
Download to read offline
Hexagonal Rails
Luiz Costa
gutomcosta@gmail.com
@gutomcosta
nosso propósito é criar as melhores
experiências em serviços médicos
hexágonos?
ou ports and adapters
mas antes, layers…
ou simplesmente camadas
Components within the layered
architecture pattern are organized
into horizontal layers, each layer
performing a specific role within the
application (e.g., presentation logic or
business logic).
Software Architecture Patterns, Mark Richards
https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/
Na versão mais “restrita” deste
pattern, as camadas
superiores só acessam as
inferiores passando pela
camada seguinte.
Existem algumas variações,
por exemplo, quando algumas
camadas podem acessar
diretamente outras camadas
sem passar pela seguinte.
Neste caso diz-se que existem
camadas “abertas”.
hexágonos?
ou ports and adapters
Business
Business
entry / exit
points
Business
entry exit
Business
entry exit
cada lado pode ter
vários entry / exit points
Business
entry exit
… …
hexágonos
finalmente!
Hexagonal Architecture, Alistair Cockburn
https://bit.ly/2XBQHNx
Allow an application to equally be driven
by users, programs, automated test or
batch scripts, and to be developed and
tested in isolation from its eventual run-
time devices and databases.
outside
ao invés de entry/exit points, agora inside/outside
ports and adapters
Each face of the hexagon (port)
represents some "reason" the application
is trying to talk with the outside world.
Events arrive from the outside world at a
port. The adapter converts it into a
usable procedure call or message and
passes it to the application. The
application is blissfully ignorant of the
nature of the input device…
Ports and Adapters Architecture, Alistair Cockburn
http://wiki.c2.com/?
PortsAndAdaptersArchitecture
Ports and Adapters Architecture, Alistair Cockburn
http://wiki.c2.com/?
PortsAndAdaptersArchitecture
Each face of the hexagon (port)
represents some "reason" the application
is trying to talk with the outside world.
Events arrive from the outside world at a
port. The adapter converts it into a
usable procedure call or message and
passes it to the application. The
application is blissfully ignorant of the
nature of the input device…
O adaptador converte a
mensagem e manipula ou
delega para os objetos de
domínio
uma aplicação pode ter
várias portas e isso não
se limita ao número de
lados do hexágono
algumas vantagens
• diminuir acoplamento
• melhor para testar
• adaptabilidade
clean architecture
sobre o quê?
sobre o quê?
como uma rails app se
parece?
sobre o quê?
Screaming Architecture, Robert Martin
https://blog.cleancoder.com/uncle-bob/2011/09/30Screaming-Architecture.html
Architectures are not (or should not) be
about frameworks. Architectures should
not be supplied by frameworks.
Frameworks are tools to be used, not
architectures to be conformed to. If you
architecture is based on frameworks,
then it cannot be based on your use
cases.
Screaming Architecture, Robert Martin
https://blog.cleancoder.com/uncle-bob/2011/09/30Screaming-Architecture.html
Architectures are not (or should not) be
about frameworks. Architectures should
not be supplied by frameworks.
Frameworks are tools to be used, not
architectures to be conformed to. If you
architecture is based on frameworks,
then it cannot be based on your use
cases.
sobre o quê?
Your architectures should tell readers
about the system, not about the
frameworks you used in your system.
If you are building a health-care
system, then when new programmers
look at the source repository, their first
impression should be: “Oh, this is a
health-care system”.
Screaming Architecture, Robert Martin
https://blog.cleancoder.com/uncle-bob/2011/09/30Screaming-Architecture.html
architecture is
about intent.
Architecture the lost years, Robert Martin
https://youtu.be/WpkDN78P884?t=704
rails is not your
application
http://blog.firsthand.ca/2011/10/rails-is-not-your-application.html
it’s a web framework
the web is a
delivery
mechanism
Architecture the lost years, Robert Martin
https://youtu.be/WpkDN78P884?t=581
como implementar
com rails?
separar o código de
negócio do framework
1
O código de negócio fica dentro da
pasta application. Dentro da pasta,
todo acesso ao framework é feito por
adaptadores.
O código da aplicação web, escrita em rails, fica dentro de web
app. Esta pasta é a implementação de um delivery mechanism.
O código de negócio, que vive dentro de application, é
acessado através de portas.
modularizar o código que
vive dentro de application
2
alguns dos possíveis módulos de uma aplicação que
resolve o problema de vacinação domiciliar
o mesmo objeto de
domínio em diferentes
contextos ou módulos
Paciente
Atendimento
+ qual nome, nascimento…?
+ qual dia do agendamento?
+ qual endereço de atendimento?
Paciente
Vacinação
+ como a caderneta de vacinação
está organizada?
+ qual a próxima vacina?
+ qual vacina foi aplicada?
Paciente
Financeiro
+ qual custo das vacinas aplicadas?
+ alguma condição de desconto?
+ qual meio de pagamento utilizado?
É responsabilidade de cada
contexto modelar os dados da
melhor maneira, de acordo com
as suas responsabilidades.
cada módulo é como se
fosse uma implementação
do padrão hexagonal
anatomia de um módulo
Application Domain
Atendimento.Fila
Infrastructure
show me the code!
talk is cheap
como é a
implementação de um
use case?
implementação de um use case
O fluxo de execução
é simples e limpo
As dependências são
injetadas no
construtor
Usa um factory
method* para manter
o encapsulamento e
diminuir o acoplamento
com o objeto cliente
* https://en.wikipedia.org/wiki/Factory_method_pattern
application/src
como o delivery
mechanism se conecta
com a application?
conectando a web app com o application
Aqui o factory method é
usado para instanciar o use
case.
A interface pública do use case é usada como
Port para acessar o código da application
* https://en.wikipedia.org/wiki/Factory_method_pattern
web-app/app/controllers
foco total no
domain model
domain model != model
objetos de domínio são escritos em código ruby puro
(PORO*)
Não existe nenhuma
relação direta com o
Active Record
*http://blog.jayfields.com/2007/10/ruby-poro.html
e os models? Active
Record?
Nas implementações padrão do rails,
o model é uma subclasse de
ApplicationRecord, isso faz com que
o acoplamento com o banco de dados
seja bem alto.
O domain object é separado do
Model e o seu ciclo de vida é
controlado por um Repositório*.
O repositório é responsável por
executar as consultas (queries),
e mapear os objetos de domínio.
Para isso pode ter a
colaboração de uma Factory*.
O Model tem a responsabilidade de
garantir a consistência dos dados,
de acordo com o modelo relacional.
Pode definir algumas queries e ter
validações de dados
O domain object é quem tem a
implementação das lógicas de
negócio.
*https://martinfowler.com/eaaCatalog/repository.html
Um único Model pode dar origem a um modelo de domínio bem mais
complexo. Neste caso, todos os dados do domain model são persistidos
na mesma tabela (Rails Model) do banco de dados.
implementação de um repositório
Aqui o model é usado para tirar
vantagem do Active Record.
Uma factory é usada para fazer
a construção do objeto de
domínio.
.active_nurses é uma query que
está encapsulada no Model.
O save também delega
para o Active Record.
onde estamos mesmo?
e a história dos hexágonos?
a partir da representação original…
para uma proposta de implementação
O controlador acessa os módulos através de uma porta que
expõe a interface pública de um caso de uso.
O repositório encapsula o acesso
aos models, funcionando como
mais um adaptador.
A implementação do caso de
uso atua como um adaptador.
para uma proposta de implementação
inside outside
outside
O controlador acessa os módulos através de uma porta que
expõe a interface pública de um caso de uso.
O repositório encapsula o acesso
aos models, funcionando como
mais um adaptador.
A implementação do caso de
uso atua como um adaptador.
implementando uma
User Story
Deve permitir ao paciente
agendar a aplicação de
vacina.
Ao fazer o agendamento
deve-se efetuar o
pagamento e reservar o
estoque dos produtos
agendados.
Deve permitir ao paciente
agendar a aplicação de
vacina.
Ao fazer o agendamento
deve-se efetuar o
pagamento e reservar o
estoque dos produtos
agendados.
módulos
módulos bounded contexts
como um contexto
executa uma ação em
outro contexto?
boundaries
https://martinfowler.com/bliki/ApplicationBoundary.html
O ideal é que um contexto
só exponha objetos de
fronteira. Ex: Use Cases,
Services ou Repositories
Se precisar retornar um conjunto de
dados mais complexo, dê
preferência para Hashs ou Tuplas
Mantenha o domain model
protegido dentro do
contexto. O ideal é não
deixar “vazar" do contexto
os objetos de domínio
public class
deve-se reduzir o número de classes públicas para
promover o encapsulamento
exemplo
context maps
Open Host Service
(OHS)
Anti Corruption
Layer (ACL)
Event Publisher
(EP)
1
Gestão de Agendas
Pagamentos
Neste caso os contextos se
falam através dos objetos de
fronteira: Services e Use Case
construa uma
arquitetura que te
permita atrasar as
decisões
https://8thlight.com/blog/uncle-bob/2011/11/22/Clean-Architecture.html
Indireção para o contexto de
pagamento
Injeção de Dependências
Único ponto de contato com
contexto de pagamento
efetuar agendamento
Tradução do modelo entre os dois contextos
efetuar agendamento
2
Gestão de agendas
Gestão de estoque
Os dois contextos se falam
através de um domain event
AgendamentoCriado
Publica o
evento através
da EP
Contato com o
contexto de
gestão de
estoque
como tirar vantagem e
extrair para um
microsserviço?
contexto de pagamento como microsserviço
O único ponto de contato com o contexto de
pagamento no agendamento era o objeto de fronteira
Pagamento. Este objeto vai precisar ser alterado e,
em vez de chamar o contexto diretamente, vamos
introduzir uma service layer para implementar a
chamada remota ao microsserviço de pagamento
O contexto de pagamento foi extraído e
adicionado em uma nova aplicação rails. Foi
necessário expor uma api para disponibilizar
o acesso aos casos de uso. Neste caso,
provavelmente os respositórios deverão ser
alterados para conectar no banco de dados
diferente.
contexto de pagamento como microsserviço
O único ponto de contato com o contexto de
pagamento no agendamento era o objeto de fronteira
Pagamento. Este objeto vai precisar ser alterado e,
em vez de chamar o contexto diretamente, vamos
introduzir uma service layer para implementar a
chamada remota ao microsserviço de pagamento
O contexto de pagamento foi extraído e
adicionado em uma nova aplicação rails. Foi
necessário expor uma api para disponibilizar
o acesso aos casos de uso. Neste caso,
provavelmente os respositórios deverão ser
alterados para conectar no banco de dados
diferente.
como extrair o contexto de
Gestão de Estoque?
Como lidar com o Domain Event AgendamentoCriado?
publish/subscribe ou
observers
https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
https://en.wikipedia.org/wiki/Observer_pattern
contexto de estoque como microsserviço
O contexto de agendamento continua publicando o domain event
AgendamentoCriado da mesma forma que antes, nada muda aqui.
O Event Handler original é substituído por
outro que publica o evento em um Broker de
mensagem. Ex: RabbitMQ, Kafka, ActveMQ
No microsserviço de estoque, é necessário adicionar
na ACL, handlers que serão estimulados pelas
mensagens entregues pelo broker. Estes handlers,
delegam a execução para os caso de uso.
O contexto de agendamento continua publicando o domain event
AgendamentoCriado da mesma forma que antes, nada muda aqui.
O Event Handler original é substituído por
outro que publica o evento em um Broker de
mensagem. Ex: RabbitMQ, Kafka, ActveMQ
No microsserviço de estoque, é necessário adicionar
na ACL, handlers que serão estimulados pelas
mensagens entregues pelo broker. Estes handlers,
delegam a execução para os caso de uso.
contexto de estoque como microsserviço
considerações Finais
modelagem de domínio
não é simples
O controle de
acoplamento é
extremamente importante
mas lembre-se:
https://martinfowler.com/articles/dont-start-monolith.html
obrigado!
Luiz Costa
gutomcosta@gmail.com
@gutomcosta
Referências
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
https://blog.cleancoder.com/uncle-bob/2011/09/30/Screaming-Architecture.html
http://blog.firsthand.ca/2011/10/rails-is-not-your-application.html
https://cleancoders.com/video-details/clean-code-episode-7
https://www.youtube.com/watch?v=WpkDN78P884

More Related Content

What's hot

Introduction to the Web API
Introduction to the Web APIIntroduction to the Web API
Introduction to the Web APIBrad Genereaux
 
Introduction to SOLID Principles
Introduction to SOLID PrinciplesIntroduction to SOLID Principles
Introduction to SOLID PrinciplesGanesh Samarthyam
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developersPatrick Savalle
 
REST API Design & Development
REST API Design & DevelopmentREST API Design & Development
REST API Design & DevelopmentAshok Pundit
 
CQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureCQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureThomas Jaskula
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootMikalai Alimenkou
 
Hexagonal Architecture.pdf
Hexagonal Architecture.pdfHexagonal Architecture.pdf
Hexagonal Architecture.pdfVladimirRadzivil
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHPElton Minetto
 
Hexagonal architecture message-oriented software design
Hexagonal architecture   message-oriented software designHexagonal architecture   message-oriented software design
Hexagonal architecture message-oriented software designMatthias Noback
 
Escalabilidade e Disponibilidade em Arquiteturas Web
Escalabilidade e Disponibilidade em Arquiteturas WebEscalabilidade e Disponibilidade em Arquiteturas Web
Escalabilidade e Disponibilidade em Arquiteturas WebRenato Lucindo
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Alan Christensen
 
Solid principles
Solid principlesSolid principles
Solid principlesToan Nguyen
 
Observables in Angular
Observables in AngularObservables in Angular
Observables in AngularKnoldus Inc.
 

What's hot (20)

Introduction to the Web API
Introduction to the Web APIIntroduction to the Web API
Introduction to the Web API
 
Introduction to SOLID Principles
Introduction to SOLID PrinciplesIntroduction to SOLID Principles
Introduction to SOLID Principles
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developers
 
REST API Design & Development
REST API Design & DevelopmentREST API Design & Development
REST API Design & Development
 
CQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureCQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architecture
 
Architecture: Microservices
Architecture: MicroservicesArchitecture: Microservices
Architecture: Microservices
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring Boot
 
Api Gateway
Api GatewayApi Gateway
Api Gateway
 
Hexagonal Architecture.pdf
Hexagonal Architecture.pdfHexagonal Architecture.pdf
Hexagonal Architecture.pdf
 
API for Beginners
API for BeginnersAPI for Beginners
API for Beginners
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
 
Hexagonal architecture message-oriented software design
Hexagonal architecture   message-oriented software designHexagonal architecture   message-oriented software design
Hexagonal architecture message-oriented software design
 
Escalabilidade e Disponibilidade em Arquiteturas Web
Escalabilidade e Disponibilidade em Arquiteturas WebEscalabilidade e Disponibilidade em Arquiteturas Web
Escalabilidade e Disponibilidade em Arquiteturas Web
 
Soap vs rest
Soap vs restSoap vs rest
Soap vs rest
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
SOLID principles
SOLID principlesSOLID principles
SOLID principles
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Observables in Angular
Observables in AngularObservables in Angular
Observables in Angular
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Interfaces e polimorfismo
Interfaces e polimorfismoInterfaces e polimorfismo
Interfaces e polimorfismo
 

Similar to Hexagonal Rails

TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...
TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...
TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...tdc-globalcode
 
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azuretdc-globalcode
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Eric Gallardo
 
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de MicroservicesDeep Tech Brasil
 
O desafio de sustentar centenas de servicos
O desafio de sustentar centenas de servicosO desafio de sustentar centenas de servicos
O desafio de sustentar centenas de servicosGraziella Bonizi
 
Transformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualizaçãoTransformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualizaçãoDarlan Segalin
 
10 Dicas para Implementacao do OracleAS
10 Dicas para Implementacao do OracleAS10 Dicas para Implementacao do OracleAS
10 Dicas para Implementacao do OracleASacsvianabr
 
Desenvolvimento Client-Side 2016
Desenvolvimento Client-Side 2016Desenvolvimento Client-Side 2016
Desenvolvimento Client-Side 2016Huge
 
Testes webservice tdc
Testes webservice tdcTestes webservice tdc
Testes webservice tdcRicardo Moura
 
Escalabilidade via Software no ExpressoV3
Escalabilidade via Software no ExpressoV3Escalabilidade via Software no ExpressoV3
Escalabilidade via Software no ExpressoV3Flávio Lisboa
 
Arquitetura de Microserviços
Arquitetura de MicroserviçosArquitetura de Microserviços
Arquitetura de MicroserviçosNorberto Enomoto
 
ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)Flávio Lisboa
 
SoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testingSoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testingRicardo Moura
 

Similar to Hexagonal Rails (20)

TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...
TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...
TDC2018SP | Trilha Microservices - Modular Monoliths - Como e possivel organi...
 
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
 
Oficina cake php
Oficina cake phpOficina cake php
Oficina cake php
 
Framework struts2v2.5
Framework struts2v2.5Framework struts2v2.5
Framework struts2v2.5
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 
Aula1
Aula1Aula1
Aula1
 
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
 
O desafio de sustentar centenas de servicos
O desafio de sustentar centenas de servicosO desafio de sustentar centenas de servicos
O desafio de sustentar centenas de servicos
 
Transformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualizaçãoTransformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualização
 
10 Dicas para Implementacao do OracleAS
10 Dicas para Implementacao do OracleAS10 Dicas para Implementacao do OracleAS
10 Dicas para Implementacao do OracleAS
 
Architecture performance using micro services
Architecture performance using micro servicesArchitecture performance using micro services
Architecture performance using micro services
 
Arquitetura de sistemas web
Arquitetura de sistemas webArquitetura de sistemas web
Arquitetura de sistemas web
 
Desenvolvimento Client-Side 2016
Desenvolvimento Client-Side 2016Desenvolvimento Client-Side 2016
Desenvolvimento Client-Side 2016
 
Testes webservice tdc
Testes webservice tdcTestes webservice tdc
Testes webservice tdc
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Escalabilidade via Software no ExpressoV3
Escalabilidade via Software no ExpressoV3Escalabilidade via Software no ExpressoV3
Escalabilidade via Software no ExpressoV3
 
Arquitetura de Microserviços
Arquitetura de MicroserviçosArquitetura de Microserviços
Arquitetura de Microserviços
 
ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)ExpressoBR para Um Milhão (de Usuários)
ExpressoBR para Um Milhão (de Usuários)
 
SoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testingSoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testing
 

Hexagonal Rails

  • 2. nosso propósito é criar as melhores experiências em serviços médicos
  • 4. mas antes, layers… ou simplesmente camadas
  • 5. Components within the layered architecture pattern are organized into horizontal layers, each layer performing a specific role within the application (e.g., presentation logic or business logic). Software Architecture Patterns, Mark Richards https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/
  • 6. Na versão mais “restrita” deste pattern, as camadas superiores só acessam as inferiores passando pela camada seguinte.
  • 7. Existem algumas variações, por exemplo, quando algumas camadas podem acessar diretamente outras camadas sem passar pela seguinte. Neste caso diz-se que existem camadas “abertas”.
  • 9.
  • 10.
  • 16. cada lado pode ter vários entry / exit points
  • 19.
  • 20. Hexagonal Architecture, Alistair Cockburn https://bit.ly/2XBQHNx Allow an application to equally be driven by users, programs, automated test or batch scripts, and to be developed and tested in isolation from its eventual run- time devices and databases.
  • 21. outside ao invés de entry/exit points, agora inside/outside
  • 23. Each face of the hexagon (port) represents some "reason" the application is trying to talk with the outside world. Events arrive from the outside world at a port. The adapter converts it into a usable procedure call or message and passes it to the application. The application is blissfully ignorant of the nature of the input device… Ports and Adapters Architecture, Alistair Cockburn http://wiki.c2.com/? PortsAndAdaptersArchitecture
  • 24. Ports and Adapters Architecture, Alistair Cockburn http://wiki.c2.com/? PortsAndAdaptersArchitecture Each face of the hexagon (port) represents some "reason" the application is trying to talk with the outside world. Events arrive from the outside world at a port. The adapter converts it into a usable procedure call or message and passes it to the application. The application is blissfully ignorant of the nature of the input device…
  • 25. O adaptador converte a mensagem e manipula ou delega para os objetos de domínio uma aplicação pode ter várias portas e isso não se limita ao número de lados do hexágono
  • 27. • diminuir acoplamento • melhor para testar • adaptabilidade
  • 29.
  • 30.
  • 33. como uma rails app se parece?
  • 35. Screaming Architecture, Robert Martin https://blog.cleancoder.com/uncle-bob/2011/09/30Screaming-Architecture.html Architectures are not (or should not) be about frameworks. Architectures should not be supplied by frameworks. Frameworks are tools to be used, not architectures to be conformed to. If you architecture is based on frameworks, then it cannot be based on your use cases.
  • 36. Screaming Architecture, Robert Martin https://blog.cleancoder.com/uncle-bob/2011/09/30Screaming-Architecture.html Architectures are not (or should not) be about frameworks. Architectures should not be supplied by frameworks. Frameworks are tools to be used, not architectures to be conformed to. If you architecture is based on frameworks, then it cannot be based on your use cases.
  • 38. Your architectures should tell readers about the system, not about the frameworks you used in your system. If you are building a health-care system, then when new programmers look at the source repository, their first impression should be: “Oh, this is a health-care system”. Screaming Architecture, Robert Martin https://blog.cleancoder.com/uncle-bob/2011/09/30Screaming-Architecture.html
  • 39. architecture is about intent. Architecture the lost years, Robert Martin https://youtu.be/WpkDN78P884?t=704
  • 40. rails is not your application http://blog.firsthand.ca/2011/10/rails-is-not-your-application.html it’s a web framework
  • 41. the web is a delivery mechanism Architecture the lost years, Robert Martin https://youtu.be/WpkDN78P884?t=581
  • 42.
  • 43.
  • 44.
  • 46. separar o código de negócio do framework 1
  • 47. O código de negócio fica dentro da pasta application. Dentro da pasta, todo acesso ao framework é feito por adaptadores.
  • 48. O código da aplicação web, escrita em rails, fica dentro de web app. Esta pasta é a implementação de um delivery mechanism. O código de negócio, que vive dentro de application, é acessado através de portas.
  • 49. modularizar o código que vive dentro de application 2
  • 50. alguns dos possíveis módulos de uma aplicação que resolve o problema de vacinação domiciliar
  • 51. o mesmo objeto de domínio em diferentes contextos ou módulos
  • 52. Paciente Atendimento + qual nome, nascimento…? + qual dia do agendamento? + qual endereço de atendimento? Paciente Vacinação + como a caderneta de vacinação está organizada? + qual a próxima vacina? + qual vacina foi aplicada? Paciente Financeiro + qual custo das vacinas aplicadas? + alguma condição de desconto? + qual meio de pagamento utilizado? É responsabilidade de cada contexto modelar os dados da melhor maneira, de acordo com as suas responsabilidades.
  • 53. cada módulo é como se fosse uma implementação do padrão hexagonal
  • 54. anatomia de um módulo
  • 56. show me the code! talk is cheap
  • 57. como é a implementação de um use case?
  • 58. implementação de um use case O fluxo de execução é simples e limpo As dependências são injetadas no construtor Usa um factory method* para manter o encapsulamento e diminuir o acoplamento com o objeto cliente * https://en.wikipedia.org/wiki/Factory_method_pattern application/src
  • 59. como o delivery mechanism se conecta com a application?
  • 60. conectando a web app com o application Aqui o factory method é usado para instanciar o use case. A interface pública do use case é usada como Port para acessar o código da application * https://en.wikipedia.org/wiki/Factory_method_pattern web-app/app/controllers
  • 61. foco total no domain model domain model != model
  • 62. objetos de domínio são escritos em código ruby puro (PORO*) Não existe nenhuma relação direta com o Active Record *http://blog.jayfields.com/2007/10/ruby-poro.html
  • 63. e os models? Active Record?
  • 64. Nas implementações padrão do rails, o model é uma subclasse de ApplicationRecord, isso faz com que o acoplamento com o banco de dados seja bem alto.
  • 65. O domain object é separado do Model e o seu ciclo de vida é controlado por um Repositório*. O repositório é responsável por executar as consultas (queries), e mapear os objetos de domínio. Para isso pode ter a colaboração de uma Factory*. O Model tem a responsabilidade de garantir a consistência dos dados, de acordo com o modelo relacional. Pode definir algumas queries e ter validações de dados O domain object é quem tem a implementação das lógicas de negócio. *https://martinfowler.com/eaaCatalog/repository.html
  • 66. Um único Model pode dar origem a um modelo de domínio bem mais complexo. Neste caso, todos os dados do domain model são persistidos na mesma tabela (Rails Model) do banco de dados.
  • 67. implementação de um repositório Aqui o model é usado para tirar vantagem do Active Record. Uma factory é usada para fazer a construção do objeto de domínio. .active_nurses é uma query que está encapsulada no Model. O save também delega para o Active Record.
  • 68. onde estamos mesmo? e a história dos hexágonos?
  • 69. a partir da representação original…
  • 70. para uma proposta de implementação O controlador acessa os módulos através de uma porta que expõe a interface pública de um caso de uso. O repositório encapsula o acesso aos models, funcionando como mais um adaptador. A implementação do caso de uso atua como um adaptador.
  • 71. para uma proposta de implementação inside outside outside O controlador acessa os módulos através de uma porta que expõe a interface pública de um caso de uso. O repositório encapsula o acesso aos models, funcionando como mais um adaptador. A implementação do caso de uso atua como um adaptador.
  • 73. Deve permitir ao paciente agendar a aplicação de vacina. Ao fazer o agendamento deve-se efetuar o pagamento e reservar o estoque dos produtos agendados.
  • 74. Deve permitir ao paciente agendar a aplicação de vacina. Ao fazer o agendamento deve-se efetuar o pagamento e reservar o estoque dos produtos agendados.
  • 77. como um contexto executa uma ação em outro contexto?
  • 79. O ideal é que um contexto só exponha objetos de fronteira. Ex: Use Cases, Services ou Repositories Se precisar retornar um conjunto de dados mais complexo, dê preferência para Hashs ou Tuplas Mantenha o domain model protegido dentro do contexto. O ideal é não deixar “vazar" do contexto os objetos de domínio
  • 80. public class deve-se reduzir o número de classes públicas para promover o encapsulamento
  • 82. context maps Open Host Service (OHS) Anti Corruption Layer (ACL) Event Publisher (EP)
  • 83. 1
  • 84. Gestão de Agendas Pagamentos Neste caso os contextos se falam através dos objetos de fronteira: Services e Use Case
  • 85.
  • 86. construa uma arquitetura que te permita atrasar as decisões https://8thlight.com/blog/uncle-bob/2011/11/22/Clean-Architecture.html
  • 87. Indireção para o contexto de pagamento Injeção de Dependências
  • 88. Único ponto de contato com contexto de pagamento efetuar agendamento
  • 89. Tradução do modelo entre os dois contextos efetuar agendamento
  • 90. 2
  • 91. Gestão de agendas Gestão de estoque Os dois contextos se falam através de um domain event AgendamentoCriado
  • 92. Publica o evento através da EP Contato com o contexto de gestão de estoque
  • 93. como tirar vantagem e extrair para um microsserviço?
  • 94. contexto de pagamento como microsserviço O único ponto de contato com o contexto de pagamento no agendamento era o objeto de fronteira Pagamento. Este objeto vai precisar ser alterado e, em vez de chamar o contexto diretamente, vamos introduzir uma service layer para implementar a chamada remota ao microsserviço de pagamento O contexto de pagamento foi extraído e adicionado em uma nova aplicação rails. Foi necessário expor uma api para disponibilizar o acesso aos casos de uso. Neste caso, provavelmente os respositórios deverão ser alterados para conectar no banco de dados diferente.
  • 95. contexto de pagamento como microsserviço O único ponto de contato com o contexto de pagamento no agendamento era o objeto de fronteira Pagamento. Este objeto vai precisar ser alterado e, em vez de chamar o contexto diretamente, vamos introduzir uma service layer para implementar a chamada remota ao microsserviço de pagamento O contexto de pagamento foi extraído e adicionado em uma nova aplicação rails. Foi necessário expor uma api para disponibilizar o acesso aos casos de uso. Neste caso, provavelmente os respositórios deverão ser alterados para conectar no banco de dados diferente.
  • 96. como extrair o contexto de Gestão de Estoque? Como lidar com o Domain Event AgendamentoCriado?
  • 98. contexto de estoque como microsserviço O contexto de agendamento continua publicando o domain event AgendamentoCriado da mesma forma que antes, nada muda aqui. O Event Handler original é substituído por outro que publica o evento em um Broker de mensagem. Ex: RabbitMQ, Kafka, ActveMQ No microsserviço de estoque, é necessário adicionar na ACL, handlers que serão estimulados pelas mensagens entregues pelo broker. Estes handlers, delegam a execução para os caso de uso.
  • 99. O contexto de agendamento continua publicando o domain event AgendamentoCriado da mesma forma que antes, nada muda aqui. O Event Handler original é substituído por outro que publica o evento em um Broker de mensagem. Ex: RabbitMQ, Kafka, ActveMQ No microsserviço de estoque, é necessário adicionar na ACL, handlers que serão estimulados pelas mensagens entregues pelo broker. Estes handlers, delegam a execução para os caso de uso. contexto de estoque como microsserviço
  • 102. O controle de acoplamento é extremamente importante