SlideShare uma empresa Scribd logo
1 de 46
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

Mais procurados

O project model canvas e o guia pmbok
O project model canvas e o guia pmbokO project model canvas e o guia pmbok
O project model canvas e o guia pmbokJosé Finocchio Jr
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
TDC2018FLN | Trilha Gestao de Produtos - Gestão de produtos data-driven. Como...
TDC2018FLN | Trilha Gestao de Produtos - Gestão de produtos data-driven. Como...TDC2018FLN | Trilha Gestao de Produtos - Gestão de produtos data-driven. Como...
TDC2018FLN | Trilha Gestao de Produtos - Gestão de produtos data-driven. Como...tdc-globalcode
 
[TDC SP 2016] A importância da negociação para a vida e a TI
[TDC SP 2016] A importância da negociação para a vida e a TI[TDC SP 2016] A importância da negociação para a vida e a TI
[TDC SP 2016] A importância da negociação para a vida e a TIGuilherme Motta
 
Project Model Canvas (PM Canvas)
Project Model Canvas (PM Canvas)Project Model Canvas (PM Canvas)
Project Model Canvas (PM Canvas)Evandro Paes
 
Palestra Gestão de Requisitos através de práticas Ágeis e Enxutas - Manoel P...
Palestra Gestão de Requisitos através de práticas Ágeis e Enxutas  - Manoel P...Palestra Gestão de Requisitos através de práticas Ágeis e Enxutas  - Manoel P...
Palestra Gestão de Requisitos através de práticas Ágeis e Enxutas - Manoel P...Manoel Pimentel Medeiros
 
Gestão de Projetos (18/08/2014)
Gestão de Projetos (18/08/2014)Gestão de Projetos (18/08/2014)
Gestão de Projetos (18/08/2014)Alessandro Almeida
 
DevCamp 2017 - Criando produtos de Data Science e Inteligência Artificial
DevCamp 2017 - Criando produtos de Data Science e Inteligência ArtificialDevCamp 2017 - Criando produtos de Data Science e Inteligência Artificial
DevCamp 2017 - Criando produtos de Data Science e Inteligência ArtificialWeslley Souza Patrocinio
 
TDC SP 2016 - Direto ao ponto - Criando produto de forma enxuta
TDC SP 2016 - Direto ao ponto - Criando produto de forma enxutaTDC SP 2016 - Direto ao ponto - Criando produto de forma enxuta
TDC SP 2016 - Direto ao ponto - Criando produto de forma enxutaMayra de Souza
 
o que e ser cio de uma startup?
o que e ser cio de uma startup?o que e ser cio de uma startup?
o que e ser cio de uma startup?tdc-globalcode
 
TDC2018FLN | Trilha Gestao de Produtos - Roadmap: Como manter a estrategia da...
TDC2018FLN | Trilha Gestao de Produtos - Roadmap: Como manter a estrategia da...TDC2018FLN | Trilha Gestao de Produtos - Roadmap: Como manter a estrategia da...
TDC2018FLN | Trilha Gestao de Produtos - Roadmap: Como manter a estrategia da...tdc-globalcode
 
Agile br2011 lucabastos-prog10x-noiteagilcaelum
Agile br2011 lucabastos-prog10x-noiteagilcaelumAgile br2011 lucabastos-prog10x-noiteagilcaelum
Agile br2011 lucabastos-prog10x-noiteagilcaelumLuca Bastos
 
It skills para rh aprender e contratar
It skills para rh  aprender e contratarIt skills para rh  aprender e contratar
It skills para rh aprender e contratarAle Uehara
 
TDC2016SP - Trilha Análise de Negócios
TDC2016SP - Trilha Análise de NegóciosTDC2016SP - Trilha Análise de Negócios
TDC2016SP - Trilha Análise de Negóciostdc-globalcode
 
O que está por trás da gestão de projetos com qualidade?
O que está por trás da gestão de projetos com qualidade?O que está por trás da gestão de projetos com qualidade?
O que está por trás da gestão de projetos com qualidade?Carlos Sousa
 
TDC2018FLN | Trilha Gestao de Produtos - Construindo uma gestao transparente ...
TDC2018FLN | Trilha Gestao de Produtos - Construindo uma gestao transparente ...TDC2018FLN | Trilha Gestao de Produtos - Construindo uma gestao transparente ...
TDC2018FLN | Trilha Gestao de Produtos - Construindo uma gestao transparente ...tdc-globalcode
 

Mais procurados (19)

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

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

Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPPablo Dall'Oglio
 
Fatores que influenciam na longevidade de um Software
Fatores que influenciam na longevidade de um SoftwareFatores que influenciam na longevidade de um Software
Fatores que influenciam na longevidade de um SoftwarePablo Dall'Oglio
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksPablo Dall'Oglio
 
Lidando com Equipes de Desenvolvimento
Lidando com Equipes de DesenvolvimentoLidando com Equipes de Desenvolvimento
Lidando com Equipes de Desenvolvimento4Soft
 
Mitos do Desenvolvimento de Software
Mitos do Desenvolvimento de SoftwareMitos do Desenvolvimento de Software
Mitos do Desenvolvimento de Softwareguest2f8cba
 
Teste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTeste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTiago Link
 
Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...
Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...
Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...tdc-globalcode
 
Mapa de aprendizado Front End
Mapa de aprendizado Front EndMapa de aprendizado Front End
Mapa de aprendizado Front EndCaio Vaccaro
 
Palestra sobre Design de Produto para o 17º Startup Chopp Blumenau
Palestra sobre Design de Produto para o 17º Startup Chopp BlumenauPalestra sobre Design de Produto para o 17º Startup Chopp Blumenau
Palestra sobre Design de Produto para o 17º Startup Chopp BlumenauVitor Hugo
 
[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...
[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...
[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...Andrelise Rafael Gonçalves
 
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresceEncontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresceCarolina Karklis
 
Projeto Digital para Empreendedores
Projeto Digital para EmpreendedoresProjeto Digital para Empreendedores
Projeto Digital para EmpreendedoresThiago Nunes
 
O mercado de trabalho para a T.I.
O mercado de trabalho para a T.I.O mercado de trabalho para a T.I.
O mercado de trabalho para a T.I.Yan Magalhães
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Pablo Dall'Oglio
 
Profissão programador práticas para melhoria contínua fatec pg setembro 2013
Profissão programador práticas para melhoria contínua fatec pg setembro 2013Profissão programador práticas para melhoria contínua fatec pg setembro 2013
Profissão programador práticas para melhoria contínua fatec pg setembro 2013Gabriel Rubens
 
Software Livre e Novas Formas de Trabalho - InfoUNEB 2016
Software Livre e Novas Formas de Trabalho - InfoUNEB 2016Software Livre e Novas Formas de Trabalho - InfoUNEB 2016
Software Livre e Novas Formas de Trabalho - InfoUNEB 2016Sandro Andrade
 

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

Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHP
 
Fatores que influenciam na longevidade de um Software
Fatores que influenciam na longevidade de um SoftwareFatores que influenciam na longevidade de um Software
Fatores que influenciam na longevidade de um Software
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
 
Lidando com Equipes de Desenvolvimento
Lidando com Equipes de DesenvolvimentoLidando com Equipes de Desenvolvimento
Lidando com Equipes de Desenvolvimento
 
Mitos do Desenvolvimento de Software
Mitos do Desenvolvimento de SoftwareMitos do Desenvolvimento de Software
Mitos do Desenvolvimento de Software
 
Teste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTeste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste você
 
Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...
Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...
Open4Education | MC59 - Aprendendo a programar de forma divertida e eficiente...
 
Mapa de aprendizado Front End
Mapa de aprendizado Front EndMapa de aprendizado Front End
Mapa de aprendizado Front End
 
Palestra sobre Design de Produto para o 17º Startup Chopp Blumenau
Palestra sobre Design de Produto para o 17º Startup Chopp BlumenauPalestra sobre Design de Produto para o 17º Startup Chopp Blumenau
Palestra sobre Design de Produto para o 17º Startup Chopp Blumenau
 
[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...
[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...
[GDG Quality Fest 2017] BDD - Como quebrar as barreiras de negócio dentro do ...
 
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresceEncontrando equilíbrio do DDD enquanto sua aplicação cresce
Encontrando equilíbrio do DDD enquanto sua aplicação cresce
 
Projeto Digital para Empreendedores
Projeto Digital para EmpreendedoresProjeto Digital para Empreendedores
Projeto Digital para Empreendedores
 
Scrum
ScrumScrum
Scrum
 
O mercado de trabalho para a T.I.
O mercado de trabalho para a T.I.O mercado de trabalho para a T.I.
O mercado de trabalho para a T.I.
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Profissão programador práticas para melhoria contínua fatec pg setembro 2013
Profissão programador práticas para melhoria contínua fatec pg setembro 2013Profissão programador práticas para melhoria contínua fatec pg setembro 2013
Profissão programador práticas para melhoria contínua fatec pg setembro 2013
 
Software Livre e Novas Formas de Trabalho - InfoUNEB 2016
Software Livre e Novas Formas de Trabalho - InfoUNEB 2016Software Livre e Novas Formas de Trabalho - InfoUNEB 2016
Software Livre e Novas Formas de Trabalho - InfoUNEB 2016
 

Mais de Pablo Dall'Oglio

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPablo Dall'Oglio
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTKPablo Dall'Oglio
 
Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHPPablo Dall'Oglio
 
Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Pablo Dall'Oglio
 
Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Pablo Dall'Oglio
 

Mais de Pablo Dall'Oglio (7)

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a Objetos
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTK
 
Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHP
 
Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)
 
Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013
 

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