Kilderson Sena
Cearense arretado e amante da programação. Full Stack Dev, Pai do Kauan Lucas, viciado em café, futebol e Rock'n Roll
Por: Kilderson Sena
REFLEXÕES
Partes das regras de negócio na View ou no controller? Impedindo assim reuso e potencializando duplicação de código?
Regras de negócio estavam diretamente "casadas" com o banco de dados? Dificultando criação de testes?
É arriscado ou seguro substituir uma biblioteca de sua aplicação sem ter que mexer em milhares de linhas de código?
(Por exemplo do moment.js)
Você já se deparou com as situações abaixo:
Dificuldade na evolução do produto
Aplicação fica engessada e com código rígido.
Se você passa ou já passou por isso, tá na hora de virar esse jogo!
"(...) minimizar os recursos humanos necessários para construir e manter um determinado sistema."
Robert C. Martin
"(...) são decisões que ao mesmo tempo são importantes e difíceis de mudar."
Martin Fowler
É uma estratégia arquitetural orientado ao desacoplamento entre as regras de negócio da aplicação, recursos externos como frameworks e bancos de dados.
Separação da aplicação em
camadas lógicas
CAMADAS !== PASTAS
As camadas são LÓGICAS, camadas NÃO SÃO pastas!
"(...) o centro da sua aplicação não é o banco de dados. Não é ele e nem um ou mais frameworks que você pode estar usando. O centro da sua aplicação são os use cases."
Robert C. Martin
"(...) devem definir como as coisas são organizadas, como elas se relacionam e que responsabilidades elas devem ter."
Rodrigo Branas
🤓 Senior Full Stack Engineer
👨🎓 Graduado em Análise e Desenv. Sistemas
🤘 Movido a café e Rockn'roll
👨💻 Programador há mais de 14 anos
👨👩👦 Esposo da Dayanny Pai do Kauan Lucas
fb.com/kilderson.sena
@derson_sena
@derson_sena
dersonsena
Senior Software Engineer
https://www.crewhu.com
dersonsena-cabradev
cabra.dev
@cabra_dev
yiiacademy.com.br/8-motivos-para-usar-o-yii-2
devtube.com.br/ebook-oo1.html
Vinícius Dias
(PHP Rio)
Junior Grossi
(PHP MG)
Willian Correa
(PHP BR)
Marcel dos Santos
(PHP SP)
Rodrigo Branas
(branas.io)
Erandir Jr.
(PHP com Rapadura)
Minha opinião
DTO • Adapter • SRP • DIP • DDD
São objetos que servem para transferir dados de uma camada para outra.
DTO • Adapter • SRP • DIP • DDD
Eu costumo por os dados primitivos, que não valide nada e seja imutável.
Objetivo dele é: receber os dados e levar para o(s) interessado(s).
DTO • Adapter • SRP • DIP • DDD
São usados mais na "borda" da arquitetura para fazer a entrada de dados de forma desacoplada.
DTO • Adapter • SRP • DIP • DDD
class CreateOrderInputData
{
public function __construct(
private string $orderId,
private int clientId
){}
public function getOrderId(): string
{
return this->orderId;
}
public function getClientId(): int
{
return this->clientId;
}
}
DTO • Adapter • SRP • DIP • DDD
É um padrão de projeto estrutural que permite objetos com interfaces incompatíveis colaborarem entre si.
DTO • Adapter • SRP • DIP • DDD
Interface incompatível
com aplicação
Interface esperada
nada aplicação
Aplicação
3th party
DTO • Adapter • SRP • DIP • DDD
DTO • Adapter • SRP • DIP • DDD
Interface incompatível
com aplicação
Interface esperada
nada aplicação
Aplicação
3th party
Adapter/Wrapper
Conciliação entre interfaces incompatíveis
DTO • Adapter • SRP • DIP • DDD
(Classe de Negócio)
SalePayment
(API PagSeguro)
DTO • Adapter • SRP • DIP • DDD
(Classe de Negócio)
SalePayment
(Classe de Persistência)
PagseguroApi
(API PagSeguro)
DTO • Adapter • SRP • DIP • DDD
(Classe de Negócio)
SalePayment
(Classe de Persistência)
PagseguroApi
(API PagSeguro)
(Interface)
PaymentGateway
DTO • Adapter • SRP • DIP • DDD
(Classe de Negócio)
SalePayment
(Classe de Persistência)
PagseguroApi
(API PagSeguro)
(Interface)
PaymentGateway
(Classe de Persistência)
GetNetApi
(API GetNet)
(API Cielo)
(Classe de Persistência)
CieloApi
DTO • Adapter • SRP • DIP • DDD
"De todos os princípios, a SRP provavelmente é o menos compreendido.
Em geral, os programadores imaginam que todos os módulos devem fazer apenas uma coisa."
Fonte: Livro Clean Architecture
Robert C. Martin
DTO • Adapter • SRP • DIP • DDD
Fonte: Livro Clean Architecture
Robert C. Martin
"Historicamente, o SRP tem sido descrito como:
Um módulo deve ter uma, e apenas uma, razão para mudar."
(Um módulo deve ser responsável por um, e apenas um, ator.)
DTO • Adapter • SRP • DIP • DDD
A idéia é que você não marrete tudo numa única classe, criando uma classe Deus
DTO • Adapter • SRP • DIP • DDD
Fonte: Livro Clean Architecture
Robert C. Martin
"Os sistemas mais flexíveis são aqueles em que as dependências de código-fonte se referem apenas a abstrações e não a itens concretos."
DTO • Adapter • SRP • DIP • DDD
Fonte: Livro Clean Architecture
Robert C. Martin
"É impraticável tratar essa ideia como uma regra, pois os sistemas de software dependem de muitas facilidades concretas."
DTO • Adapter • SRP • DIP • DDD
Fonte: Livro Clean Architecture
Robert C. Martin
"Por exemplo, a classe String no Java , DOMDocument e Array Object do PHP são concretas e não seria prático forçá-la a ser abstrata"
DTO • Adapter • SRP • DIP • DDD
(Classe de Negócio)
SalePayment
(Classe de Persistência)
PagseguroApi
(API PagSeguro)
(Classe de Negócio)
SalePayment
(Classe de Persistência)
PagseguroApi
(API PagSeguro)
(Interface)
PaymentGateway
DTO • Adapter • SRP • DIP • DDD
DTO • Adapter • SRP • DIP • DDD
É uma abordagem focada na comunicação com especialistas do negócio
(Domain Experts)
DTO • Adapter • SRP • DIP • DDD
"Uma coisa é entender a Essência do Negócio e outra coisa é codar esta mesma essência de forma adequada"
Rodrigo Branas
DTO • Adapter • SRP • DIP • DDD
~> São artefatos que possuem identidade e estado, podendo ser construídas por outras Entidades ou Value Objects (Objetos de Valor).
~> O estado desses artefatos podem e vão mudar de acordo com seu ciclo de vida
Entities (Entidades)
DTO • Adapter • SRP • DIP • DDD
Entities (Entidades) Exemplos:
DTO • Adapter • SRP • DIP • DDD
Entidades não tem absolutamente NADA a ver com mapeamento de um ORM.
Entities (Entidades)
DTO • Adapter • SRP • DIP • DDD
Esse termo foi "patenteado" pelos ORM's, mas lá nada mais é do que um Mapper ou um espelho de uma classe para uma tabela do banco de dados.
Entities (Entidades)
DTO • Adapter • SRP • DIP • DDD
São objetos auto validaveis e imutáveis pois sua identidade está no seu valor, ou seja, se eu mudar o valor de um V.O. eu estou mudando ele inteiro.
Value Objects (Objetos de Valor)
DTO • Adapter • SRP • DIP • DDD
Geralmente são usados para compor as Entities, por exemplo:
Value Objects (Objetos de Valor)
DTO • Adapter • SRP • DIP • DDD
Aggregates (Agregados)
De forma resumida é um conjunto de Entidades que colaboram entre si podendo até ser tratados como uma unidade.
Formam um contexto transacional.
DTO • Adapter • SRP • DIP • DDD
Aggregates (Agregados)
A tendência natural é que quando essa entidade for abastecida lá no repositório eu estarei lidando com Agregados, ou seja, com o "Lider da Tribo"
(Aggregate Root)
Pedido
(Entidade)
ItemPedido
(Entidade)
Desconto
(Entidade)
Frete
DTO • Adapter • SRP • DIP • DDD
Repositories (Repositórios)
É uma abstração de persistência de dados. Nesse ponto não sabemos como ou onde isso vai ser persistido, você só estará dizendo que haverá uma persistência
DTO • Adapter • SRP • DIP • DDD
Repositories (Repositórios)
O objetivo dessa abstração é desacoplar o seu domínio da sua camada de infraestrutura.
DTO • Adapter • SRP • DIP • DDD
Application Service
Também chamadas de use case, aqui será feita a tal da "Dança das entidades" para algum fim, por exemplo:
fazer matrícula, efetuar login, cancelar venda e etc;
DTO • Adapter • SRP • DIP • DDD
Anti-Corruption Layer (ACL)
ACL na Clean Architecture é o papel feito pela camada Interface Adapters, onde teremos adaptadores ou tradutores de uma camada para outra.
(Classe de Negócio)
SalePayment
(Classe de Persistência)
PagseguroApi
(API PagSeguro)
(Interface)
PaymentGateway
Fonte: Livro Clean Architecture
Robert C. Martin
Fonte: Livro Clean Architecture
Robert C. Martin
Supondo que estamos num domínio de vendas e temos cálculos de multa e juros. Se eu for calcular isso numa ação de venda, de NF, de estoque a regra continuaria a mesma. A aplicação muda mas a regra de juros e multa não muda.
Entities
~> Não deve saber quem o está utilizando, se está consumindo JSON, XML, CSV, Texto puro
~> Não sabe que formato de dados será retornado, só retorna um DTO de Saída (Output Data) quando requerido
~> Lançam Exceções de Negócio
Use Cases
~> Fazem a "tradução" entre o mundo externo e as regras de negócio
~> Convertem dados para mecanismos de I/O
~> Análogo a ACL do DDD
Interface Adapters
~> Essa é a camada mais Low Level
~> São frameworks e outras estruturas externas que fazem o I/O com aplicação
Frameworks & Drivers
Entities + Use Cases
Interface Adapters
Framewors and Drivers
Entrypoint / Main Layer
Deck: para criar um deck é preciso ter: capacidade, cards, dono e possibilidade de mostrar a média de elixir com 1 casa decimal.
Card: um card representa um personagem com os atributos: nome, nível (nível máx: 13) e elixir (nível máx: 9)
Player: todo deck pertence a um player com os atributos: nome, qtd. troféus e o clã que ele pertence
Deck Player #1
Deck Player #2
Player #1
Player #2
REGRAS DA BATALHA
> É obrigatório adicionar exatamente 2 decks
> A diferença entre os troféus dos players NÃO pode ser maior que 800
> Player #1 e Player #2 não pode ser a mesma pessoa
RESULTADO DUELO
> Deverá informar qual player e deck venceu
> Deve somar 50 troféus do player vencedor
> Deve subtrair 5 troféus do player perdedor
fb.com/kilderson.sena
@derson_sena
@derson_sena
dersonsena
By Kilderson Sena
Cearense arretado e amante da programação. Full Stack Dev, Pai do Kauan Lucas, viciado em café, futebol e Rock'n Roll