UMA ABORDAGEM PRODUTIVA COM CLEAN ARCH, DDD E LARAVEL

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)

E para onde isso nos leva?

Dificuldade na evolução do produto

Se você passa ou já passou por isso, tá na hora de virar esse jogo!

Arquitetura de Software

"(...) minimizar os recursos humanos necessários para construir e manter um determinado sistema."

Robert C. Martin

Arquitetura de Software

"(...) são decisões que ao mesmo tempo são importantes e difíceis de mudar."

Martin Fowler

Clean architecture

É uma estratégia arquitetural orientado ao desacoplamento entre as regras de negócio e agentes externos como frameworks e bancos de dados.

Clean architecture

Separação da aplicação em

camadas lógicas

E a tal das camadas?

CAMADAS !== PASTAS

As camadas são LÓGICAS, camadas NÃO SÃO pastas!

E a tal das camadas?

"(...) 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

E a tal das camadas?

"(...) devem definir como as coisas são organizadas, como elas se relacionam e que responsabilidades elas devem ter."

Rodrigo Branas

Quem é tu mermo?

Kilderson Sena (KILDIM)

👨‍🎓 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

Quem é tu mermo?

Agradecimentos

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)

Pré-requisitos

  • DTO (Data Transfer Object)
  • Design Pattern Adapter (Wrapper)
  • Single Responsibility Principle (S do SOLID)
  • Dependency Inversion (D do SOLID)
  • Conceitos de Domain-Driven Design (DDD)

Minha opinião

Pré-requisitos

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.

Pré-requisitos

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!
  }
}

Pré-requisitos

DTO • Adapter • SRP • DIP • DDD

É um padrão de projeto estrutural que permite objetos com interfaces incompatíveis colaborarem entre si.

Pré-requisitos

DTO • Adapter • SRP • DIP • DDD

Pré-requisitos

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

Pré-requisitos

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.)

Pré-requisitos

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."

Pré-requisitos

DTO • Adapter • SRP • DIP • DDD

Pré-requisitos

DTO • Adapter • SRP • DIP • DDD

É uma abordagem focada na comunicação com especialistas do negócio

(Domain Experts)

Pré-requisitos

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

!!! Alerta de polêmica !!!

Pré-requisitos

DTO • Adapter • SRP • DIP • DDD

Entidades não tem absolutamente NADA a ver com mapeamento de um ORM ou um Active Record.

Entities (Entidades)

Pré-requisitos

DTO • Adapter • SRP • DIP • DDD

Doctrine

Pré-requisitos

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)

Pré-requisitos

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.

uffffaaa !!!

Agora respira e vamos falar de Clean Architecture

Fonte: Livro Clean Architecture

Robert C. Martin

Enterprise business rules

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

APplication business rules

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

interface adapters

Faz a "tradução" entre o mundo externo e as regras de negócio

Convertem dados para mecanismos de I/O

Frameworks and Drivers

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

E por onde começar?

Boilerplate Laravel 11

Domínio

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;

Event Storming

Shipping

Bounded Context

Entities + Use Cases

Interface Adapters +

* Framewors and Drivers

Shipping

Bounded Context

Shipping Domain Layer

Shipping INFRA Layer

Outra Abordagem

Mapeando Abstrações com implementações Concretas

eventos para comunicação entre os bounded contexts

Obrigado! =D

Kilderson Sena

fb.com/kilderson.sena

@derson_sena

@derson_sena

dersonsena

UMA ABORDAGEM PRODUTIVA COM CLEAN ARCH, DDD E LARAVEL [PHP Summit 2023]]

By Kilderson Sena

UMA ABORDAGEM PRODUTIVA COM CLEAN ARCH, DDD E LARAVEL [PHP Summit 2023]]

  • 162