Clean Architecture

Rodrigo Branas
Rodrigo BranasSoftware Engineer and Leader, Author, Speaker and Trainer em Gennera, Java Magazine, Agile Code and Globalcode
Rodrigo Branas – @rodrigobranas – youtube.com/rodrigobranas
Clean Architecture
The only way to go fast, is to go well
youtube.com/rodrigobranas
inscreva-se
Estamos buscando formas de reduzir a
complexidade, não de aumentá-la
"If you think good architecture is expensive,
try bad architecture"
Brian Foote
Não se desespere com tanto adapter,
composer, interactor, controller, gateway
Um dos primeiros computadores da história,
o ENIAC, começou a operar nos anos 40
Esse computador era programado por meio
de painéis com interruptores e fios
O que se fazia, sem internet, com um
computador nessa época?
Simulações para o decaimento de neutros
durante uma fissão nuclear
Cálculo da trajetória de mísseis
Previsão do tempo
Pelo jeito ninguém criou o computador para
compartilhar fotos ou fazer compras
O software evoluiu de interruptores e fios
para programas armazenados em cartões
Com o tempo, o código-fonte passou de
assembly para linguagens de nível mais alto
Tivemos muitas linguagens importantes nos
anos 50: FORTRAN, LISP, ALGOL e COBOL
As primeiras bibliotecas, permitindo o reuso
de código-fonte, também são dessa época
Além do reuso, garantir que o programa
funcionava era bem complicado
Edsger Dijkstra, um dos primeiros grandes
cientistas da computação, trabalhava nisso...
Ele observou que o uso de GOTO dificultava
os testes por conta da transferência
indiciplinada de controle
Os paradigmas de programação introduzem
um conjunto de regras e restrições
A programação estruturada usa controle de
fluxo, repetição e subrotinas para impor
disciplina na transferência direta de controle
Já faz bastante tempo que superamos os
limites da Lei de Moore...
Com isso começamos a adotar cada vez
mais o paralelismo nos nossos programas
Linguagens funcionais se baseiam em
uma outra forma de computação...
Enquanto a Máquina de Turing realiza mutação
de dados o Cálculo Lambda evalua funções
As linguagens funcionais impõe disciplina
sobre a atribuição e mutação de estado
Quais são as principais características da
programação orientada a objetos?
Encapsulamento, herança e polimorfismo
De certa forma temos tudo isso em outros
paradigmas de programação...
As linguagens OO impõe disciplina sobre a
transferência indireta de controle por meio
da sua característica mais importante,
que é o polimorfismo
É ele que permite a implementação de
plugins e drivers, basta criar um contrato
Aonde o SOLID entra nisso?
"Good software systems begin with clean
code. On the one hand, if the bricks aren’t
well made, the architecture of the building
doesn’t matter much. On the other hand,
you can make a substantial mess with well-
made bricks. This is where the SOLID
principles come in"
Robert Martin
O que é arquitetura de software?
Obviamente essa é uma definição difícil já
que cada um tem uma opinião diferente
"The goal of software architecture is to
minimize the human resources required to
build and maintain the required system"
Robert Martin
"Software architecture is those decisions
which are both important and hard to
change and if made poorly, will make a
project either succeed or fail, in a
needlessly expensive way"
Martin Fowler
"Architecture is about the important
stuff, whatever that is..."
Ralph Johnson
Ao longo dos anos, várias estratégias
arquiteturais foram idealizadas...
Estratégias Arquiteturais
• Hexagonal Architecture ou Ports and
Adapters (Alistair Cockburn)
• Onion Architecture (Jeff Palermo)
• DCI (Jim Coplien e Trygve Reenskaug)
• BCE (Ivar Jacobson)
• DDD (Eric Evans)
• Clean Architecture (Robert Martin)
Todas elas tem algo em comum...
Uma hierarquia onde as camadas de mais alto
nível conhecem camadas de baixo nível, não vice-
versa, criando um fluxo de controle ordenado,
permitindo o reuso e o desacoplamento e fazendo
com que o projeto fique organizado, aberto a
mudanças e fácil de manter e testar
É possível programar tudo no método que trata
uma requisição HTTP? Qual é o problema?
Você já trabalhou em um projeto onde:
• Parte das regras de negócio estavam
definidas em uma view, ou em um controller,
impedindo o reuso e favorecendo a
duplicação de código?
• Existia acoplamento entre as regras de
negócio e o banco de dados, impedindo a
criação de testes de unidade?
• Onde era praticamente impossível substituir
uma biblioteca sem ter que mexer em
milhares de linhas de código?
O que é a Clean Architecture?
A Clean Architecture é uma estratégia arquitetural
orientada ao desacoplamento entre as regras de
negócio da aplicação e os recursos externos por
meio de polimorfismo
Vamos relembrar o conceito de polimorfismo
Polimorfismo significa "diferentes formas", ou seja, as
implementações dependem de um contrato e a podem
variar de forma independente, por exemplo utilizando
padrões como Strategy ou Template Method
O principal objetivo é proporcionar
independência de qualquer recurso externo
Frameworks, bibliotecas, ferramentas,
interfaces gráficas, bancos de dados
Com isso favorecendo a mudança, mesmo
de um framework, além da testabilidade
O principal objetivo é isolar e proteger as
regras de negócio, no núcleo do software
Clean Architecture
Clean Architecture
As camadas da Clean Architecture são
lógicas, não tem relação com as pastas
Clean Architecture
Clean Architecture
Clean Architecture
Clean Architecture
Entities: responsável por concentrar os
principais participantes das regras de negócio
• Address your domain object
• Apply only logic that is applicable in general to the
whole entity (e.g., validating the format of a hostname)
• Plain objects: no framework or annotation
Use Cases: realizam a orquestração das
Entities na concepção das regras de negócio
• Represent your business actions: it’s what you can do
with the application. Expect one use case for each
business action
• Pure business logic, plain code (except maybe some
utils libraries)
• The use case doesn’t know who triggered it and how
the results are going to be presented (for example,
could be on a web page, or — returned as JSON, or
simply logged, and so on.)
• Throws business exceptions
Interface Adapters: fazem a tradução entre o
mundo externo e as regras de negócio
• Retrieve and store data from and to a number of sources
(database, network devices, file system)
• Define interfaces for the data that they need in order to apply
some logic. One or more data providers will implement the
interface, but the use case doesn’t know where the data is
coming from
• Implement the interfaces defined by the use case
• There are ways to interact with the application, and typically
involve a delivery mechanism (for example, REST APIs,
scheduled jobs, GUI, other systems)
• Trigger a use case and convert the result to the appropriate
format for the delivery mechanism
• the controller for a MVC
Frameworks and Drivers: são aspectos
puramente tecnológicos, não funcionais
• Use whatever framework is most appropriate
(they are going to be isolated here anyway)
Existem somente essas camadas?
As camadas de fora devem conhecer as
camadas de dentro, não o contrário
A interface gráfica e o banco de dados não
devem depender das entidades
Utilize mapas de chaves e valores, DTOs ou
até mesmo passando os dados diretamente
Conselhos
• Não se apegue aos nomes de padrões de projeto ou
nas estruturas de pastas que existem pela internet
• Aplique onde fizer mais sentido pra você, desacoplar
tudo pode criar muita complexidade sem necessidade
• Investa em testes de unidade desde o início, eles são
um bom indicador a respeito do desacoplamento das
camadas
• Não tenha medo de errar, entenda os princípios e corra
atrás dos resultados
"The center of your application is not the
database, nor is it one or more of the
frameworks you may be using. The center of
your application is the use cases of your
application"
Robert Martin
Obrigado!
Rodrigo Branas
Twitter: http://www.twitter.com/rodrigobranas
Instagram: http://www.instagram.com/rodrigobranas
YouTube: http://www.youtube.com/rodrigobranas
LinkedIn: http://br.linkedin.com/in/rodrigobranas
GitHub: http://www.github.com/rodrigobranas
Medium: http://www.medium.com/@rodrigobranas
1 de 70

Recomendados

Testes Automatizados por
Testes AutomatizadosTestes Automatizados
Testes AutomatizadosRodrigo Branas
6.8K visualizações30 slides
O papel e a carreira do arquiteto de software por
O papel e a carreira do arquiteto de softwareO papel e a carreira do arquiteto de software
O papel e a carreira do arquiteto de softwareLeonardo Zanivan
1.5K visualizações18 slides
Programação funcional que funciona por
Programação funcional que funcionaProgramação funcional que funciona
Programação funcional que funcionaRodrigo Serradura
1.1K visualizações89 slides
Introdução a Modelagem por
Introdução a ModelagemIntrodução a Modelagem
Introdução a ModelagemRodrigo Branas
866 visualizações67 slides
React e reactividade Meetup Facebook Developer Circles por
React e reactividade Meetup Facebook Developer CirclesReact e reactividade Meetup Facebook Developer Circles
React e reactividade Meetup Facebook Developer CirclesJosé Barbosa
288 visualizações65 slides
Refactoring por
RefactoringRefactoring
RefactoringRodrigo Branas
6.3K visualizações44 slides

Mais conteúdo relacionado

Mais procurados

#Moving br workshop por
#Moving br workshop#Moving br workshop
#Moving br workshopFernanda Ferreira
58 visualizações69 slides
Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ... por
Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ...Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ...
Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ...Taller Negócio Digitais
603 visualizações26 slides
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ... por
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...Taller Negócio Digitais
446 visualizações44 slides
Framework JGenesis por
Framework JGenesisFramework JGenesis
Framework JGenesisComunidade Tá safo!
4.7K visualizações26 slides
Introdução ao desenvolvimento front end usando bootstrap e angular js por
Introdução ao desenvolvimento front end usando bootstrap e angular jsIntrodução ao desenvolvimento front end usando bootstrap e angular js
Introdução ao desenvolvimento front end usando bootstrap e angular jsCloves Moreira Junior
1.8K visualizações32 slides
Introdução ao LiveOak por
Introdução ao LiveOakIntrodução ao LiveOak
Introdução ao LiveOakjesuinoPower
773 visualizações16 slides

Mais procurados(20)

#Moving br workshop por Fernanda Ferreira
#Moving br workshop#Moving br workshop
#Moving br workshop
Fernanda Ferreira58 visualizações
Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ... por Taller Negócio Digitais
Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ...Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ...
Arquitetura de referência Drupal 7 e 8. Da Natura e Taller para a comunidade ...
Taller Negócio Digitais603 visualizações
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ... por Taller Negócio Digitais
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Taller Negócio Digitais446 visualizações
Introdução ao desenvolvimento front end usando bootstrap e angular js por Cloves Moreira Junior
Introdução ao desenvolvimento front end usando bootstrap e angular jsIntrodução ao desenvolvimento front end usando bootstrap e angular js
Introdução ao desenvolvimento front end usando bootstrap e angular js
Cloves Moreira Junior1.8K visualizações
Introdução ao LiveOak por jesuinoPower
Introdução ao LiveOakIntrodução ao LiveOak
Introdução ao LiveOak
jesuinoPower773 visualizações
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr... por Daniel Makiyama
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Daniel Makiyama3.6K visualizações
Como a Natura vem diminuindo seu custo de operação total com Drupal - DrupalC... por Taller Negócio Digitais
Como a Natura vem diminuindo seu custo de operação total com Drupal - DrupalC...Como a Natura vem diminuindo seu custo de operação total com Drupal - DrupalC...
Como a Natura vem diminuindo seu custo de operação total com Drupal - DrupalC...
Taller Negócio Digitais699 visualizações
Desvendando ASP.NET MVC por Vinicius Quaiato
Desvendando ASP.NET MVCDesvendando ASP.NET MVC
Desvendando ASP.NET MVC
Vinicius Quaiato825 visualizações
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio... por Rodrigo Branas
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Rodrigo Branas13K visualizações
Conectando jBPM com o mundo - TDC 2014 SP por jesuinoPower
Conectando jBPM com o mundo - TDC 2014 SPConectando jBPM com o mundo - TDC 2014 SP
Conectando jBPM com o mundo - TDC 2014 SP
jesuinoPower3.8K visualizações
Composição e Integração de Sistemas em 2013 por Leandro Silva
Composição e Integração de Sistemas em 2013Composição e Integração de Sistemas em 2013
Composição e Integração de Sistemas em 2013
Leandro Silva2.4K visualizações
Agile, mudando o foco por ewerttonbravo
Agile, mudando o focoAgile, mudando o foco
Agile, mudando o foco
ewerttonbravo4.2K visualizações
JavaFX: A nova biblioteca gráfica da plataforma Java por jesuinoPower
JavaFX: A nova biblioteca gráfica da plataforma JavaJavaFX: A nova biblioteca gráfica da plataforma Java
JavaFX: A nova biblioteca gráfica da plataforma Java
jesuinoPower68.5K visualizações
Sistemas para o Mundo Real por Leandro Silva
Sistemas para o Mundo RealSistemas para o Mundo Real
Sistemas para o Mundo Real
Leandro Silva1K visualizações
Drupal 8 e ReactJS - DrupalCamp Campinas 2016 por Taller Negócio Digitais
Drupal 8 e ReactJS -  DrupalCamp Campinas 2016Drupal 8 e ReactJS -  DrupalCamp Campinas 2016
Drupal 8 e ReactJS - DrupalCamp Campinas 2016
Taller Negócio Digitais754 visualizações
Como encarar o desenvolvimento front-end por Jean Carlo Emer
Como encarar o desenvolvimento front-endComo encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-end
Jean Carlo Emer2.7K visualizações
IFSP 2015 - Cultura DevOps por Leonardo Comelli
IFSP 2015 - Cultura DevOpsIFSP 2015 - Cultura DevOps
IFSP 2015 - Cultura DevOps
Leonardo Comelli624 visualizações

Similar a Clean Architecture

Introducao a Clean Architecture por
Introducao a Clean ArchitectureIntroducao a Clean Architecture
Introducao a Clean ArchitectureRafael Capuano
72 visualizações26 slides
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado por
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
1.5K visualizações68 slides
Introdução ao Domain-Driven Design por
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
2.2K visualizações46 slides
Estratégias de Estruturação de Código-fonte e Controlo de Versão por
Estratégias de Estruturação de Código-fonte e Controlo de VersãoEstratégias de Estruturação de Código-fonte e Controlo de Versão
Estratégias de Estruturação de Código-fonte e Controlo de VersãoComunidade NetPonto
987 visualizações57 slides
TDC2016SP - Trilha Microservices por
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
663 visualizações67 slides
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr... por
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Rodrigo Vieira
130 visualizações30 slides

Similar a Clean Architecture(20)

Introducao a Clean Architecture por Rafael Capuano
Introducao a Clean ArchitectureIntroducao a Clean Architecture
Introducao a Clean Architecture
Rafael Capuano72 visualizações
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado por Luiz Costa
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 Costa1.5K visualizações
Introdução ao Domain-Driven Design por André Borgonovo
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
André Borgonovo2.2K visualizações
Estratégias de Estruturação de Código-fonte e Controlo de Versão por Comunidade NetPonto
Estratégias de Estruturação de Código-fonte e Controlo de VersãoEstratégias de Estruturação de Código-fonte e Controlo de Versão
Estratégias de Estruturação de Código-fonte e Controlo de Versão
Comunidade NetPonto987 visualizações
TDC2016SP - Trilha Microservices por tdc-globalcode
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
tdc-globalcode663 visualizações
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr... por Rodrigo Vieira
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Rodrigo Vieira130 visualizações
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure por tdc-globalcode
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
tdc-globalcode118 visualizações
Padrões Web & Code Standard por Toni Albuquerque
Padrões Web & Code StandardPadrões Web & Code Standard
Padrões Web & Code Standard
Toni Albuquerque1.1K visualizações
Pipeconf no CoffeOps Campinas por Aécio Pires
Pipeconf no CoffeOps CampinasPipeconf no CoffeOps Campinas
Pipeconf no CoffeOps Campinas
Aécio Pires245 visualizações
Engenharia de Software I - Aula 6 por Alessandro Almeida
Engenharia de Software I - Aula 6Engenharia de Software I - Aula 6
Engenharia de Software I - Aula 6
Alessandro Almeida217 visualizações
Arquitetura de Software e o DNAD2013 por André Borgonovo
Arquitetura de Software e o DNAD2013Arquitetura de Software e o DNAD2013
Arquitetura de Software e o DNAD2013
André Borgonovo613 visualizações
Indo alem do_mvc_node_js por gustavobeavis
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_js
gustavobeavis79 visualizações
Arquitetura web para sistemas de negócio por Ralph Rassweiler
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
Ralph Rassweiler1K visualizações
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021 por Renato Groffe
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Renato Groffe198 visualizações
Palestra ror edted por brunoaalves
Palestra ror edtedPalestra ror edted
Palestra ror edted
brunoaalves304 visualizações
Workshop soa, microservices e devops por Diego Pacheco
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devops
Diego Pacheco1.5K visualizações
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola por Dextra Sistemas / Etec Itu
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Dextra Sistemas / Etec Itu78 visualizações
Treinamento ASP.NET 2014 por Eric Gallardo
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
Eric Gallardo636 visualizações

Mais de Rodrigo Branas

Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas por
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
8.2K visualizações17 slides
Node.js - #6 - Core Modules - net - Rodrigo Branas por
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasRodrigo Branas
1.1K visualizações33 slides
Node.js - #5 - Process - Rodrigo Branas por
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasRodrigo Branas
6.3K visualizações40 slides
Node.js - #4 - Timers - Rodrigo Branas por
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
1.9K visualizações37 slides
Node.js - #3 - Global Objects - Rodrigo Branas por
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasRodrigo Branas
2.7K visualizações32 slides
Node.js - #2 - Sistema de Módulos - Rodrigo Branas por
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasRodrigo Branas
2.1K visualizações73 slides

Mais de Rodrigo Branas(20)

Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas por Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Rodrigo Branas8.2K visualizações
Node.js - #6 - Core Modules - net - Rodrigo Branas por Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo Branas
Rodrigo Branas1.1K visualizações
Node.js - #5 - Process - Rodrigo Branas por Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas6.3K visualizações
Node.js - #4 - Timers - Rodrigo Branas por Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas1.9K visualizações
Node.js - #3 - Global Objects - Rodrigo Branas por Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas2.7K visualizações
Node.js - #2 - Sistema de Módulos - Rodrigo Branas por Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Rodrigo Branas2.1K visualizações
Node.js - #1 - Introdução - Rodrigo Branas por Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
Rodrigo Branas2.9K visualizações
#6 - Git - Desfazendo as coisas por Rodrigo Branas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas
Rodrigo Branas9.1K visualizações
#5 - Git - Contribuindo com um repositório remoto por Rodrigo Branas
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto
Rodrigo Branas1.1K visualizações
#4 - Git - Stash por Rodrigo Branas
#4 - Git - Stash#4 - Git - Stash
#4 - Git - Stash
Rodrigo Branas993 visualizações
#3 - Git - Branching e Merging por Rodrigo Branas
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e Merging
Rodrigo Branas1K visualizações
#2 - Git - DAG por Rodrigo Branas
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
Rodrigo Branas1.1K visualizações
A evolução do AngularJS por Rodrigo Branas
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
Rodrigo Branas15.7K visualizações
JavaScript - Date por Rodrigo Branas
JavaScript - DateJavaScript - Date
JavaScript - Date
Rodrigo Branas2.8K visualizações
JavaScript - Expressões Regulares por Rodrigo Branas
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões Regulares
Rodrigo Branas3.2K visualizações
Automação de Testes com AngularJS por Rodrigo Branas
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJS
Rodrigo Branas4.7K visualizações
Scope AngularJS por Rodrigo Branas
Scope AngularJSScope AngularJS
Scope AngularJS
Rodrigo Branas2.5K visualizações
HTTP Interceptors com AngularJS por Rodrigo Branas
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
Rodrigo Branas3.2K visualizações
Criando serviços com AngularJS por Rodrigo Branas
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJS
Rodrigo Branas8.8K visualizações
Criando Filtros com AngularJS por Rodrigo Branas
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJS
Rodrigo Branas3.8K visualizações

Último

ProxySQL no MySQL: Apenas um load balancer? por
ProxySQL no MySQL: Apenas um load balancer?ProxySQL no MySQL: Apenas um load balancer?
ProxySQL no MySQL: Apenas um load balancer?Roberto Garcia de Bem
6 visualizações62 slides
DevFest2023-Pragmatismo da Internet das Coisas por
DevFest2023-Pragmatismo da Internet das CoisasDevFest2023-Pragmatismo da Internet das Coisas
DevFest2023-Pragmatismo da Internet das CoisasWalter Coan
25 visualizações40 slides
Shift left DevOps Experience por
Shift left DevOps ExperienceShift left DevOps Experience
Shift left DevOps ExperienceWalter Coan
5 visualizações19 slides
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023 por
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023AcademicaDlaUnicesum
6 visualizações3 slides
certificado excel.pdf por
certificado excel.pdfcertificado excel.pdf
certificado excel.pdfjuniorcarvalho136
5 visualizações1 slide
Skills e Squads, como trabalhar? por
Skills e Squads, como trabalhar?Skills e Squads, como trabalhar?
Skills e Squads, como trabalhar?Annelise Gripp
32 visualizações13 slides

Último(9)

ProxySQL no MySQL: Apenas um load balancer? por Roberto Garcia de Bem
ProxySQL no MySQL: Apenas um load balancer?ProxySQL no MySQL: Apenas um load balancer?
ProxySQL no MySQL: Apenas um load balancer?
Roberto Garcia de Bem6 visualizações
DevFest2023-Pragmatismo da Internet das Coisas por Walter Coan
DevFest2023-Pragmatismo da Internet das CoisasDevFest2023-Pragmatismo da Internet das Coisas
DevFest2023-Pragmatismo da Internet das Coisas
Walter Coan25 visualizações
Shift left DevOps Experience por Walter Coan
Shift left DevOps ExperienceShift left DevOps Experience
Shift left DevOps Experience
Walter Coan5 visualizações
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023 por AcademicaDlaUnicesum
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023
MAPA - SAÚDE - FUNDAMENTOS DE FARMACOLOGIA - 54/2023
AcademicaDlaUnicesum6 visualizações
certificado excel.pdf por juniorcarvalho136
certificado excel.pdfcertificado excel.pdf
certificado excel.pdf
juniorcarvalho1365 visualizações
Skills e Squads, como trabalhar? por Annelise Gripp
Skills e Squads, como trabalhar?Skills e Squads, como trabalhar?
Skills e Squads, como trabalhar?
Annelise Gripp32 visualizações
VIRTUS 1.6 MSI.pdf por FbioVieira85
VIRTUS 1.6 MSI.pdfVIRTUS 1.6 MSI.pdf
VIRTUS 1.6 MSI.pdf
FbioVieira855 visualizações
TechConnection 2023 Floripa Azure Container Apps por Walter Coan
TechConnection 2023 Floripa Azure Container AppsTechConnection 2023 Floripa Azure Container Apps
TechConnection 2023 Floripa Azure Container Apps
Walter Coan6 visualizações
Conheça agora o UiPath Autopilot™ para o Studio.pdf por BrunaCavalcanti29
Conheça agora o UiPath Autopilot™ para o Studio.pdfConheça agora o UiPath Autopilot™ para o Studio.pdf
Conheça agora o UiPath Autopilot™ para o Studio.pdf
BrunaCavalcanti2914 visualizações

Clean Architecture

  • 1. Rodrigo Branas – @rodrigobranas – youtube.com/rodrigobranas Clean Architecture The only way to go fast, is to go well
  • 3. Estamos buscando formas de reduzir a complexidade, não de aumentá-la
  • 4. "If you think good architecture is expensive, try bad architecture" Brian Foote
  • 5. Não se desespere com tanto adapter, composer, interactor, controller, gateway
  • 6. Um dos primeiros computadores da história, o ENIAC, começou a operar nos anos 40
  • 7. Esse computador era programado por meio de painéis com interruptores e fios
  • 8. O que se fazia, sem internet, com um computador nessa época?
  • 9. Simulações para o decaimento de neutros durante uma fissão nuclear
  • 10. Cálculo da trajetória de mísseis
  • 12. Pelo jeito ninguém criou o computador para compartilhar fotos ou fazer compras
  • 13. O software evoluiu de interruptores e fios para programas armazenados em cartões
  • 14. Com o tempo, o código-fonte passou de assembly para linguagens de nível mais alto
  • 15. Tivemos muitas linguagens importantes nos anos 50: FORTRAN, LISP, ALGOL e COBOL
  • 16. As primeiras bibliotecas, permitindo o reuso de código-fonte, também são dessa época
  • 17. Além do reuso, garantir que o programa funcionava era bem complicado
  • 18. Edsger Dijkstra, um dos primeiros grandes cientistas da computação, trabalhava nisso...
  • 19. Ele observou que o uso de GOTO dificultava os testes por conta da transferência indiciplinada de controle
  • 20. Os paradigmas de programação introduzem um conjunto de regras e restrições
  • 21. A programação estruturada usa controle de fluxo, repetição e subrotinas para impor disciplina na transferência direta de controle
  • 22. Já faz bastante tempo que superamos os limites da Lei de Moore...
  • 23. Com isso começamos a adotar cada vez mais o paralelismo nos nossos programas
  • 24. Linguagens funcionais se baseiam em uma outra forma de computação...
  • 25. Enquanto a Máquina de Turing realiza mutação de dados o Cálculo Lambda evalua funções
  • 26. As linguagens funcionais impõe disciplina sobre a atribuição e mutação de estado
  • 27. Quais são as principais características da programação orientada a objetos?
  • 29. De certa forma temos tudo isso em outros paradigmas de programação...
  • 30. As linguagens OO impõe disciplina sobre a transferência indireta de controle por meio da sua característica mais importante, que é o polimorfismo
  • 31. É ele que permite a implementação de plugins e drivers, basta criar um contrato
  • 32. Aonde o SOLID entra nisso?
  • 33. "Good software systems begin with clean code. On the one hand, if the bricks aren’t well made, the architecture of the building doesn’t matter much. On the other hand, you can make a substantial mess with well- made bricks. This is where the SOLID principles come in" Robert Martin
  • 34. O que é arquitetura de software?
  • 35. Obviamente essa é uma definição difícil já que cada um tem uma opinião diferente
  • 36. "The goal of software architecture is to minimize the human resources required to build and maintain the required system" Robert Martin
  • 37. "Software architecture is those decisions which are both important and hard to change and if made poorly, will make a project either succeed or fail, in a needlessly expensive way" Martin Fowler
  • 38. "Architecture is about the important stuff, whatever that is..." Ralph Johnson
  • 39. Ao longo dos anos, várias estratégias arquiteturais foram idealizadas...
  • 40. Estratégias Arquiteturais • Hexagonal Architecture ou Ports and Adapters (Alistair Cockburn) • Onion Architecture (Jeff Palermo) • DCI (Jim Coplien e Trygve Reenskaug) • BCE (Ivar Jacobson) • DDD (Eric Evans) • Clean Architecture (Robert Martin)
  • 41. Todas elas tem algo em comum...
  • 42. Uma hierarquia onde as camadas de mais alto nível conhecem camadas de baixo nível, não vice- versa, criando um fluxo de controle ordenado, permitindo o reuso e o desacoplamento e fazendo com que o projeto fique organizado, aberto a mudanças e fácil de manter e testar
  • 43. É possível programar tudo no método que trata uma requisição HTTP? Qual é o problema?
  • 44. Você já trabalhou em um projeto onde: • Parte das regras de negócio estavam definidas em uma view, ou em um controller, impedindo o reuso e favorecendo a duplicação de código? • Existia acoplamento entre as regras de negócio e o banco de dados, impedindo a criação de testes de unidade? • Onde era praticamente impossível substituir uma biblioteca sem ter que mexer em milhares de linhas de código?
  • 45. O que é a Clean Architecture?
  • 46. A Clean Architecture é uma estratégia arquitetural orientada ao desacoplamento entre as regras de negócio da aplicação e os recursos externos por meio de polimorfismo
  • 47. Vamos relembrar o conceito de polimorfismo
  • 48. Polimorfismo significa "diferentes formas", ou seja, as implementações dependem de um contrato e a podem variar de forma independente, por exemplo utilizando padrões como Strategy ou Template Method
  • 49. O principal objetivo é proporcionar independência de qualquer recurso externo
  • 51. Com isso favorecendo a mudança, mesmo de um framework, além da testabilidade
  • 52. O principal objetivo é isolar e proteger as regras de negócio, no núcleo do software
  • 55. As camadas da Clean Architecture são lógicas, não tem relação com as pastas
  • 60. Entities: responsável por concentrar os principais participantes das regras de negócio • Address your domain object • Apply only logic that is applicable in general to the whole entity (e.g., validating the format of a hostname) • Plain objects: no framework or annotation
  • 61. Use Cases: realizam a orquestração das Entities na concepção das regras de negócio • Represent your business actions: it’s what you can do with the application. Expect one use case for each business action • Pure business logic, plain code (except maybe some utils libraries) • The use case doesn’t know who triggered it and how the results are going to be presented (for example, could be on a web page, or — returned as JSON, or simply logged, and so on.) • Throws business exceptions
  • 62. Interface Adapters: fazem a tradução entre o mundo externo e as regras de negócio • Retrieve and store data from and to a number of sources (database, network devices, file system) • Define interfaces for the data that they need in order to apply some logic. One or more data providers will implement the interface, but the use case doesn’t know where the data is coming from • Implement the interfaces defined by the use case • There are ways to interact with the application, and typically involve a delivery mechanism (for example, REST APIs, scheduled jobs, GUI, other systems) • Trigger a use case and convert the result to the appropriate format for the delivery mechanism • the controller for a MVC
  • 63. Frameworks and Drivers: são aspectos puramente tecnológicos, não funcionais • Use whatever framework is most appropriate (they are going to be isolated here anyway)
  • 65. As camadas de fora devem conhecer as camadas de dentro, não o contrário
  • 66. A interface gráfica e o banco de dados não devem depender das entidades
  • 67. Utilize mapas de chaves e valores, DTOs ou até mesmo passando os dados diretamente
  • 68. Conselhos • Não se apegue aos nomes de padrões de projeto ou nas estruturas de pastas que existem pela internet • Aplique onde fizer mais sentido pra você, desacoplar tudo pode criar muita complexidade sem necessidade • Investa em testes de unidade desde o início, eles são um bom indicador a respeito do desacoplamento das camadas • Não tenha medo de errar, entenda os princípios e corra atrás dos resultados
  • 69. "The center of your application is not the database, nor is it one or more of the frameworks you may be using. The center of your application is the use cases of your application" Robert Martin
  • 70. Obrigado! Rodrigo Branas Twitter: http://www.twitter.com/rodrigobranas Instagram: http://www.instagram.com/rodrigobranas YouTube: http://www.youtube.com/rodrigobranas LinkedIn: http://br.linkedin.com/in/rodrigobranas GitHub: http://www.github.com/rodrigobranas Medium: http://www.medium.com/@rodrigobranas