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
Você já se deparou com as situações...
Partes das regras de negócio em camadas de Apresentação ou em Controllers HTTP?
Regras de negócio diretamente "casadas" com o banco de dados?
(Triggers, Procedures, Views, Functions)
É arriscado ou quase impossível substituir uma biblioteca de sua aplicação
(PHPExcel - 2019 | Silex - 2018)
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
👨🎓 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
CEO & CTO Astrotech Software House
https://astrotech.solutions
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
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
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.
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
Doctrine
DTO • Adapter • SRP • DIP • DDD
São objetos auto validaveis e imutáveis. Sua identidade está no(s) seu(s) valor(es). Se mudarmos 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)
Padrão de projeto que atua como um intermediário entre o Domínio e a Camada de Persistência
São projetados para gerenciar Agregados, que representam uma unidade de consistência no domínio.
Fonte: Livro Clean Architecture
Robert C. Martin
Em um domínio de cobranças temos cálculos de multa e juros. Essa ação sempre terá no mundo real, independente de ter sistema ou não a regra continuaria a mesma.
Não deve saber quem o está utilizando
(HTTP, AMQP, Command Line Interface (CLI), Queue e etc)
Não sabe que formato de dados será retornado (XML, JSON, Texto Puro e etc), só retorna um DTO de Saída (Output Data) se necessário
Lançam Exceções de Negócio ou Retornam Erros
Faz a "tradução" entre o mundo externo e as regras de negócio
Convertem dados para mecanismos de I/O
Essa é a camada mais Low Level
São frameworks e outras estruturas externas que fazem o I/O com aplicação
HTTP
CLI
I/O
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