SlideShare uma empresa Scribd logo
Criando software para o futuro com DDD,
Arquitetura, Patterns, e Atitude
Pablo Dall'Oglio
@pablodalloglio fb/pablodalloglio
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #2
This is not about...
●
Aquele Framework Javascript lançado ontem
– Embora certamente exista um!
●
Uma nova linguagem de programação
– Embora exitam várias!
●
Aquela tecnologia que ninguém conhece ainda
– Não sou vidente!
●
A nova onda do desenvolvimento
– Não sou vidente!
Não é sobre
os outros...
É sobre você
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #3
O que abordaremos
●
Atitude e cultura (Clean code, boas práticas, padrões).
●
Modelagem de domínio e arquiteturas de software.
●
Design Patterns, separation of concerns.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #4
Problemas a resolver
●
Software orientado a tabelas.
●
Softwares cresce / Equipe rotaciona.
●
Requisitos mudam / Tabelas brotam.
●
Modelagem deteriora.
●
Resolve tickets, cria bugs.
●
Tecnologia ficou pra trás.
●
Manutenção é problema.
●
Perda de credibilidade.
●
Big spaghetti code.
Isso gera
Insegurança
raiva
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #5
Problemas a resolver
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #6
O básico antes
●
Dar bons nomes as coisas - fácil de identificar.
●
Colocar as coisas nos lugares corretos - fácil de localizar.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #7
O pessoal tem dificuldades
class TabbedForm2
class SubscriptionsAndCreditsManager
class AbstractFlushClearCacheMessageBuilderOnTransactionSupport
function SetMetafileBitsBetter()
function hashPasswordForStoringInDatabase()
function accessCheckByTypeResultListAndAuditAlarmByHandle()
function InsertImportQueueRecord()
function processa()
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #8
Outros tem pressa
●
I'll fix it later.
●
Depois para alguns é nunca.
●
Depois é pretexto.
●
Eu sei o que isso significa,
e isso basta.
●
Os outros que se esforcem para
entender minha genialidade.
●
Por que cargas d'agua eu fiz isso?!?
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #9
O software você quer amanhã
●
Um software que eu consiga:
– ... ler
– ... manter
– ... trocar partes
●
Um software que eu não precise:
– ... matar quem fez
– ... jogar tudo fora
Legível
Curto
Desacoplado
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #10
Comece com boas práticas
●
Single Responsability (SubscriptionsAndCreditsManager).
●
High Cohesion (Modelo com HTML, UI com lógica).
●
Métodos devem fazer UMA coisa.
●
Métodos não devem ter MUITOS parâmetros (DTO).
●
Usar Exceptions, não códigos de retorno, não HTML.
●
Método dizer o que faz, não como faz (...forStoringinDatabase).
●
Use Nomes precisos.
●
Use nomes fáceis de encontrar (pense nos outros e em você).
●
Use nomes pronunciáveis:
– private genDMYHS()
– private generateTimestamp()
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #11
Coesão coincidental
●
Há pouca ou nenhuma relação entre as coisas.
class SuperMegaHiperUtil
{
public static function UTF8ToISO($texto)
{
// ...
}
public static function media($numeros)
{
// ...
}
public static function converteData($from, $format)
{
// ...
}
}
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #12
E mantenha tudo separado
●
Após organizar as coisas.
●
É preciso fazê-las independentes, pelo menos tentar.
Alguém
sempre diz:
mas tá
funcionando
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #13
E mantenha tudo separado
●
Bibliotecas evoluem.
●
Não fique amarrado.
●
Separe, crie abstrações.
●
Facilite a substituição.
●
Pense em você em 5 anos.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #14
Modelos
Não existem um modelo de
arquitetura a ser copiado?
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #15
Layered Architecture
Separation
of concerns
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #16
Camadas
● Por que não juntar em 2 ou menos camadas?
●
Misturar apresentação e negócio, amarra no Frontend.
●
Misturar negócio e persistência, amarra no DB engine.
● Separar permite substituir.
●
Substituir a camada de apresentação para outro device.
● Substituir o engine de persistência para outro BD.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #17
MVC
● Criado por Trygve Reenskaug no Smalltalk em 1979.
●
Após uma visita à Xerox �.
●
Rails popularizou.
● Frameworks
eclodiram.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #18
MVC
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #19
Onde eu coloco isso?
●
Muitos acharam que o software teria só essas camadas.
●
Mesmo assim, as pessoas não sabiam onde colocar as coisas.
●
Isso é responsabilidade da Model? Da controller?
●
Onde vai a regra de negócio?
●
E a comunicação com bibliotecas externas?
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #20
DDD
●
E aí veio o Eric Evans e baixou a poeira.
●
Aumentou o nível da discussão.
●
"O design é o código, e vice-versa."
2003 Evans
2013 Vernon
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #21
DDD é trocar a ficha
●
Mudança de mindset.
●
A grande mudança está em suas mãos;
●
Não é sobre um Framework específico.
●
Não é sobre desenhar diagramas.
●
Trata de modelagem, de arquitetura.
●
Criar modelos organizados e flexíveis.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #22
DDD é bom para anemia
●
Qual o problema deste código?
●
Parece tão bonito:
$venda = VendaDao::find($id);
$venda->setSituacao(Venda::CANCELADA);
$venda->setDataFinal(date('Y-m-d'));
foreach ($venda->getContas() as $conta) {
$conta->estorna();
}
VendaDao::save($venda);
Qual o
Use Case?
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #23
DDD é bom para anemia
●
Os métodos são genéricos;
●
Não transmitem intenção;
●
Qual contexto de negócio ele é usado;
●
O que quer dizer o conjunto de chamadas?
●
Os objetos são só carregadores de dados de tabelas.
●
É no cliente que está a maioria da lógica (decisão)?
●
Quem executa que determina todo o fluxo.
●
O método deve revelar a intenção do contexto.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #24
DDD é bom para anemia
●
Foca nos atributos, não no comportamento.
●
Não explica a intenção do cenário.
●
Depende do desenvolvedor entender.
$total = $venda->getTotal();
for ($n=1;$n<=$parcelas; $n++)
{
$vcto = date(...);
$conta = new Conta;
$conta->setValor($total/$parcelas);
$conta->setOrigem($venda);
$conta->setVencimento($vcto);
$conta->save();
}
$venda->setStatus(Conta::FATURADA);
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #25
DDD é bom para anemia
●
Essas coisas precisam estar encapsuladas
class Venda
{
// ...
function gerarContasReceber($parcelas)
{
for ($n=1;$n<=$parcelas; $n++)
{
// ...
}
}
}
$venda->gerarContasReceber($parcelas);
Tradicionalmente na
Entidade
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #26
Entity
●
É um objeto que pode mudar ao longo do tempo;
●
Possui com identidade única (unicidade);
●
Identity gerada pela App (UUID, GUID), pelo BD (Sequence);
●
Identity não deve ser gerada pelo usuário (imutável);
●
Seus atributos podem mudar, mas sua identidade permanece;
●
Identidade usada em logs, cache, auditoria, rastreabilidade;
●
Chave simples, e sem significado para o negócio;
●
Cache, manutenção cadastros, logs, REST API.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #27
Value Object
●
Atributo que mede, quantifica ou descreve algo;
●
Não tem identidade, não precisa ser distinguido;
●
Não referenciado por outros do sistema;
●
Deve ser tratado como um escalar;
●
Seus atributos só fazem sentido juntos:
– Ex: Valor + Currency
●
Pode ser serializado;
●
Exemplos:
– Address, Color, Money
– Clone dos dados de um cliente de NF
Vale pelo que
contém, não
pelo que é
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #28
Value Object
class Pessoa extends Entity
{
private $nome;
private $endereco; // Value Object
// ...
}
CREATE TABLE pessoa
(
id serial primary key not null,
nome text not null,
endereco_rua text,
endereco_cep text,
endereco_numero text
)
CREATE TABLE pessoa
(
id serial primary key not null,
nome text not null,
endereco json
)
Jeito A
Jeito B
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #29
Aggregates
●
Grupo de objetos relacionados.
●
Tratado como um todo.
●
Quando deleta uma venda, deleta os itens?
●
Quando deleta uma pessoa, deleta os endereços?
●
É mais fácil pensar em forma de grupo;
●
Cuidado para não fazer tudo como Aggregate;
●
Ex: Produto <has> Sprint, Produto <has> Backlog item, Produto
<has> Release.
●
O root aggregate pode ficar tão grande, que…
●
Um save pode ter centenas de operações de persistência.
●
Root aggregate grande limita performance;
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #30
Aggregates
●
O root gerencia agregados;
●
Diferentes usuários editando diferentes partes;
●
Salva em 1 único commit;
●
Diferentes transações;
●
Lost updates.
Transações
diferentes
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #31
Aggregates
●
Temos mais root aggregates;
●
Sem aggregate em excesso:
– um user mexe num sprint
outro a release…
Itens que precisam
estar em conjunto.
interdependentes.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #32
Repositories
●
Um local onde se guarda coisas para buscar depois;
●
Necessário um Critério (Query Object) para buscar;
●
Repositório pode ser BD rel, mongo, Redis, XML;
class RelationalRepository
{
public function load(Criteria $c) {}
public function delete(Criteria $c) {}
public function size(Criteria $c) {}
public function add(Entity $object) {}
public function remove(Entity $object) {}
}
class PessoaRepository extends Repository
{
}
DAO não é Repos
É só um
wrapper ao redor
de tabelas.
data-centric
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #33
Services
●
Prestado por alguém.
●
Fornecido para alguém.
●
Sabe aquela lógica?
●
Que não encaixa na Entity.
●
Tornariam ela grande.
●
Você não quer por na Controller.
●
Parece que não tem lugar pra ela?
●
Isso pode ser um servico.
●
Domain services, Application Services, e
Infrastructure Services.
●
Serviços não possuem estado (Stateless).
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #34
Domain Services
●
Faz parte do Domínio.
●
Encapsula Lógica de negócio.
●
Lógica que não tem espaço em uma Entity.
●
Não é CRUD.
●
É operação de negócio.
●
É Stateless.
●
É um bom lugar para regras de negócio.
●
Não controla transação, sessão, segurança.
●
Processamento, transformações, cálculos.
Ofertado
pelo
domínio
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #35
Domain Services
Entity:
class Venda
{
function cancela()
// verifica se pode ser cancelada
// altera status, dt. Cancelamento
// anula comissão
// registra movimentação
}
Domain Service:
class VendaService
{
function cancela( id )
-> Venda::cancela()
-> FinanceiroServices:estornaTitulos() // Verifica se tem títulos, estorna
-> EstoqueServices::baixaEstoque() // Rolllback estoque
}
Tem lógica de domínio
Envolve mais coisa
Tem lógica de domínio
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #36
Application Services
●
Não tem lógica de domínio;
●
É mais magra (coordena);
●
Voltado para disponibilização externa;
●
Usa o Domínio;
●
São chamados por controllers ou outras Apps (REST);
●
Um anel ao redor do Domínio;
●
Controlam transações;
●
Controla segurança, sessão;
●
Usam serviços de infraestrutura (msg, notifica, e-mail).
Ofertado
pela
aplicação
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #37
Application Services
class FiscalApplicationService
{
function valida( nfe ) // carrega, valida
function assina( nfe ) // carrega, valida, gera xml, assina, atualiza
function transmite( nfe ) // carrega, valida, transmite, gera mov, atualiza
function geraDanfe( nfe ) // carrega, gera pdf
function cancelaNota( nfe ) // carrega, cancela venda, gera mov, atualiza
}
class DefaultAuthenticationService {
function authenticate ( user, pass ) {
// verifica parametros, exception se vazio.
// instancia a partir do login
// Verifica se está ativo
// compara senhas criptografadas (lib)
// LDAP?
}
}
Não são do
Core Domain
Envolve
Infrastructure Services
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #38
Infrastructure Services
●
Abstrai partes técnicas:
– Email, SMS, Telegram, NFSE, CNAB, etc.
●
Facade
– Esconde um subconjunto interno de
bibliotecas para consumo unificado.
●
Gateway
– Disponibiliza um recurso externo para a App.
Ofertado
pela
infraestrutura
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #39
Infrastructure Services
class NotasGatewayService
{
function emitir ( empresa, array data)
function cancelar( empresa, chave )
}
class CNABService
{
function geraCobranca( local_cobranca, inicio, fim, [cliente] )
// carrega objetos filtrados, gera ocorrencias
function baixaCobranca( local_cobranca, arquivo )
// carrega arquivo, parse, calcula saldo, baixa conta, atualiza
}
class AmazonServices
{
function sendFile()
function getFile()
}
Gateway externo
SAAS
Biblioteca de classes
Formato específico
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #40
Dependency Inversion Principle
●
Como vincular camadas sem forte acoplamento?
●
Controller App Service; App service Dom Service.→ →
●
Evitar acoplamento concreto (hard-coded).
●
Inversão de dependência.
●
É invertida em relação à programação tradicional.
●
Não é determinada diretamente pelo programador.
●
Controle é delegado a infraestrutura de software.
●
Muitas vezes chamada de container.
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #41
Dependency Inversion Principle
<?php
require 'vendor/autoload.php';
use UMADICContainer;
$container = new Container();
$container->set('nfse-gateway', function(Container $c): string {
return NotasGatewayService::class;
});
// FiscalApplicationService...
$gateway = $container->get('nfse-gateway');
$gateway::emitir();
Define
Consome
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #42
Bounded Contexts
●
Um domínio deve ter uma fronteira.
●
Seria bom fazer um grande sistema para tudo?
●
Não separar subdomínios faz tudo ficar dependente.
●
É preciso separar logicamente os subdomínios.
●
Ex: Lançamento, pode ter diferentes significados.
– Ex: Produto, Bem, item de consumo.
●
Permissão não precisa estar amarrada com o negócio
●
Um ERP tem módulos (subdomínios):
– Inventário, compras, recebíveis
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #43
Bounded Contexts
●
Para Vernon, mundo ideal 1=1 (subdomínio=BC).
●
Existem situações indesejáveis, softwares legados.
●
Quando os contextos se comunicam...
– Interfaces são bem vindas.
– Entidades são um começo.
– Serviços ajudam.
– API’s isolam mais ainda.
●
Permite equipes separadas para cada BC.
Imagine um
módulo consultando
a tabela de
outro
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #44
REST integration
class UserRestService
{
function inRole( $param ) {
UserService::checkInGroup( $param['user'], $param['group'] );
}
class ContaReceberRestService
{
function geraContas($param)
{
// abre transacao
$venda = Venda::find($param['venda_id'];
$politica = Politica::find($param['politica_id']);
ContaReceberService::geraContas($venda, $param['parcelas'],
politica_cobranca)
// fecha transacao
}
}
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #45
Arquitetura
Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #46
Obrigado
●
pablo.blog.br
●
adianti.com.br
●
@pablodalloglio
●
@adiantisolution

Mais conteúdo relacionado

PDF
Fatores que influenciam na longevidade de um Software
PPTX
Cada vez que você diz sim para uma funcionalidade, você está adotando um filho
PPTX
WorkShop-PM Canvas - GEITec
PDF
Palestra PM Canvas - Framework
PPT
Estrategias Ágeis para testes sob pressão
PDF
TDC2016SP - Trilha Análise de Negócios
PDF
Estratégia de Mensuração para Produtos Digitais
PPTX
TDC2018FLN | Trilha Gestao de Produtos - Pare de tentar adivinhar e comece a ...
Fatores que influenciam na longevidade de um Software
Cada vez que você diz sim para uma funcionalidade, você está adotando um filho
WorkShop-PM Canvas - GEITec
Palestra PM Canvas - Framework
Estrategias Ágeis para testes sob pressão
TDC2016SP - Trilha Análise de Negócios
Estratégia de Mensuração para Produtos Digitais
TDC2018FLN | Trilha Gestao de Produtos - Pare de tentar adivinhar e comece a ...

Mais procurados (19)

PPTX
O project model canvas e o guia pmbok
PPT
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
PDF
Agile Management
PPTX
Requisitos ageis para times sem tempo
PDF
TDC2018FLN | Trilha Gestao de Produtos - Gestão de produtos data-driven. Como...
PPTX
[TDC SP 2016] A importância da negociação para a vida e a TI
PDF
Project Model Canvas (PM Canvas)
PDF
Práticas Ágeis
PDF
Palestra Gestão de Requisitos através de práticas Ágeis e Enxutas - Manoel P...
PDF
Gestão de Projetos (18/08/2014)
PDF
DevCamp 2017 - Criando produtos de Data Science e Inteligência Artificial
PDF
TDC SP 2016 - Direto ao ponto - Criando produto de forma enxuta
PPT
o que e ser cio de uma startup?
PDF
TDC2018FLN | Trilha Gestao de Produtos - Roadmap: Como manter a estrategia da...
PDF
Agile br2011 lucabastos-prog10x-noiteagilcaelum
PDF
It skills para rh aprender e contratar
PPTX
TDC2016SP - Trilha Análise de Negócios
PPTX
O que está por trás da gestão de projetos com qualidade?
PDF
TDC2018FLN | Trilha Gestao de Produtos - Construindo uma gestao transparente ...
O project model canvas e o guia pmbok
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
Agile Management
Requisitos ageis para times sem tempo
TDC2018FLN | Trilha Gestao de Produtos - Gestão de produtos data-driven. Como...
[TDC SP 2016] A importância da negociação para a vida e a TI
Project Model Canvas (PM Canvas)
Práticas Ágeis
Palestra Gestão de Requisitos através de práticas Ágeis e Enxutas - Manoel P...
Gestão de Projetos (18/08/2014)
DevCamp 2017 - Criando produtos de Data Science e Inteligência Artificial
TDC SP 2016 - Direto ao ponto - Criando produto de forma enxuta
o que e ser cio de uma startup?
TDC2018FLN | Trilha Gestao de Produtos - Roadmap: Como manter a estrategia da...
Agile br2011 lucabastos-prog10x-noiteagilcaelum
It skills para rh aprender e contratar
TDC2016SP - Trilha Análise de Negócios
O que está por trás da gestão de projetos com qualidade?
TDC2018FLN | Trilha Gestao de Produtos - Construindo uma gestao transparente ...
Anúncio

Semelhante a Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude (20)

PDF
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
PDF
Design Patterns com PHP
PDF
Adianti Framework PHPConf 2013
PDF
Programando para programadores: Desafios na evolução de um Framework
PDF
Adianti Framework - Desenvolvendo sistemas web de forma ágil
PDF
Design for change: Fatores que influenciam na longevidade de um Software PHP
PDF
Fatores que influenciam na longevidade de um Software
PPTX
Programando com prazer com DDD
PPT
Domain Driven Design (DDD) - DevIsland, BH
PPT
O futuro do arquiteto e das arquiteturas Java Enterprise
PPTX
Domain-Driven Design
PDF
Qualificação MACC- Entities
ODP
Arquitetura web para sistemas de negócio
PDF
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
PPTX
Arquitetura de Software e o DNAD2013
PDF
Clean Architecture
PPT
DDD > Experiências
PDF
Implementando enterprise patterns com PHP
PDF
Sua aplicação não é filha de um framework
PDF
InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acop...
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Design Patterns com PHP
Adianti Framework PHPConf 2013
Programando para programadores: Desafios na evolução de um Framework
Adianti Framework - Desenvolvendo sistemas web de forma ágil
Design for change: Fatores que influenciam na longevidade de um Software PHP
Fatores que influenciam na longevidade de um Software
Programando com prazer com DDD
Domain Driven Design (DDD) - DevIsland, BH
O futuro do arquiteto e das arquiteturas Java Enterprise
Domain-Driven Design
Qualificação MACC- Entities
Arquitetura web para sistemas de negócio
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Arquitetura de Software e o DNAD2013
Clean Architecture
DDD > Experiências
Implementando enterprise patterns com PHP
Sua aplicação não é filha de um framework
InterCon 2016 - Refactor direto e reto: migração de uma arquitetura 100% acop...
Anúncio

Último (7)

DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
PDF
Dos requisitos ao código: como criar código rastreável em PHP
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PPTX
Curso de Windows 11 resumido na prática.pptx
PDF
Evolução em código: algoritmos genéticos com PHP
PPTX
Mapeamento de Objeto para Tabela Relacional
PDF
apresentacao introducao computacao ead.pdf
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
Dos requisitos ao código: como criar código rastreável em PHP
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
Curso de Windows 11 resumido na prática.pptx
Evolução em código: algoritmos genéticos com PHP
Mapeamento de Objeto para Tabela Relacional
apresentacao introducao computacao ead.pdf

Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude

  • 1. Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude Pablo Dall'Oglio @pablodalloglio fb/pablodalloglio
  • 2. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #2 This is not about... ● Aquele Framework Javascript lançado ontem – Embora certamente exista um! ● Uma nova linguagem de programação – Embora exitam várias! ● Aquela tecnologia que ninguém conhece ainda – Não sou vidente! ● A nova onda do desenvolvimento – Não sou vidente! Não é sobre os outros... É sobre você
  • 3. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #3 O que abordaremos ● Atitude e cultura (Clean code, boas práticas, padrões). ● Modelagem de domínio e arquiteturas de software. ● Design Patterns, separation of concerns.
  • 4. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #4 Problemas a resolver ● Software orientado a tabelas. ● Softwares cresce / Equipe rotaciona. ● Requisitos mudam / Tabelas brotam. ● Modelagem deteriora. ● Resolve tickets, cria bugs. ● Tecnologia ficou pra trás. ● Manutenção é problema. ● Perda de credibilidade. ● Big spaghetti code. Isso gera Insegurança raiva
  • 5. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #5 Problemas a resolver
  • 6. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #6 O básico antes ● Dar bons nomes as coisas - fácil de identificar. ● Colocar as coisas nos lugares corretos - fácil de localizar.
  • 7. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #7 O pessoal tem dificuldades class TabbedForm2 class SubscriptionsAndCreditsManager class AbstractFlushClearCacheMessageBuilderOnTransactionSupport function SetMetafileBitsBetter() function hashPasswordForStoringInDatabase() function accessCheckByTypeResultListAndAuditAlarmByHandle() function InsertImportQueueRecord() function processa()
  • 8. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #8 Outros tem pressa ● I'll fix it later. ● Depois para alguns é nunca. ● Depois é pretexto. ● Eu sei o que isso significa, e isso basta. ● Os outros que se esforcem para entender minha genialidade. ● Por que cargas d'agua eu fiz isso?!?
  • 9. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #9 O software você quer amanhã ● Um software que eu consiga: – ... ler – ... manter – ... trocar partes ● Um software que eu não precise: – ... matar quem fez – ... jogar tudo fora Legível Curto Desacoplado
  • 10. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #10 Comece com boas práticas ● Single Responsability (SubscriptionsAndCreditsManager). ● High Cohesion (Modelo com HTML, UI com lógica). ● Métodos devem fazer UMA coisa. ● Métodos não devem ter MUITOS parâmetros (DTO). ● Usar Exceptions, não códigos de retorno, não HTML. ● Método dizer o que faz, não como faz (...forStoringinDatabase). ● Use Nomes precisos. ● Use nomes fáceis de encontrar (pense nos outros e em você). ● Use nomes pronunciáveis: – private genDMYHS() – private generateTimestamp()
  • 11. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #11 Coesão coincidental ● Há pouca ou nenhuma relação entre as coisas. class SuperMegaHiperUtil { public static function UTF8ToISO($texto) { // ... } public static function media($numeros) { // ... } public static function converteData($from, $format) { // ... } }
  • 12. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #12 E mantenha tudo separado ● Após organizar as coisas. ● É preciso fazê-las independentes, pelo menos tentar. Alguém sempre diz: mas tá funcionando
  • 13. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #13 E mantenha tudo separado ● Bibliotecas evoluem. ● Não fique amarrado. ● Separe, crie abstrações. ● Facilite a substituição. ● Pense em você em 5 anos.
  • 14. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #14 Modelos Não existem um modelo de arquitetura a ser copiado?
  • 15. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #15 Layered Architecture Separation of concerns
  • 16. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #16 Camadas ● Por que não juntar em 2 ou menos camadas? ● Misturar apresentação e negócio, amarra no Frontend. ● Misturar negócio e persistência, amarra no DB engine. ● Separar permite substituir. ● Substituir a camada de apresentação para outro device. ● Substituir o engine de persistência para outro BD.
  • 17. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #17 MVC ● Criado por Trygve Reenskaug no Smalltalk em 1979. ● Após uma visita à Xerox �. ● Rails popularizou. ● Frameworks eclodiram.
  • 18. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #18 MVC
  • 19. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #19 Onde eu coloco isso? ● Muitos acharam que o software teria só essas camadas. ● Mesmo assim, as pessoas não sabiam onde colocar as coisas. ● Isso é responsabilidade da Model? Da controller? ● Onde vai a regra de negócio? ● E a comunicação com bibliotecas externas?
  • 20. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #20 DDD ● E aí veio o Eric Evans e baixou a poeira. ● Aumentou o nível da discussão. ● "O design é o código, e vice-versa." 2003 Evans 2013 Vernon
  • 21. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #21 DDD é trocar a ficha ● Mudança de mindset. ● A grande mudança está em suas mãos; ● Não é sobre um Framework específico. ● Não é sobre desenhar diagramas. ● Trata de modelagem, de arquitetura. ● Criar modelos organizados e flexíveis.
  • 22. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #22 DDD é bom para anemia ● Qual o problema deste código? ● Parece tão bonito: $venda = VendaDao::find($id); $venda->setSituacao(Venda::CANCELADA); $venda->setDataFinal(date('Y-m-d')); foreach ($venda->getContas() as $conta) { $conta->estorna(); } VendaDao::save($venda); Qual o Use Case?
  • 23. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #23 DDD é bom para anemia ● Os métodos são genéricos; ● Não transmitem intenção; ● Qual contexto de negócio ele é usado; ● O que quer dizer o conjunto de chamadas? ● Os objetos são só carregadores de dados de tabelas. ● É no cliente que está a maioria da lógica (decisão)? ● Quem executa que determina todo o fluxo. ● O método deve revelar a intenção do contexto.
  • 24. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #24 DDD é bom para anemia ● Foca nos atributos, não no comportamento. ● Não explica a intenção do cenário. ● Depende do desenvolvedor entender. $total = $venda->getTotal(); for ($n=1;$n<=$parcelas; $n++) { $vcto = date(...); $conta = new Conta; $conta->setValor($total/$parcelas); $conta->setOrigem($venda); $conta->setVencimento($vcto); $conta->save(); } $venda->setStatus(Conta::FATURADA);
  • 25. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #25 DDD é bom para anemia ● Essas coisas precisam estar encapsuladas class Venda { // ... function gerarContasReceber($parcelas) { for ($n=1;$n<=$parcelas; $n++) { // ... } } } $venda->gerarContasReceber($parcelas); Tradicionalmente na Entidade
  • 26. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #26 Entity ● É um objeto que pode mudar ao longo do tempo; ● Possui com identidade única (unicidade); ● Identity gerada pela App (UUID, GUID), pelo BD (Sequence); ● Identity não deve ser gerada pelo usuário (imutável); ● Seus atributos podem mudar, mas sua identidade permanece; ● Identidade usada em logs, cache, auditoria, rastreabilidade; ● Chave simples, e sem significado para o negócio; ● Cache, manutenção cadastros, logs, REST API.
  • 27. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #27 Value Object ● Atributo que mede, quantifica ou descreve algo; ● Não tem identidade, não precisa ser distinguido; ● Não referenciado por outros do sistema; ● Deve ser tratado como um escalar; ● Seus atributos só fazem sentido juntos: – Ex: Valor + Currency ● Pode ser serializado; ● Exemplos: – Address, Color, Money – Clone dos dados de um cliente de NF Vale pelo que contém, não pelo que é
  • 28. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #28 Value Object class Pessoa extends Entity { private $nome; private $endereco; // Value Object // ... } CREATE TABLE pessoa ( id serial primary key not null, nome text not null, endereco_rua text, endereco_cep text, endereco_numero text ) CREATE TABLE pessoa ( id serial primary key not null, nome text not null, endereco json ) Jeito A Jeito B
  • 29. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #29 Aggregates ● Grupo de objetos relacionados. ● Tratado como um todo. ● Quando deleta uma venda, deleta os itens? ● Quando deleta uma pessoa, deleta os endereços? ● É mais fácil pensar em forma de grupo; ● Cuidado para não fazer tudo como Aggregate; ● Ex: Produto <has> Sprint, Produto <has> Backlog item, Produto <has> Release. ● O root aggregate pode ficar tão grande, que… ● Um save pode ter centenas de operações de persistência. ● Root aggregate grande limita performance;
  • 30. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #30 Aggregates ● O root gerencia agregados; ● Diferentes usuários editando diferentes partes; ● Salva em 1 único commit; ● Diferentes transações; ● Lost updates. Transações diferentes
  • 31. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #31 Aggregates ● Temos mais root aggregates; ● Sem aggregate em excesso: – um user mexe num sprint outro a release… Itens que precisam estar em conjunto. interdependentes.
  • 32. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #32 Repositories ● Um local onde se guarda coisas para buscar depois; ● Necessário um Critério (Query Object) para buscar; ● Repositório pode ser BD rel, mongo, Redis, XML; class RelationalRepository { public function load(Criteria $c) {} public function delete(Criteria $c) {} public function size(Criteria $c) {} public function add(Entity $object) {} public function remove(Entity $object) {} } class PessoaRepository extends Repository { } DAO não é Repos É só um wrapper ao redor de tabelas. data-centric
  • 33. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #33 Services ● Prestado por alguém. ● Fornecido para alguém. ● Sabe aquela lógica? ● Que não encaixa na Entity. ● Tornariam ela grande. ● Você não quer por na Controller. ● Parece que não tem lugar pra ela? ● Isso pode ser um servico. ● Domain services, Application Services, e Infrastructure Services. ● Serviços não possuem estado (Stateless).
  • 34. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #34 Domain Services ● Faz parte do Domínio. ● Encapsula Lógica de negócio. ● Lógica que não tem espaço em uma Entity. ● Não é CRUD. ● É operação de negócio. ● É Stateless. ● É um bom lugar para regras de negócio. ● Não controla transação, sessão, segurança. ● Processamento, transformações, cálculos. Ofertado pelo domínio
  • 35. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #35 Domain Services Entity: class Venda { function cancela() // verifica se pode ser cancelada // altera status, dt. Cancelamento // anula comissão // registra movimentação } Domain Service: class VendaService { function cancela( id ) -> Venda::cancela() -> FinanceiroServices:estornaTitulos() // Verifica se tem títulos, estorna -> EstoqueServices::baixaEstoque() // Rolllback estoque } Tem lógica de domínio Envolve mais coisa Tem lógica de domínio
  • 36. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #36 Application Services ● Não tem lógica de domínio; ● É mais magra (coordena); ● Voltado para disponibilização externa; ● Usa o Domínio; ● São chamados por controllers ou outras Apps (REST); ● Um anel ao redor do Domínio; ● Controlam transações; ● Controla segurança, sessão; ● Usam serviços de infraestrutura (msg, notifica, e-mail). Ofertado pela aplicação
  • 37. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #37 Application Services class FiscalApplicationService { function valida( nfe ) // carrega, valida function assina( nfe ) // carrega, valida, gera xml, assina, atualiza function transmite( nfe ) // carrega, valida, transmite, gera mov, atualiza function geraDanfe( nfe ) // carrega, gera pdf function cancelaNota( nfe ) // carrega, cancela venda, gera mov, atualiza } class DefaultAuthenticationService { function authenticate ( user, pass ) { // verifica parametros, exception se vazio. // instancia a partir do login // Verifica se está ativo // compara senhas criptografadas (lib) // LDAP? } } Não são do Core Domain Envolve Infrastructure Services
  • 38. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #38 Infrastructure Services ● Abstrai partes técnicas: – Email, SMS, Telegram, NFSE, CNAB, etc. ● Facade – Esconde um subconjunto interno de bibliotecas para consumo unificado. ● Gateway – Disponibiliza um recurso externo para a App. Ofertado pela infraestrutura
  • 39. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #39 Infrastructure Services class NotasGatewayService { function emitir ( empresa, array data) function cancelar( empresa, chave ) } class CNABService { function geraCobranca( local_cobranca, inicio, fim, [cliente] ) // carrega objetos filtrados, gera ocorrencias function baixaCobranca( local_cobranca, arquivo ) // carrega arquivo, parse, calcula saldo, baixa conta, atualiza } class AmazonServices { function sendFile() function getFile() } Gateway externo SAAS Biblioteca de classes Formato específico
  • 40. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #40 Dependency Inversion Principle ● Como vincular camadas sem forte acoplamento? ● Controller App Service; App service Dom Service.→ → ● Evitar acoplamento concreto (hard-coded). ● Inversão de dependência. ● É invertida em relação à programação tradicional. ● Não é determinada diretamente pelo programador. ● Controle é delegado a infraestrutura de software. ● Muitas vezes chamada de container.
  • 41. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #41 Dependency Inversion Principle <?php require 'vendor/autoload.php'; use UMADICContainer; $container = new Container(); $container->set('nfse-gateway', function(Container $c): string { return NotasGatewayService::class; }); // FiscalApplicationService... $gateway = $container->get('nfse-gateway'); $gateway::emitir(); Define Consome
  • 42. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #42 Bounded Contexts ● Um domínio deve ter uma fronteira. ● Seria bom fazer um grande sistema para tudo? ● Não separar subdomínios faz tudo ficar dependente. ● É preciso separar logicamente os subdomínios. ● Ex: Lançamento, pode ter diferentes significados. – Ex: Produto, Bem, item de consumo. ● Permissão não precisa estar amarrada com o negócio ● Um ERP tem módulos (subdomínios): – Inventário, compras, recebíveis
  • 43. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #43 Bounded Contexts ● Para Vernon, mundo ideal 1=1 (subdomínio=BC). ● Existem situações indesejáveis, softwares legados. ● Quando os contextos se comunicam... – Interfaces são bem vindas. – Entidades são um começo. – Serviços ajudam. – API’s isolam mais ainda. ● Permite equipes separadas para cada BC. Imagine um módulo consultando a tabela de outro
  • 44. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #44 REST integration class UserRestService { function inRole( $param ) { UserService::checkInGroup( $param['user'], $param['group'] ); } class ContaReceberRestService { function geraContas($param) { // abre transacao $venda = Venda::find($param['venda_id']; $politica = Politica::find($param['politica_id']); ContaReceberService::geraContas($venda, $param['parcelas'], politica_cobranca) // fecha transacao } }
  • 45. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #45 Arquitetura
  • 46. Adianti Solutions Ltda © Pablo Dall'Oglio Criando software para o futuro #46 Obrigado ● pablo.blog.br ● adianti.com.br ● @pablodalloglio ● @adiantisolution