SlideShare uma empresa Scribd logo
1 de 70
Baixar para ler offline
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
As camadas da Clean Architecture são
lógicas, não tem relação com as pastas
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

Mais conteúdo relacionado

Mais procurados

Introducao a Arquitetura de Software
Introducao a Arquitetura de SoftwareIntroducao a Arquitetura de Software
Introducao a Arquitetura de SoftwareUFPA
 
Aula 1. apresentação + frameworks
Aula 1. apresentação + frameworksAula 1. apresentação + frameworks
Aula 1. apresentação + frameworksandreluizlc
 
Arquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadores
Arquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadoresArquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadores
Arquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadoresCleber Fonseca
 
Fundamentos de banco de dados 01 indrodução
Fundamentos de banco de dados   01 indroduçãoFundamentos de banco de dados   01 indrodução
Fundamentos de banco de dados 01 indroduçãoRafael Pinheiro
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento webRodrigo Rodrigues
 
Aula 3. frameworks front end
Aula 3. frameworks front endAula 3. frameworks front end
Aula 3. frameworks front endandreluizlc
 
Algoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso CompletoAlgoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso Completothomasdacosta
 
Aula 1 - Introdução ao Mobile
Aula 1 - Introdução ao MobileAula 1 - Introdução ao Mobile
Aula 1 - Introdução ao MobileCloves da Rocha
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVAMoises Omena
 
Arquitectura Orientada a Servicios joseadugarte
Arquitectura Orientada a Servicios joseadugarteArquitectura Orientada a Servicios joseadugarte
Arquitectura Orientada a Servicios joseadugartethearcangelboss
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean ArchitectureRoc Boronat
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
Banco de Dados (parte 01)
Banco de Dados (parte 01)Banco de Dados (parte 01)
Banco de Dados (parte 01)Alex Camargo
 
Estrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - ApresentaçãoEstrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - ApresentaçãoLeinylson Fontinele
 
Clean Architecture Applications in Python
Clean Architecture Applications in PythonClean Architecture Applications in Python
Clean Architecture Applications in PythonSubhash Bhushan
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean ArchitectureMattia Battiston
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de SoftwareAricelio Souza
 

Mais procurados (20)

Aula 07 - Visualg e Pseudocódigo
Aula 07 - Visualg e PseudocódigoAula 07 - Visualg e Pseudocódigo
Aula 07 - Visualg e Pseudocódigo
 
Introducao a Arquitetura de Software
Introducao a Arquitetura de SoftwareIntroducao a Arquitetura de Software
Introducao a Arquitetura de Software
 
Aula 1. apresentação + frameworks
Aula 1. apresentação + frameworksAula 1. apresentação + frameworks
Aula 1. apresentação + frameworks
 
Arquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadores
Arquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadoresArquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadores
Arquiteturas Paralelas e Distribuídas - Aula 2 - Arquiteturas de computadores
 
Fundamentos de banco de dados 01 indrodução
Fundamentos de banco de dados   01 indroduçãoFundamentos de banco de dados   01 indrodução
Fundamentos de banco de dados 01 indrodução
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 
Aula 3. frameworks front end
Aula 3. frameworks front endAula 3. frameworks front end
Aula 3. frameworks front end
 
Linguagem C 10 Arquivos
Linguagem C 10 ArquivosLinguagem C 10 Arquivos
Linguagem C 10 Arquivos
 
Algoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso CompletoAlgoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso Completo
 
Aula 1 - Introdução ao Mobile
Aula 1 - Introdução ao MobileAula 1 - Introdução ao Mobile
Aula 1 - Introdução ao Mobile
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVA
 
Arquitectura Orientada a Servicios joseadugarte
Arquitectura Orientada a Servicios joseadugarteArquitectura Orientada a Servicios joseadugarte
Arquitectura Orientada a Servicios joseadugarte
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Banco de Dados (parte 01)
Banco de Dados (parte 01)Banco de Dados (parte 01)
Banco de Dados (parte 01)
 
Estrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - ApresentaçãoEstrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - Apresentação
 
Engenharia de software
Engenharia de softwareEngenharia de software
Engenharia de software
 
Clean Architecture Applications in Python
Clean Architecture Applications in PythonClean Architecture Applications in Python
Clean Architecture Applications in Python
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 

Semelhante a Clean Architecture

Introducao a Clean Architecture
Introducao a Clean ArchitectureIntroducao a Clean Architecture
Introducao a Clean ArchitectureRafael Capuano
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Estraté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ã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
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
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...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Rodrigo Vieira
 
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
 
Padrões Web & Code Standard
Padrões Web & Code StandardPadrões Web & Code Standard
Padrões Web & Code StandardToni Albuquerque
 
Pipeconf no CoffeOps Campinas
Pipeconf no CoffeOps CampinasPipeconf no CoffeOps Campinas
Pipeconf no CoffeOps CampinasAécio Pires
 
Engenharia de Software I - Aula 6
Engenharia de Software I - Aula 6Engenharia de Software I - Aula 6
Engenharia de Software I - Aula 6Alessandro Almeida
 
Arquitetura de Software e o DNAD2013
Arquitetura de Software e o DNAD2013Arquitetura de Software e o DNAD2013
Arquitetura de Software e o DNAD2013André Borgonovo
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_jsgustavobeavis
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioRalph Rassweiler
 
Boas 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 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 2021Renato Groffe
 
Palestra ror edted
Palestra ror edtedPalestra ror edted
Palestra ror edtedbrunoaalves
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devopsDiego Pacheco
 
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
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 NizzolaDextra Sistemas / Etec Itu
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Eric Gallardo
 

Semelhante a Clean Architecture (20)

Introducao a Clean Architecture
Introducao a Clean ArchitectureIntroducao a Clean Architecture
Introducao a Clean Architecture
 
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 Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Estraté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ã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
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
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...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
 
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
 
Padrões Web & Code Standard
Padrões Web & Code StandardPadrões Web & Code Standard
Padrões Web & Code Standard
 
Pipeconf no CoffeOps Campinas
Pipeconf no CoffeOps CampinasPipeconf no CoffeOps Campinas
Pipeconf no CoffeOps Campinas
 
Engenharia de Software I - Aula 6
Engenharia de Software I - Aula 6Engenharia de Software I - Aula 6
Engenharia de Software I - Aula 6
 
Arquitetura de Software e o DNAD2013
Arquitetura de Software e o DNAD2013Arquitetura de Software e o DNAD2013
Arquitetura de Software e o DNAD2013
 
Corbawebserves
CorbawebservesCorbawebserves
Corbawebserves
 
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
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_js
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
 
Boas 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 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
 
Palestra ror edted
Palestra ror edtedPalestra ror edted
Palestra ror edted
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devops
 
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
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
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 

Mais de Rodrigo Branas

Node.js - #7 - Core Modules - http - Parte 1 - 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 BranasRodrigo Branas
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasRodrigo Branas
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasRodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasRodrigo Branas
 
Node.js - #2 - Sistema de Módulos - 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 BranasRodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisasRodrigo Branas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - IntroduçãoRodrigo 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
#5 - Git - Contribuindo com um repositório remotoRodrigo Branas
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e MergingRodrigo Branas
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJSRodrigo Branas
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões RegularesRodrigo Branas
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJSRodrigo Branas
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSRodrigo Branas
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJSRodrigo Branas
 

Mais de Rodrigo Branas (20)

Node.js - #7 - Core Modules - http - Parte 1 - 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
 
Node.js - #6 - Core Modules - net - 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
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
 
Node.js - #2 - Sistema de Módulos - 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
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - Introdução
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto
 
#4 - Git - Stash
#4 - Git - Stash#4 - Git - Stash
#4 - Git - Stash
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e Merging
 
#2 - Git - DAG
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
 
JavaScript - Date
JavaScript - DateJavaScript - Date
JavaScript - Date
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões Regulares
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJS
 
Scope AngularJS
Scope AngularJSScope AngularJS
Scope AngularJS
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJS
 

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
  • 53.
  • 54.
  • 55. As camadas da Clean Architecture são lógicas, não tem relação com as pastas
  • 56.
  • 57.
  • 58.
  • 59.
  • 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