SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
Agenda
• Legibilidade (cap 2)
• Comentários em código (cap 4)
• Formatação (cap 5)
• Funções (cap 3)
• Código externo (cap 8)
• Testes de unidade (cap 9)
• Classes (cap 10)
3
Agenda
• Legibilidade (cap 2)
• Comentários em código (cap 4)
• Formatação (cap 5)
• Funções (cap 3)
• Código externo (cap 8)
• Testes de unidade (cap 9)
• Classes (cap 10)
4
Código Externo
5
Código externo
• Raramente controlamos todo software relacionado ao
nosso sistema
• Exemplos:
• Importamos bibliotecas e frameworks
• Utilizamos códigos open-source
• Dependemos de componentes criados por outros times da
própria empresa (que podem nem existir ainda)
• De certa forma, códigos externos devem ser integrado
ao próprio código desenvolvido
6
Utilizando Código Externo
• Existe uma tensão natural entre produtores e
usuários de interfaces
• Produtores: querem interfaces que funcionem em
diversos ambientes para obter mais audiência
• Usuários: querem interfaces focadas em suas
necessidades particulares
7
java.util.Map
• Interface ampla
• Interface com várias
funcionalidades
• Mas também com
deficiências (quais?)
8
todo cliente pode deletar
todo cliente pode adicionar
itens de qualquer tipo
9
java.util.Map
java.util.Map
Map<Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
• Trecho de código repetido em diversas partes do sistema
• Muito código para alterar se a interface de Map mudar
• Mas a interface de Map nunca muda (?)
• …
10
java.util.Map
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);
Map<Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
• Trecho de código repetido em diversas partes do sistema
• Muito código para alterar se a interface de Map mudar
• Mas a interface de Map nunca muda (?)
• Mudou para suportar generics em Java 5
Java 5
11
java.util.Map
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);
Map<Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
• Trecho de código repetido em diversas partes do sistema
• Muito código para alterar se a interface de Map mudar
• Mas a interface de Map nunca muda (?)
• Mudou para suportar generics em Java 5
Java 5
12
Qual a solução?
java.util.Map
• Solução limpa: encapsular a interface utilizada (ao invés de espalhar)
• Classe Sensors melhora o projeto do sistema (melhor que Map<Sensor>)
• Vantagem: código mais fácil de entender e manter; controle da interface
• Se a interface de Map mudar, seu impacto no sistema será mínimo
13
java.util.Map
• Claro, nem todo uso de Map deve
ser transformado em classe
• Evitar Map quando for argumento
ou retorno de APIs públicas
• Solução limpa: encapsular a interface utilizada (ao invés de espalhar)
• Classe Sensors melhora o projeto do sistema (melhor que Map<Sensor>)
• Vantagem: código mais fácil de entender e manter; controle da interface
• Se a interface de Map mudar, seu impacto no sistema será mínimo
14
• APIs evoluem longo do tempo
• Mas devem evoluir com cautela, pois possuem
clientes
16
Quebra de Contrato de APIs
• 28% de 500K alterações de
APIs quebram compatibilidade
• Por sistema: 14.78%
Historical and Impact Analysis of API Breaking Changes: A Large Scale Study. SANER, 2017.
18
Quebra de Contrato de APIs
19
Quebra de Contrato de APIs:
Razões
Why and How Java Developers Break APIs. SANER,2018.
Testes de Unidade
20
Testes de Unidade
• Código de teste é tão importante quanto de produção
• Devem ser projetados e mantidos
• Garante que alterações não quebram o código existente
• Com testes: código se mantém flexível, pois facilita
alterações; sistema pode ser melhorado
• Sem testes: alteração é uma possível fonte de bugs
21
Teste Limpo
• O que torna o teste limpo?
• O mesmo que torna qualquer código limpo:
• Legibilidade
• Simplicidade
• …
22
Um conceito por teste
• Outra diretriz determina que cada método de teste
deve ter apenas um conceito
• Objetivo: criar métodos focados e evitar método
longos
39
FIRST
• Fast: testes devem ser rápidos; rodar frequentemente
• Independent: testes não devem depender de outros;
para evitar efeito cascata (se um falha, outros falham)
• Repeatable: testes devem ser repetíveis em qualquer
ambiente (produção e laptop), em qualquer ordem; rodar
N vezes e obter o mesmo resultado
• Self-Validating: testes devem ter saída boleana; ou
passam ou falham (sem avaliação manual de logs)
• Timely: testes devem ser escritos antes do código (TDD)
43
Exercício
• Apresente 3 características de um bom
conjunto de testes de unidade (ex: ser legível)
42

Mais conteúdo relacionado

Semelhante a 10-codigo-limpo-parte-3.pdf

Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"Cesar Romero
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021Renato Groffe
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Nelson Glauber Leal
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código LegadoCesar Romero
 
Testes de unidade - RP Tec Com
Testes de unidade - RP Tec ComTestes de unidade - RP Tec Com
Testes de unidade - RP Tec ComIgor Rozani
 
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe munizMatheus de Lara Calache
 
DotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - IntroduçãoDotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - IntroduçãoLorival Smolski Chapuis
 
Aula Modelos de Processos Tradicionais para Desenvolvimento de Software
Aula Modelos de Processos Tradicionais para Desenvolvimento de Software Aula Modelos de Processos Tradicionais para Desenvolvimento de Software
Aula Modelos de Processos Tradicionais para Desenvolvimento de Software Cloves da Rocha
 
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...tdc-globalcode
 
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu SoftwareDevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu SoftwareAndré Dias
 
Aula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaAula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaDaniel Brandão
 
SonarQube
SonarQubeSonarQube
SonarQubeCDS
 
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsComo automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsRafael Salerno de Oliveira
 

Semelhante a 10-codigo-limpo-parte-3.pdf (20)

Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)
 
Codigo limpo.pptx
Codigo limpo.pptxCodigo limpo.pptx
Codigo limpo.pptx
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código Legado
 
Testes de unidade - RP Tec Com
Testes de unidade - RP Tec ComTestes de unidade - RP Tec Com
Testes de unidade - RP Tec Com
 
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
 
DotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - IntroduçãoDotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - Introdução
 
Métricas de Código
Métricas de CódigoMétricas de Código
Métricas de Código
 
Ac16 conjunto de instruções v2
Ac16   conjunto de instruções v2Ac16   conjunto de instruções v2
Ac16 conjunto de instruções v2
 
Aula Modelos de Processos Tradicionais para Desenvolvimento de Software
Aula Modelos de Processos Tradicionais para Desenvolvimento de Software Aula Modelos de Processos Tradicionais para Desenvolvimento de Software
Aula Modelos de Processos Tradicionais para Desenvolvimento de Software
 
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
 
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu SoftwareDevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
 
Aula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaAula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem Java
 
jCompany X Geradores de Códigos
jCompany X Geradores de CódigosjCompany X Geradores de Códigos
jCompany X Geradores de Códigos
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
SonarQube
SonarQubeSonarQube
SonarQube
 
Csharp
CsharpCsharp
Csharp
 
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsComo automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
 

10-codigo-limpo-parte-3.pdf

  • 1. Agenda • Legibilidade (cap 2) • Comentários em código (cap 4) • Formatação (cap 5) • Funções (cap 3) • Código externo (cap 8) • Testes de unidade (cap 9) • Classes (cap 10) 3
  • 2. Agenda • Legibilidade (cap 2) • Comentários em código (cap 4) • Formatação (cap 5) • Funções (cap 3) • Código externo (cap 8) • Testes de unidade (cap 9) • Classes (cap 10) 4
  • 4. Código externo • Raramente controlamos todo software relacionado ao nosso sistema • Exemplos: • Importamos bibliotecas e frameworks • Utilizamos códigos open-source • Dependemos de componentes criados por outros times da própria empresa (que podem nem existir ainda) • De certa forma, códigos externos devem ser integrado ao próprio código desenvolvido 6
  • 5. Utilizando Código Externo • Existe uma tensão natural entre produtores e usuários de interfaces • Produtores: querem interfaces que funcionem em diversos ambientes para obter mais audiência • Usuários: querem interfaces focadas em suas necessidades particulares 7
  • 6. java.util.Map • Interface ampla • Interface com várias funcionalidades • Mas também com deficiências (quais?) 8
  • 7. todo cliente pode deletar todo cliente pode adicionar itens de qualquer tipo 9 java.util.Map
  • 8. java.util.Map Map<Sensor> sensors = new HashMap<Sensor>(); Sensor s = sensors.get(sensorId); • Trecho de código repetido em diversas partes do sistema • Muito código para alterar se a interface de Map mudar • Mas a interface de Map nunca muda (?) • … 10
  • 9. java.util.Map Map sensors = new HashMap(); Sensor s = (Sensor)sensors.get(sensorId); Map<Sensor> sensors = new HashMap<Sensor>(); Sensor s = sensors.get(sensorId); • Trecho de código repetido em diversas partes do sistema • Muito código para alterar se a interface de Map mudar • Mas a interface de Map nunca muda (?) • Mudou para suportar generics em Java 5 Java 5 11
  • 10. java.util.Map Map sensors = new HashMap(); Sensor s = (Sensor)sensors.get(sensorId); Map<Sensor> sensors = new HashMap<Sensor>(); Sensor s = sensors.get(sensorId); • Trecho de código repetido em diversas partes do sistema • Muito código para alterar se a interface de Map mudar • Mas a interface de Map nunca muda (?) • Mudou para suportar generics em Java 5 Java 5 12 Qual a solução?
  • 11. java.util.Map • Solução limpa: encapsular a interface utilizada (ao invés de espalhar) • Classe Sensors melhora o projeto do sistema (melhor que Map<Sensor>) • Vantagem: código mais fácil de entender e manter; controle da interface • Se a interface de Map mudar, seu impacto no sistema será mínimo 13
  • 12. java.util.Map • Claro, nem todo uso de Map deve ser transformado em classe • Evitar Map quando for argumento ou retorno de APIs públicas • Solução limpa: encapsular a interface utilizada (ao invés de espalhar) • Classe Sensors melhora o projeto do sistema (melhor que Map<Sensor>) • Vantagem: código mais fácil de entender e manter; controle da interface • Se a interface de Map mudar, seu impacto no sistema será mínimo 14
  • 13. • APIs evoluem longo do tempo • Mas devem evoluir com cautela, pois possuem clientes 16 Quebra de Contrato de APIs
  • 14. • 28% de 500K alterações de APIs quebram compatibilidade • Por sistema: 14.78% Historical and Impact Analysis of API Breaking Changes: A Large Scale Study. SANER, 2017. 18 Quebra de Contrato de APIs
  • 15. 19 Quebra de Contrato de APIs: Razões Why and How Java Developers Break APIs. SANER,2018.
  • 17. Testes de Unidade • Código de teste é tão importante quanto de produção • Devem ser projetados e mantidos • Garante que alterações não quebram o código existente • Com testes: código se mantém flexível, pois facilita alterações; sistema pode ser melhorado • Sem testes: alteração é uma possível fonte de bugs 21
  • 18. Teste Limpo • O que torna o teste limpo? • O mesmo que torna qualquer código limpo: • Legibilidade • Simplicidade • … 22
  • 19. Um conceito por teste • Outra diretriz determina que cada método de teste deve ter apenas um conceito • Objetivo: criar métodos focados e evitar método longos 39
  • 20. FIRST • Fast: testes devem ser rápidos; rodar frequentemente • Independent: testes não devem depender de outros; para evitar efeito cascata (se um falha, outros falham) • Repeatable: testes devem ser repetíveis em qualquer ambiente (produção e laptop), em qualquer ordem; rodar N vezes e obter o mesmo resultado • Self-Validating: testes devem ter saída boleana; ou passam ou falham (sem avaliação manual de logs) • Timely: testes devem ser escritos antes do código (TDD) 43
  • 21. Exercício • Apresente 3 características de um bom conjunto de testes de unidade (ex: ser legível) 42