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
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 e agentes 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
🤓 CEO & CTO Astrotech Software House
👨🎓 Graduado em Análise e Desenv. Sistemas
🤘 Movido a café e Rockn'roll
👨💻 Programador há mais de 20 anos
👨👩👦 Esposo da Dayanny Pai do Kauan Lucas
fb.com/kilderson.sena
@derson_sena
@derson_sena
dersonsena
dersonsena-cabradev
cabra.dev
@cabra_dev
Vinícius Dias
(PHP Rio)
Junior Grossi
(PHP MG)
Willian Correa
(PHP com Rapadura)
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.
São usados mais na "borda" das camadas para fazer a entrada e saída de dados de forma desacoplada.
DTO • Adapter • SRP • DIP • DDD
class CreateOrderInputData
{
public function __construct(
public readonly string $orderId,
public readonly int $clientId
){
// Sanitizar, truncar os valores dos atributos...
// NADA de regra de negócios aqui!
}
}
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
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
"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
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
DTO • Adapter • SRP • DIP • DDD
É uma abordagem focada na comunicação com especialistas do negócio
(Domain Experts)
DTO • Adapter • SRP • DIP • DDD
Entities (Entidades)
~> 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
DTO • Adapter • SRP • DIP • DDD
Entidades não tem absolutamente NADA a ver com mapeamento de um ORM ou um Active Record.
Entities (Entidades)
DTO • Adapter • SRP • DIP • DDD
Eloquent
DTO • Adapter • SRP • DIP • DDD
Doctrine
DTO • Adapter • SRP • DIP • DDD
São objetos auto validaveis e imutáveis pois sua identidade está no(s) seu(s) valor(es), ou seja, se eu mudar um dos valores de um V.O. eu estou mudando ele inteiro.
Value Objects (Objetos de Valor)
DTO • Adapter • SRP • DIP • DDD
Repositories (Repositórios)
É uma abstração de persistência e consulta de dados.
Nesse ponto não sabemos como ou onde isso vai ser persistido, você só estará dizendo que haverá uma interação com uma mecanismo de armazenamento.
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
Supondo que estamos num domínio de vendas e temos cálculos de multa e juros. Se formos calcular numa ação de geração de uma NF no mundo real independente de ter sistema ou não regra continuaria a mesma.
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 necessário
~> 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
"AirB2B" de prestadores de serviços
Seguindo a risca a sepação lógica e física das camadas
Marketing Multinível
-> Mapeamento de Contextos (Context Mapping);
-> Event storming é ótimo para isso;
-> Dividir o projeto em contextos ou módulos;
-> Mesmos contextos delimitados do DDD;
-> Contextos NÃO se conversam diretamente;
-> Um "Shared Kernel" para servir os contextos;
Entities + Use Cases
Interface Adapters +
* Framewors and Drivers
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