intercon 2016 - refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework...

39
ESCAPING FROM THE FRAMEWORK guided by Clean Archictecture Ubiratan Soares Outubro/2016

Upload: imasters

Post on 16-Apr-2017

108 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

ESCAPING FROM THE FRAMEWORK

guided by Clean Archictecture

Ubiratan Soares Outubro/2016

Page 2: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

ERA UMA VEZ UM DESENVOLVEDOR ...

Page 3: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa
Page 4: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa
Page 5: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa
Page 6: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

UM LUGAR COMUM• Documentações oficiais enviesam acoplamento

• Senso comum direciona para arquiteturas orientadas a dados

• Acoplamento dificulta testabilidade

• Uso comum de GOD models, Fat Controllers, Views Inteligentes, Singletons e outros

Page 7: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

FRAMEWORK VIEW/CONTROLLER

RestManager mngr = …

DAOBridge bridge = …

DAOBridge

RestManagerModel A

Model B

Model C

Model Dframeworkview.setData(model.attribute)

MODEL

api.getModel(callback)

modelDAO.query(args)

Page 8: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

App (Visão Romântica)

Page 9: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

CONTROLLER CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

CONTROLLER

App (Visão Real)

SINGLETON

Page 10: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa
Page 11: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

WTF ?????

Page 12: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

COMO REPRODUZIR ESSE ERRO?

COMO CORRIGIR ESSE ERRO?

COMO GARANTIR QUE NÃO OCORRERÁ NOVAMENTE?

COMO SABER SE A CORREÇÃO NÃO GEROU OUTROS ERROS?

Page 13: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

MALES DO ACOPLAMENTO• Não torna a aplicação portável

• Vincula a aplicação a frameworks e ferramentas

• Torna difícil testar regras de negócio e comportamentos esperados

• Apodrece o código a médio prazo

Page 14: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

COMO ESCAPAR DO FRAMEWORK ?

Page 15: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

ARQUITETURA DE SOFTWARE• Uma maneira de organizar as coisas

• Estilos sobre as definições de componentes, camadas e relacionamentos

• Boa arquitetura : facilidade de manutenção e extensão, legibilidade, entendimento do que acontece, testabilidade, flexível

• Arquitetura ruim : difícil manutenção, rígida, frágil, difícil de se encontrar o que se precisa, sem testes, alta complexidade

Page 16: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

DATA-CENTRIC ARCHITECTURE

UI

BUSINESS LOGIC (MODEL + CONTROL)

DATABASE NETWORKING ETC

Page 17: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

UI

Networking

Entities

Usecases

Presenters

Gateways

DB

Drivers

Devi

ce

Adap

ters

Interactors

DOMAIN CENTRIC (aka Clean)

Data Access

(External World REST, DB, etc)

UI

Bussiness Logic

DATA CENTRIC

Page 18: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

https://vimeo.com/43612849

Page 19: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

CLEAN ARCHICTECTURE

• R.O.I em continuidade a longo prazo

• Favorece práticas como S.O.L.I.D e testabilidade

• Deixa explícitas as regras de negócio

• Database é detalhe

• REST e networking são detalhes

• UI rendering e frameworks são detalhes

• Entidades (conceitos) são essenciais

• Casos de uso são essenciais

• Contratos de apresentação são essenciais

Motivações Distinção entre essencial e detalhes

Page 20: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

DEPENDENCY RULE

UI

Networking

Entities

Usecases

Presenters

GatewaysDB

Drivers

Devi

ce

Adap

ters

Interactors

Camada mais externa em geral depende de um contrato

com a camada mais interna

Camadas mais externas mais próximas às fronteiras da

aplicação

Camadas ao centro contém as regras de negócio

( o que a aplicação faz)

Page 21: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

DOMAIN-CENTRIC ARCHITECTURE

PRESENTATION LAYER

DOMAIN LAYER

DATA LAYER

DB

REST

ETC

UI

. . .

Page 22: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

TRÊS GRANDES PILARES• O comportamento da sua aplicação deveria depender exclusivamente

da linguagem, e não de frameworks e ferramentas

• Sua aplicação se relaciona com comportamentos, como por exemplo, interfaces para entregar e receber dados : frameworks implementam esses comportamentos

• O núcleo da aplicação deve ser 100% testável; isso inclui TODAS as regras de negócio

Page 23: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

USECASE

REST GATEWAY

PRESENTER

VIEW CONTRACT

PLATAFORM CONTROLLER

DEFINIR FRONTEIRAS

SOURCE CONTRACT

ENTITY

APP

LICA

TIO

N

CORE

Associação

Dependência

Page 24: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

DOMÍNIO DA APLICAÇÃO• Indica aquilo que a aplicação faz

• Casos de uso sobre entidades do domínio (modelos), que são as representações dos conceitos para a aplicação (não para a UI, nem para sistemas externos)

• Exemplos típicos : • AddToBasket.with(Item) • RetrieveCustomerData.execute( ) • PerformPurchase.execute(Review) • etc

• Casos de uso fazem muito sentido quando existem oportunidades explícitas de reúso

Page 25: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

USECASE 01

PRESENTER

VIEW CONTRACT

PLATAFORM CONTROLLER (passive delivery)

USECASE 02

VIEW MODEL

ISOLANDO A INTERFACE

Associação

Dependência

Application Boundary INPUT MODEL

ENTITY A ENTITY B

Page 26: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

USECASE

SOURCE CONTRACT

REST IMPLEMENTATION (delivery mechanism)

REQUEST MODELApplication Boundary

ISOLANDO I/O

DAO / ORM / etc (delivery mechanism)

RESPONSE MODEL TUPLE MODELQUERY MODEL

ENTITY A

ENTITY B

Associação

Dependência

SOURCE CONTRACT

Page 27: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

SEPARE REPRESENTAÇÕESString description = “Blah” String date = “2010-02-26T19:35:24Z” int step = 2

String description = “Blah” LocalDateTime dateTime = (language representation) TrackingStep currentStep = (enum)

String description = “Blah” String formattedDate = “26/02/2010” String currentStep = “Concluído”

Response Model

Domain Model (Entity)

ViewModel

Page 28: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

CONECTANDO CAMADAS

Estratégia Vantagens Desvantagens

Síncrono Método mais simples Casos de uso não podem executar em paralelo; restrições de contexto

Callbacks Geralmente suportados pela própria linguagem

Difícies de debuggar com concorrência e/ou múltiplas camadas; problemas

com ciclo de vida de objetos

Barramento de eventos Resolvem Callback Hell

Normalmente sem suporte a threading, mais difícil de debuggar e testar que

callbacks

Reactive Programming

Assincronia e concorrência com API ao estilo síncrono; fáceis de testar

Difíceis de aprender, não necessariamente fáceis de debuggar

Page 29: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

COMO TESTAR?

Page 30: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

UNIT TESTS (Mocked Contract)

FUNCTIONAL UI TESTS INTEGRATION TESTS

USECASE

EXTERNAL WORLD ADAPTER

PRESENTER

VIEW CONTRACT

PLATAFORM CONTROLLER

SOURCE CONTRACT

ENTITY

INTEGRATION TESTS (DOUBLES)

UNIT

ACCEPTANCE

E2E

INTEGRATION

UNIT TESTS (Mocked Contract

+ Mocked Usecase)

Page 31: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

EVITE O SANDUÍCHE

UNEEDED ENTITY

UNEEDED USECASE

UNEEDED DOMAIN SERVICE

PRESENTER

• Sintoma da radicalidade de querer tudo SOLID

• Boillerplate desnecessário (código e testes)

• Díficil de identificar no médio prazo

• Origens típicas :

Adotar o mesmo modelo de layers em todo o lugar possível

Tentar prever o futuro

Page 32: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

ORGANIZE POR CONTEXTOtypical-packaging

├── activies ├── adapters ├── fragments ├── networking ├── ... ├── services ├── storage ├── util └── widgets

clear-intentions—packaging ├── customer ├── checkout │   ├── basket │   ├── purchase │   └── review ├── orders ├── products ├── ... ├── push └── shared

VS

Page 33: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

ORGANIZAÇÃO FUNCIONAL

• Intenção explícita

• Localidade espacial

• Fácil Navegação

• Fácil identificar onde estão dependências de ferramentas

• Pode quebrar convenções de frameworks

• Pode quebrar scaffolding / file templates / etc

• Testes deveriam seguir mesma organização, mas podem morar em diretórios diferentes (replicação manual)

• Normalmente o projeto nasce organizado por categorias : difícil migração

Benefícios Potenciais problemas

Page 34: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

CONCLUINDO

Page 35: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

DIFICULDADES TÍPICAS• “É preciso escrever muito código para ter algo realmente funcionando”

• Flerte constante com overengineering

• Decisões de quantas e quais camadas adotar e quais são as apropriadas dependem de contexto, dentro da própria aplicação

• Projetos em andamento não nascem nessa estrutura e precisam ser migrados; identificar as fronteiras é fácil, identificar domínio e casos de uso pode ser mais difícil

• Não há ROI imediato, nem Silver Bullets

Page 36: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

CONSIDERAÇÕES FINAIS• Clean Architecture tem a ver com idéias de organizar as coisas e não

com fórmulas prontas

• Defina sua arquitetura de maneira a deixar claras as intenções do seu código e da sua aplicação

• Sua aplicação é um grande roteador entre agentes de interesse, separe o essencial (o que ela é ) dos detalhes (que podem ser substituídos)

• Comece pelo simples, extraindo comportamentos nas fronteiras do(s) framework(s) e fazendo inversão de controle o(s) mesmo(s)

Page 37: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

UBIRATAN SOARES

Computer Scientist by ICMC/USP

Software Engineer @ luizalabs

Google Developer Expert for Android

Teacher, speaker, etc, etc

Page 38: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

https://speakerdeck.com/ubiratansoares/escaping-from-the-framework

Page 39: InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acoplada a um framework para uma arquitetura limpa

OBRIGADO@ubiratanfsoares

ubiratansoares.github.io

https://br.linkedin.com/in/ubiratanfsoares