SlideShare uma empresa Scribd logo
1 de 24
Baixar para ler offline
CÓDIGO LIMPO
Melhorando a qualidade do código
Nomes significativos
 Use nomes relevantes, que mostrem sua
intenção
 int d; //quantidade de dias
 int dias;
 int diasAno;
 int diasAteFinalDeAno;
 Não use o prefixos/sufixos só porque já existe
a variável com o mesmo nome
 Produto x ProdutoInfo x ProdutoData
 lista, lista1, lista2, aLista, outraLista, listaFinal
 listaFinal do quê?
Nomes significativos
 Redundância
 A palavra variável nunca deve aparecer no nome
de uma variável. Assim como a palavra tabela
nunca deve aparecer no nome da tabela.
 Como é que NomeString é melhor que apenas
Nome?
 Use nomes pronunciáveis
 Facilita a leitura do código
 int qtdeDiaDpsFinAno;
 int quantidadeDiasDepoisFinalDoAno;
Nomes significativos
 Métodos/funções
 Devem ser verbos ou frases verbais, ações.
 Salvar()
 PodeSalvar()
 FoiSalvo()
 CalcularICMS()
 EstaValido()
 GerarFeriados()
 ObterProdutoAtivo()
Small!
 “A primeira regra dos métodos é que eles
devem ser pequenos, a segunda é que eles
devem ser menores ainda.”
 Robert C. Martin (Uncle Bob)
 “Functions should do one thing. They should
do it well. They should do it only.”
 O maior problema é saber o que é essa “uma
coisa”.
 Exemplo: quantas coisas a função a seguir
(Processamento de Pedidos) está fazendo?
Small!
 É fácil mal interpretar e dizer que está fazendo
3 coisas:
 1. Verificando se o pedido é válido
 2. Processando pedido valido
 3. Processando pedido inválido
Small!
 A função tem 3 passos, mas esses passos
estão no mesmo nível de abstração:
 Para Processar o Pedido, nós verificamos se ele
é válido; se sim, o processamos como pedido
válido, senão, o processamos como pedido
inválido.
 O nível de abstração seria “Processar o
Pedido”.
 O método não deve fazer nada além disso.
 Por exemplo, o método não poderia Salvar o Pedido
processado no banco, pois fugiria do Processar o
Pedido.
Comentários
 “Não comente código ruim – reescreva-o.”
 Brian W. Kernighan
 O melhor comentário é o próprio código.
 O que é melhor?
 Ou...
SOLID
Responsa
bilidade
Única
Aberto
Fechado
Substituição
Liskov
Segregação
Interface
Inversão
Dependência
Princípio de Responsabilidade
Única
Princípio de Responsabilidade
Única
 Uma classe ou método deve ter uma única
responsabilidade.
 Uma classe ou método deve ter uma e apenas
UMA razão para mudar.
 Exemplo:
 ValidarTotalItensPedido(Pedido pedido)
 1. Valida se a soma dos Itens bate com o total do Pedido.
 Se não bate, lê o parâmetro 103 do sistema para ver
qual atitude tomar.
 Toma a decisão que o parâmetro 103 propõe.
 O parâmetro diz para buscar a entidade principal...
 2. Retorna se está válido ou não.
Princípio de Responsabilidade
Única
 Então como fazer nesse caso?
 ProcessarPedido(Pedido pedido)
 estaValido = ValidarTotalItensPedido(pedido)
 SE estaValido = FALSE
 ProcessarPedidoInvalido()
 ValidarTotalItensPedido(Pedido pedido)
 Retorna se a soma dos Itens bate com o total do
Pedido.
 ProcessarPedidoInvalido()
 LerParametro(103)
 BuscaEntidadePrincipal()
Princípio de Responsabilidade
Única
 Qual a vantagem disso?
 Ler o código e de imediato saber o que ele está
fazendo e como ele está fazendo.
 Ler como você estivesse lendo instruções ou até
mesmo um livro.
 Para Processar o Pedido, verifica-se o Total dos Itens
desse Pedido. Se o total não bater, o pedido é inválido.
 Para Processar um Pedido Inválido, lê-se o parâmetro 103,
para descobrir qual providência tomar.
 De acordo com o parâmetro 103, busca-se a entidade
principal.
 Com a entidade principal...
Código Limpo Dual
Princípio Aberto Fechado
Princípio Aberto Fechado
 Separação de Pedidos CRM
 Antes – SeparaPedidosNegociacao(...):
 SE ehParaSeparaPedidos
 SeparaPorLinhaComercial()
 SENAO
 PedidoUnico()
Princípio Aberto Fechado
 Quebrando o princípio:
 Depois – SeparaPedidosNegociacao(...):
 SE estrategia = POR_LINHA_COMERCIAL
 SeparaPorLinhaComercial()
 SENAO SE estrategia = POR_REPRESENTANTE
 SeparaPorRepresentante()
 SENAO
 PedidoUnico()
Princípio Aberto Fechado
 Usando abstrações e Strategy Pattern:
 Depois – SeparaPedidosNegociacao(...):
 estrategias =
CarregarEstrategiasDeSeparacaoDePedidos()
 PARA CADA estrategia EM estrategias
 SE estrategia.UsarEssaEstrategia()
 estrategia.SepararPedido()
Código Limpo Dual
Inversão de Dependência
Inversão de Dependência
 Módulos de alto nível não devem depender de
módulos de baixo nível.
 Alto nível: regras e entidade de negócios.
 Baixo nível: acesso a dados: banco, arquivos ou
WebService.
 Módulos de alto nível devem utilizar um
mecanismo para obter os dados de baixo
nível, mas não depender dos detalhes desse
mecanismo.
Inversão de Dependência
ParametroDataAcc
ess
SeparacaoPedidos
Inversão de Dependência
IParametroDataAcc
ess
ParametroDataAcce
ss
SeparacaoPedidos
Referências
 Software Practices, Pluralsight
 Principles of Object Oriented Design
 Design Patterns
 Clean Code A Handbook of Agile Software
Craftsmanship, Robert C. Martin
 DDD Quickly, Abel Avram & Floyd Marinescu
 Resumo de DDD por Eric Evans
 Agile Principles, Patterns, and Practices in C#,
Robert C. Martin

Mais conteúdo relacionado

Mais procurados

Aula Algoritmo e Programação - cap2
Aula Algoritmo e Programação - cap2Aula Algoritmo e Programação - cap2
Aula Algoritmo e Programação - cap2Cloves da Rocha
 
Curso De Algoritmo Aula 2
Curso De Algoritmo   Aula 2Curso De Algoritmo   Aula 2
Curso De Algoritmo Aula 2Felipe Santos
 
Boas práticas de Testes Automatizados com Junit 4
Boas práticas de Testes Automatizados com Junit 4Boas práticas de Testes Automatizados com Junit 4
Boas práticas de Testes Automatizados com Junit 4Angélica Lima
 
Int. à Logica de Programação
Int. à Logica de ProgramaçãoInt. à Logica de Programação
Int. à Logica de Programaçãoamansilha
 
Conceitos e técnicas de programação aula 4
Conceitos e técnicas de programação aula 4Conceitos e técnicas de programação aula 4
Conceitos e técnicas de programação aula 4Robson Ferreira
 
Introdução à programação
Introdução à programação Introdução à programação
Introdução à programação João Piedade
 
Aula 3 - Utilizando a variável SE e conhecendo operadores lógicos
Aula 3 - Utilizando a variável SE e conhecendo operadores lógicosAula 3 - Utilizando a variável SE e conhecendo operadores lógicos
Aula 3 - Utilizando a variável SE e conhecendo operadores lógicosPaulo Roberto Donatilio Rego
 
Codigo limpo: Nomes Significativos Cap 2
Codigo limpo:  Nomes Significativos Cap 2Codigo limpo:  Nomes Significativos Cap 2
Codigo limpo: Nomes Significativos Cap 2Inael Rodrigues
 
Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)Gercélia Ramos
 
Aula 1 estruturas de controlo (final)
Aula 1   estruturas de controlo (final)Aula 1   estruturas de controlo (final)
Aula 1 estruturas de controlo (final)mestradopeci2012
 

Mais procurados (18)

Estrutura de controle if else
Estrutura de controle if elseEstrutura de controle if else
Estrutura de controle if else
 
Aula Algoritmo e Programação - cap2
Aula Algoritmo e Programação - cap2Aula Algoritmo e Programação - cap2
Aula Algoritmo e Programação - cap2
 
Curso De Algoritmo Aula 2
Curso De Algoritmo   Aula 2Curso De Algoritmo   Aula 2
Curso De Algoritmo Aula 2
 
Aula Forex Modulo 04
Aula Forex Modulo 04Aula Forex Modulo 04
Aula Forex Modulo 04
 
Estruturas de seleção
Estruturas de seleçãoEstruturas de seleção
Estruturas de seleção
 
Boas práticas de Testes Automatizados com Junit 4
Boas práticas de Testes Automatizados com Junit 4Boas práticas de Testes Automatizados com Junit 4
Boas práticas de Testes Automatizados com Junit 4
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Int. à Logica de Programação
Int. à Logica de ProgramaçãoInt. à Logica de Programação
Int. à Logica de Programação
 
Conceitos e técnicas de programação aula 4
Conceitos e técnicas de programação aula 4Conceitos e técnicas de programação aula 4
Conceitos e técnicas de programação aula 4
 
Modulo 05
Modulo 05Modulo 05
Modulo 05
 
Introdução à programação
Introdução à programação Introdução à programação
Introdução à programação
 
Clean code
Clean codeClean code
Clean code
 
Falácias
FaláciasFalácias
Falácias
 
Aula 3 - Utilizando a variável SE e conhecendo operadores lógicos
Aula 3 - Utilizando a variável SE e conhecendo operadores lógicosAula 3 - Utilizando a variável SE e conhecendo operadores lógicos
Aula 3 - Utilizando a variável SE e conhecendo operadores lógicos
 
Codigo limpo: Nomes Significativos Cap 2
Codigo limpo:  Nomes Significativos Cap 2Codigo limpo:  Nomes Significativos Cap 2
Codigo limpo: Nomes Significativos Cap 2
 
Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)
 
Aula 1 estruturas de controlo (final)
Aula 1   estruturas de controlo (final)Aula 1   estruturas de controlo (final)
Aula 1 estruturas de controlo (final)
 
Aula 4
Aula 4Aula 4
Aula 4
 

Destaque

Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de CódigoJoberto Diniz
 
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013Maurício Aniche
 
Métricas de código, pra que te quero?
Métricas de código, pra que te quero?Métricas de código, pra que te quero?
Métricas de código, pra que te quero?Maurício Aniche
 
O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?Maurício Aniche
 
Measurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented DesignMeasurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented Designzebew
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...Joberto Diniz
 

Destaque (9)

Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de Código
 
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Métricas de código, pra que te quero?
Métricas de código, pra que te quero?Métricas de código, pra que te quero?
Métricas de código, pra que te quero?
 
O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?
 
Measurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented DesignMeasurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented Design
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
 
Code Smells
Code SmellsCode Smells
Code Smells
 

Semelhante a Código Limpo Dual

Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraValberto Carneiro
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8Emiliano Barbosa
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
 
Introdução a Desenvolvimento Orientado a Testes ( TDD )
Introdução a Desenvolvimento Orientado a Testes ( TDD )Introdução a Desenvolvimento Orientado a Testes ( TDD )
Introdução a Desenvolvimento Orientado a Testes ( TDD )Iure Guimaraes
 
Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Yasser Veleda
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In TubaRafael Paz
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Thiago Faria de Andrade
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência JavaMario Jorge Pereira
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersStefan Teixeira
 
Oo presentation básica
Oo presentation básicaOo presentation básica
Oo presentation básicaLorena de Souza
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3Inael Rodrigues
 
Boas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros MacetesBoas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros MacetesIsmael
 
Modelagem De Banco De Dados
Modelagem De Banco De DadosModelagem De Banco De Dados
Modelagem De Banco De Dadosmgoberto
 

Semelhante a Código Limpo Dual (20)

Código limpo
Código limpoCódigo limpo
Código limpo
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração segura
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8
 
Clean code
Clean codeClean code
Clean code
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por Testes
 
Introdução a Desenvolvimento Orientado a Testes ( TDD )
Introdução a Desenvolvimento Orientado a Testes ( TDD )Introdução a Desenvolvimento Orientado a Testes ( TDD )
Introdução a Desenvolvimento Orientado a Testes ( TDD )
 
Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)Clean Code (Robert C. Martin)
Clean Code (Robert C. Martin)
 
Lógica de Programação
Lógica de ProgramaçãoLógica de Programação
Lógica de Programação
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Algoritmo
AlgoritmoAlgoritmo
Algoritmo
 
Introducao logica
Introducao logicaIntroducao logica
Introducao logica
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Oo presentation básica
Oo presentation básicaOo presentation básica
Oo presentation básica
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3
 
Aula 10
Aula 10Aula 10
Aula 10
 
Boas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros MacetesBoas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros Macetes
 
Modelagem De Banco De Dados
Modelagem De Banco De DadosModelagem De Banco De Dados
Modelagem De Banco De Dados
 

Código Limpo Dual

  • 1. CÓDIGO LIMPO Melhorando a qualidade do código
  • 2. Nomes significativos  Use nomes relevantes, que mostrem sua intenção  int d; //quantidade de dias  int dias;  int diasAno;  int diasAteFinalDeAno;  Não use o prefixos/sufixos só porque já existe a variável com o mesmo nome  Produto x ProdutoInfo x ProdutoData  lista, lista1, lista2, aLista, outraLista, listaFinal  listaFinal do quê?
  • 3. Nomes significativos  Redundância  A palavra variável nunca deve aparecer no nome de uma variável. Assim como a palavra tabela nunca deve aparecer no nome da tabela.  Como é que NomeString é melhor que apenas Nome?  Use nomes pronunciáveis  Facilita a leitura do código  int qtdeDiaDpsFinAno;  int quantidadeDiasDepoisFinalDoAno;
  • 4. Nomes significativos  Métodos/funções  Devem ser verbos ou frases verbais, ações.  Salvar()  PodeSalvar()  FoiSalvo()  CalcularICMS()  EstaValido()  GerarFeriados()  ObterProdutoAtivo()
  • 5. Small!  “A primeira regra dos métodos é que eles devem ser pequenos, a segunda é que eles devem ser menores ainda.”  Robert C. Martin (Uncle Bob)  “Functions should do one thing. They should do it well. They should do it only.”  O maior problema é saber o que é essa “uma coisa”.  Exemplo: quantas coisas a função a seguir (Processamento de Pedidos) está fazendo?
  • 6. Small!  É fácil mal interpretar e dizer que está fazendo 3 coisas:  1. Verificando se o pedido é válido  2. Processando pedido valido  3. Processando pedido inválido
  • 7. Small!  A função tem 3 passos, mas esses passos estão no mesmo nível de abstração:  Para Processar o Pedido, nós verificamos se ele é válido; se sim, o processamos como pedido válido, senão, o processamos como pedido inválido.  O nível de abstração seria “Processar o Pedido”.  O método não deve fazer nada além disso.  Por exemplo, o método não poderia Salvar o Pedido processado no banco, pois fugiria do Processar o Pedido.
  • 8. Comentários  “Não comente código ruim – reescreva-o.”  Brian W. Kernighan  O melhor comentário é o próprio código.  O que é melhor?  Ou...
  • 11. Princípio de Responsabilidade Única  Uma classe ou método deve ter uma única responsabilidade.  Uma classe ou método deve ter uma e apenas UMA razão para mudar.  Exemplo:  ValidarTotalItensPedido(Pedido pedido)  1. Valida se a soma dos Itens bate com o total do Pedido.  Se não bate, lê o parâmetro 103 do sistema para ver qual atitude tomar.  Toma a decisão que o parâmetro 103 propõe.  O parâmetro diz para buscar a entidade principal...  2. Retorna se está válido ou não.
  • 12. Princípio de Responsabilidade Única  Então como fazer nesse caso?  ProcessarPedido(Pedido pedido)  estaValido = ValidarTotalItensPedido(pedido)  SE estaValido = FALSE  ProcessarPedidoInvalido()  ValidarTotalItensPedido(Pedido pedido)  Retorna se a soma dos Itens bate com o total do Pedido.  ProcessarPedidoInvalido()  LerParametro(103)  BuscaEntidadePrincipal()
  • 13. Princípio de Responsabilidade Única  Qual a vantagem disso?  Ler o código e de imediato saber o que ele está fazendo e como ele está fazendo.  Ler como você estivesse lendo instruções ou até mesmo um livro.  Para Processar o Pedido, verifica-se o Total dos Itens desse Pedido. Se o total não bater, o pedido é inválido.  Para Processar um Pedido Inválido, lê-se o parâmetro 103, para descobrir qual providência tomar.  De acordo com o parâmetro 103, busca-se a entidade principal.  Com a entidade principal...
  • 16. Princípio Aberto Fechado  Separação de Pedidos CRM  Antes – SeparaPedidosNegociacao(...):  SE ehParaSeparaPedidos  SeparaPorLinhaComercial()  SENAO  PedidoUnico()
  • 17. Princípio Aberto Fechado  Quebrando o princípio:  Depois – SeparaPedidosNegociacao(...):  SE estrategia = POR_LINHA_COMERCIAL  SeparaPorLinhaComercial()  SENAO SE estrategia = POR_REPRESENTANTE  SeparaPorRepresentante()  SENAO  PedidoUnico()
  • 18. Princípio Aberto Fechado  Usando abstrações e Strategy Pattern:  Depois – SeparaPedidosNegociacao(...):  estrategias = CarregarEstrategiasDeSeparacaoDePedidos()  PARA CADA estrategia EM estrategias  SE estrategia.UsarEssaEstrategia()  estrategia.SepararPedido()
  • 21. Inversão de Dependência  Módulos de alto nível não devem depender de módulos de baixo nível.  Alto nível: regras e entidade de negócios.  Baixo nível: acesso a dados: banco, arquivos ou WebService.  Módulos de alto nível devem utilizar um mecanismo para obter os dados de baixo nível, mas não depender dos detalhes desse mecanismo.
  • 24. Referências  Software Practices, Pluralsight  Principles of Object Oriented Design  Design Patterns  Clean Code A Handbook of Agile Software Craftsmanship, Robert C. Martin  DDD Quickly, Abel Avram & Floyd Marinescu  Resumo de DDD por Eric Evans  Agile Principles, Patterns, and Practices in C#, Robert C. Martin