SlideShare uma empresa Scribd logo
Porto Alegre, 4 de Dezembro de 2020
Sobre...
1. Conteúdo: Clean Code (Código Limpo)
2. Área/Foco: Qualidade de Software / Manutenção
3. Público alvo: Desenvolvedores
4. Conteúdo relacionado: Testabilidade, Refatoração
Organização: 42 Slides (+- 30 minutos)
Material de apoio desta apresentação:
https://github.com/siviotti/cleancode
Douglas Siviotti
Desenvolvedor há mais de 20 anos, analista de
sistemas, especialista em engenharia de software
pela UFRGS, pós graduando em direito do uso e
proteção de dados pessoais pela PUC-MG, trabalha
como arquiteto de software no SERPRO desde
2005 e com qualidade de software desde 2012.
Atualmente atua como especialista em proteção de
dados pessoais atuando no suporte, especificação
de produtos, construção de processos e geração de
cursos e conteúdos relacionados ao tema no blog
artesoftware.com.br e na plataforma Udemy.
CódigoCódigo
LimpoLimpo
escopoescopo
Clean Code (O Livro) formato da palestra
1 Código Limpo Regra do escoteiro, atitude do desenvolvedor
2 Nomes Significativos Classe=Substantivo, Método=verbo, Problema x Solução
3 Comentários (capítulo 4) São a última opção. Comentou, falhou em se expressar
4 Formatação (capítulo 5) Code style do projeto, formatação automática
5 Funções (capítulo 3) Pequenas (20 linhas), faz 1 coisa, 1 nível de abstração
6 Objetos e E. de Dados
7 Tratamento de Erro
8 Fronteiras (Limites)
9 Testes de Unidade
10 Classes
11 Sistemas Complexos
12 Simplicidade
13 Concorrência
14 Refinamento Sucessivo
15 Junit
16 Refatorando SerialDate
17 Smells e Heurísticas
Dica de “Clean Code”
Capítulos e Objetivos (Agenda) escopo
1 Código Limpo
2 Nomes Significativos
3 Comentários (capítulo 4)
4 Formatação (capítulo 5)
5 Funções (capítulo 3)
6 Objetos e E. de Dados
7 Tratamento de Erro
8 Fronteiras (Limites)
9 Testes de Unidade
10 Classes
11 Sistemas Complexos
12 Simplicidade
13 Concorrência
14 Refinamento Sucessivo
15 Junit
16 Refatorando SerialDate
17 Smells e Heurísticas
1 - Redução de Parâmetros
2 – Classe x Estrutura de Dados
3 – Usando “data class” do Kotlin
5 – Simulação do Jogo (versão Procedural)
7 – Classes Pequenas c/ 1 Respons.
8 – Baixo Acoplamento (versão OO)
0 – Introdução e o Problema do Jogo 5
3
5
7
5
59 – Código Mais Testável e Limpo
6 – Dificuldade de Testar (feedback)
4 – Simplicidade com Enuns
Pedra, Tesoura e Papel o problema
Tesoura
“S”
Papel
“P”
Pedra
“R”
Núcleo de Negócio o problema
Mão 1
Mão 2
Entrada Saída Resultado
Mão 1 Vence
Mão 2 Vence
Empata
Dica: Teste ensina
Dica: Evite “números mágicos” - use constantes
Capítulo 3Capítulo 3
FunçõesFunções
Proposições Sobre Funções capítulo 3
- Funções devem ser pequenas (<= 20 linhas)
- Funções devem fazer apenas uma coisa
- Devem ter nomes descritivos do que fazem
- Somente um nível de abstração por função
- Funções devem ter o mínimo de parâmetros
- Quanto mais funções puras, melhor
- Quanto mais autocontida mais fácil de testar
Complexidade Ciclomática 11
Complexidade Cognitiva 17
Redução de Parâmetros
- Redução de 2 para 1 parâmetro
- Objeto “Rodada” sempre tem mãos válidas e tem um estado válido
(checagem no construtor)
- Mais semântico: “rodada” é melhor que “primeira e segunda”
1 - Redução de Parâmetros
Objetos e EstruturasObjetos e Estruturas
de Dadosde Dados
Capítulo 6Capítulo 6
Proposições sobre Objetos e Estruturas de Dados capítulo 6
Os objetos usam abstrações para esconder seus
dados e expõem funções que operam sobre eles
Estruturas de dados expõem seus dados e não
possuem funções significativas (get/set = acessores)
- Objetos buscam o menor conhecimento
- Estruturas de dados (DTO) buscam imutabilidade
Classe “Rodada” capítulo 6
1
2
“Classe” ou “Estrutura de Dados”?
2 – Classe x Estrutura de Dados
3 – Usando “data class” do Kotlin
Capítulo 9Capítulo 9
Testes de UnidadeTestes de Unidade
Proposições sobre Testes de Unidade capítulo 9
- Teste de unidade dá feedback sobre o design
- O feedback deve chegar o quanto antes
- TDD é uma boa opção para tornar mais fácil
- Testes de unidade são atividade de construção
- Cobertura de testes provê confiança
- Refatoração sem cobertura pode ser uma aventura
- Teste também é código e deve ser limpo
Jogando “Pedra, Papel e Tesoura” capítulo 9
Requisitos do Melhor de 3 (Pedra, Papel e Tesoura)
1. Criar uma simulação de dois jogadores jogando “pedra, papel e
tesoura” por um número variável de rodadas (3, 5 etc).
2. O jogo deve parar se um jogador já for o vencedor antes da última
rodada (cenário de vitória antecipada).
3. Ao final deve ser indicado o vencedor (ou empate) e listados os
resultados de todas as rodadas.
Restrição: Usar o método “jogar” de PTP
Abstração sobre uma “Mão” ou Opção de Jogada 4 – Simplicidade com Enuns
●
Mais semântico
●
Evita “Ifs”
●
Evita usar Char (R,S e P)
●
Adiciona comportamento
(classe x estrut. de dados?)
● Método “vence” indica
quem vence entre duas
mãos quaisquer
●
Factory Method “of”
encapsula as letras da
função legada
Dica: “of” é legal!
Teste de Unidade como Termômetro 4 – Simplicidade com Enuns
●
Menos cenários de teste
graças ao método “vence”
●
Método “vence” muda a
semântica da pergunta de
quem vence: mais OO
●
Uma mão sabe se vence ou
não uma outra mão e não
um código externo a ela
●
Garantia e uso de R, P e S
internamente através de “of”
Abstração sobre o Resultado (-1,0,1) 4 – Simplicidade com Enuns
●
Mais semântico
●
Evita “Ifs”
●
Evita usar Int (-1, 0, 1)
●
Adiciona comportamento
(classe x estrut. de dados?)
●
Método “vence” indica
quem vence entre duas
mãos quaisquer
●
Factory Method “of”
encapsula os valores Int
da função legada
Dica: “of” é legal!
Simulação Procedural
5 – Simulação do Jogo (versão Procedural)
●
“Programa” de simulação
●
Não parametrizável
●
Faltou a “vitória antecipada”
●
Jogadores com nomes chapados no
código (Bill e Bob)
●
Inicialização, Lógica de negócio,
estado da simulação na mesma
classe (mais impressão)
●
Usa o método legado “jogar”
Restrição
Relembrando: Partes de um Teste de Unidade 6 – Dificuldade de Testar (feedback)
Como Testar a Simulação Procedural?
6 – Dificuldade de Testar (feedback)
●
Foi feito com TDD?
●
Dar “Run” é um teste?
●
Como testar um cenário controlado?
Ou seja, evitando a “mão” aleatória
●
Tá difícil criar um teste de unidade?
●
Precisa “torcer” o código pra testar?
Capítulo 10Capítulo 10
ClassesClasses
Proposições sobre Classes capítulo 10
- Classes devem ser pequenas
- Devem ter somente uma responsabilidade (SRP)
- Ter apenas um motivo para mudar
- Devem ter coesão interna*
* Poucas variáveis de instância
* Cada método manipula uma variável ou mais
- Devem encapsular seus dados ao máximo
- Devem ter baixo acoplamento a outras classes
Jogando “Pedra, Papel e Tesoura” capítulo 10
Requisitos do Melhor de 3 (Pedra, Papel e Tesoura)
1. Criar uma simulação de dois jogadores jogando “pedra, papel e
tesoura” por um número variável de rodadas (3, 5 etc).
2. O jogo deve parar se um jogador já for o vencedor antes da última
rodada (cenário de vitória antecipada).
3. Ao final deve ser indicado o vencedor (ou empate) e listados os
resultados de todas as rodadas.
Restrição: Usar o método “jogar” de PTP
Possível Solução Separando Responsabilidades
(PTP)
Jogo
Disputa
<Resultado>
Resultado
Simulação
7 – Classes Pequenas c/ 1 Respons.
Dica: nomes das classes são importantes
Classes e Suas Responsabilidades
(PTP)
Jogo
Disputa
Inicialização e Contexto
Conceito: 1 JogadorConceito: 1 Disputa
Conceito: O Jogo em si
Várias rodadas e resultado
Tem o “estado” do jogo
Código “Legado”: Lógica do jogo
Abstração sobre -1,0,1 Opções do Jogo: R, P e S
Simulacao
7 – Classes Pequenas c/ 1 Respons.
Classe Jogador: Representa um Jogador 7 – Classes Pequenas c/ 1 Respons.
É uma estrutura de dados?
Classe Disputa 7 – Classes Pequenas c/ 1 Respons.
Comportamento
Abstrato
Classe DisputaLegada (Usa a classe PTP) 7 – Classes Pequenas c/ 1 Respons.
Responsabilidade
Principal
Restrição:
Usar o método
“jogar” de PTP
Classe DisputaNova (Não Usa a classe PTP) 7 – Classes Pequenas c/ 1 Respons.
Responsabilidade
Principal
Substituição
da regra de
negócio
Classe Jogo: O Estado do Conjunto de Rodadas 7 – Classes Pequenas c/ 1 Respons.
Outro nível de
abstração (indireção)
Modelo com Duas Implementações de Disputa
(PTP)
Jogo
Disputa
Inicialização e Contexto
Conceito: 1 Jogador
Conceito: O Jogo em si
Várias rodadas e resultado
Tem o “estado” do jogo
Abstração sobre -1,0,1 Opções do Jogo: R, P e S
Simulacao
Conceito: 1 Disputa
DisputaNova DisputaLegada PTP
8 – Baixo Acoplamento (versão OO)
9 – Código Mais Testável e Limpo
Questões sobre Acoplamento 8 – Baixo Acoplamento (versão OO)
1.Jogo está acoplado no jogador? Quanto?
2.Jogo estava acoplado ao código legado PTP? Quem estava acoplado a PTP?
3.Jogador está acoplado a Resultado? A quem ele está acoplado?
4.Resultado e Mao estão acoplados ao que?
Questões sobre Acoplamento 8 – Baixo Acoplamento (versão OO)
1.Jogo está acoplado no jogador? Quanto?
Sim, através do retorno do método “getVencedor()” e indiretamente pela Disputa
2.Jogo estava acoplado ao código legado PTP? Quem estava acoplado a PTP?
Não. Apenas DisputaLegada estava acoplada à classe PTP.
3.Jogador está acoplado a Resultado? A quem ele está acoplado?
Não. Apenas Jogo e Disputa conhecem a classe Resultado.
4.Resultado e Mao estão acoplados ao que?
Nada, mas Resultado tem uma relação frágil com o retorno de PTP (-1,0,1).
Questões sobre Testabilidade e Manutenção
1. Qual é a melhor simulação: Simulacao ou SimulacaoProcedural?
2. Dá pra testar um Jogo sem mocar o Jogador?
3. Onde é definido quem vence? Onde está a regra de negócio principal?
4. O que acontece se PTP.jogar() passar a retornar 1 para vitória do primeiro, 2 para
vitória do segundo e 0 para empate?
5. O que acontece se a classe Disputa deixar de existir?
9 – Código Mais Testável e Limpo
técnica, treino e tempotécnica, treino e tempo
livros de arte não
fazem um artista
trabalho artesanal
mas profissional
Programação Funcional X Orientação a Objetos
41/41
1 42 3 5
Clean Code
para encerrar...
Obrigado!
Douglas Siviotti
douglas.siviotti@gmail.com
artesoftware.com.br
Prática
Curso sobre Clean Code na Udemy
https://www.udemy.com/course/clean-code-na-pratica/?referralCode=24F598EE94626485768C

Mais conteúdo relacionado

Mais procurados

UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
Anderson Ledo
 

Mais procurados (19)

Code Smells
Code SmellsCode Smells
Code Smells
 
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de AcessoUFCG.JCert Reunião 1 - Declarações e Controle de Acesso
UFCG.JCert Reunião 1 - Declarações e Controle de Acesso
 
TDC 2012 - Métricas de código na arquitetura
TDC 2012 - Métricas de código na arquiteturaTDC 2012 - Métricas de código na arquitetura
TDC 2012 - Métricas de código na arquitetura
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
POO - Aula 02 - Fatores de Qualidade de Software e Introdução ao Java
POO - Aula 02 -  Fatores de Qualidade de Software e Introdução ao JavaPOO - Aula 02 -  Fatores de Qualidade de Software e Introdução ao Java
POO - Aula 02 - Fatores de Qualidade de Software e Introdução ao Java
 
Treinamento TDD - Atech
Treinamento TDD - AtechTreinamento TDD - Atech
Treinamento TDD - Atech
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Ap algoritmosglauco
Ap algoritmosglaucoAp algoritmosglauco
Ap algoritmosglauco
 
Desenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeDesenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por teste
 
Programação defensiva
Programação defensivaProgramação defensiva
Programação defensiva
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
Fundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareFundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de Software
 
Algoritimo de threads
Algoritimo de threadsAlgoritimo de threads
Algoritimo de threads
 
FC-Logic
FC-LogicFC-Logic
FC-Logic
 
Semana 1: Programação como arte de resolver problemas, algoritmos e problema...
Semana  1: Programação como arte de resolver problemas, algoritmos e problema...Semana  1: Programação como arte de resolver problemas, algoritmos e problema...
Semana 1: Programação como arte de resolver problemas, algoritmos e problema...
 
Codificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadosCodificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcados
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 

Semelhante a tdc-2020-poa-pedra-tesoura-papel

Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012
Jorge Oleques
 
Jornada de Iniciação Científica 2008 - SumoCheckers & Dystopia Framework
Jornada de Iniciação Científica 2008 - SumoCheckers & Dystopia FrameworkJornada de Iniciação Científica 2008 - SumoCheckers & Dystopia Framework
Jornada de Iniciação Científica 2008 - SumoCheckers & Dystopia Framework
yankooliveira
 

Semelhante a tdc-2020-poa-pedra-tesoura-papel (20)

TDD - Prática com RSpec
TDD - Prática com RSpecTDD - Prática com RSpec
TDD - Prática com RSpec
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Frameworks Formais de Game Design.
Frameworks Formais de Game Design.Frameworks Formais de Game Design.
Frameworks Formais de Game Design.
 
CBSoft 2013 - Descrição dos Problemas (CbE)
CBSoft 2013 - Descrição dos Problemas (CbE)CBSoft 2013 - Descrição dos Problemas (CbE)
CBSoft 2013 - Descrição dos Problemas (CbE)
 
Game programming
Game programmingGame programming
Game programming
 
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)
 
Game programming
Game programmingGame programming
Game programming
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Lógica de programação e algoritmos
Lógica de programação e algoritmosLógica de programação e algoritmos
Lógica de programação e algoritmos
 
GDG DevFest Norte 2016 - Testando Jogos: Passe o dia jogando e ainda receba p...
GDG DevFest Norte 2016 - Testando Jogos: Passe o dia jogando e ainda receba p...GDG DevFest Norte 2016 - Testando Jogos: Passe o dia jogando e ainda receba p...
GDG DevFest Norte 2016 - Testando Jogos: Passe o dia jogando e ainda receba p...
 
Inteligência Artificial na Prática
Inteligência Artificial na PráticaInteligência Artificial na Prática
Inteligência Artificial na Prática
 
Estrategia. windows 7
Estrategia. windows 7Estrategia. windows 7
Estrategia. windows 7
 
Cp game design
Cp game designCp game design
Cp game design
 
Pep 8
Pep 8Pep 8
Pep 8
 
Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012
 
Big data
Big dataBig data
Big data
 
Rumo à Certificação PHP
Rumo à Certificação PHPRumo à Certificação PHP
Rumo à Certificação PHP
 
Jornada de Iniciação Científica 2008 - SumoCheckers & Dystopia Framework
Jornada de Iniciação Científica 2008 - SumoCheckers & Dystopia FrameworkJornada de Iniciação Científica 2008 - SumoCheckers & Dystopia Framework
Jornada de Iniciação Científica 2008 - SumoCheckers & Dystopia Framework
 
Carreira de TIi
Carreira de TIiCarreira de TIi
Carreira de TIi
 
Palestra - Introdução ao desenvolvimento de Jogos
Palestra - Introdução ao desenvolvimento de JogosPalestra - Introdução ao desenvolvimento de Jogos
Palestra - Introdução ao desenvolvimento de Jogos
 

Mais de Douglas Siviotti

Mais de Douglas Siviotti (14)

tdc-2023-bh-ciclomatica-ou-cognitiva.pdf
tdc-2023-bh-ciclomatica-ou-cognitiva.pdftdc-2023-bh-ciclomatica-ou-cognitiva.pdf
tdc-2023-bh-ciclomatica-ou-cognitiva.pdf
 
tdc-2022-poa-quem-tem-medo-low-code.pdf
tdc-2022-poa-quem-tem-medo-low-code.pdftdc-2022-poa-quem-tem-medo-low-code.pdf
tdc-2022-poa-quem-tem-medo-low-code.pdf
 
tdc-2022-poa-lgpd-metaverso.pdf
tdc-2022-poa-lgpd-metaverso.pdftdc-2022-poa-lgpd-metaverso.pdf
tdc-2022-poa-lgpd-metaverso.pdf
 
TDC Future 2021 - Privacy After Design
TDC Future 2021 - Privacy After DesignTDC Future 2021 - Privacy After Design
TDC Future 2021 - Privacy After Design
 
TDC Connections 2021 Artigo 37 da LGPD
TDC Connections 2021 Artigo 37 da LGPDTDC Connections 2021 Artigo 37 da LGPD
TDC Connections 2021 Artigo 37 da LGPD
 
Como o SERPRO Atende os Direitos dos Titulares
Como o SERPRO Atende os Direitos dos TitularesComo o SERPRO Atende os Direitos dos Titulares
Como o SERPRO Atende os Direitos dos Titulares
 
Tdc 2021-innovation-lgpd-dados-pessoais
Tdc 2021-innovation-lgpd-dados-pessoaisTdc 2021-innovation-lgpd-dados-pessoais
Tdc 2021-innovation-lgpd-dados-pessoais
 
Artesoftware Explicando LGPD
Artesoftware Explicando LGPDArtesoftware Explicando LGPD
Artesoftware Explicando LGPD
 
Tdc 2020-poa-data-protection-full-stack
Tdc 2020-poa-data-protection-full-stackTdc 2020-poa-data-protection-full-stack
Tdc 2020-poa-data-protection-full-stack
 
tdc-recife-2020-lgpd-para-desenvolvedores
tdc-recife-2020-lgpd-para-desenvolvedorestdc-recife-2020-lgpd-para-desenvolvedores
tdc-recife-2020-lgpd-para-desenvolvedores
 
Privacidade By Design no Ciclo de Vida do Produto
Privacidade By Design no Ciclo de Vida do ProdutoPrivacidade By Design no Ciclo de Vida do Produto
Privacidade By Design no Ciclo de Vida do Produto
 
Privacidade By Design
Privacidade By DesignPrivacidade By Design
Privacidade By Design
 
LGPD Lei Geral de Proteção de Dados Pessoais
LGPD Lei Geral de Proteção de Dados PessoaisLGPD Lei Geral de Proteção de Dados Pessoais
LGPD Lei Geral de Proteção de Dados Pessoais
 
Negócio Escrito em Código
Negócio Escrito em CódigoNegócio Escrito em Código
Negócio Escrito em Código
 

tdc-2020-poa-pedra-tesoura-papel

  • 1. Porto Alegre, 4 de Dezembro de 2020
  • 2. Sobre... 1. Conteúdo: Clean Code (Código Limpo) 2. Área/Foco: Qualidade de Software / Manutenção 3. Público alvo: Desenvolvedores 4. Conteúdo relacionado: Testabilidade, Refatoração Organização: 42 Slides (+- 30 minutos) Material de apoio desta apresentação: https://github.com/siviotti/cleancode Douglas Siviotti Desenvolvedor há mais de 20 anos, analista de sistemas, especialista em engenharia de software pela UFRGS, pós graduando em direito do uso e proteção de dados pessoais pela PUC-MG, trabalha como arquiteto de software no SERPRO desde 2005 e com qualidade de software desde 2012. Atualmente atua como especialista em proteção de dados pessoais atuando no suporte, especificação de produtos, construção de processos e geração de cursos e conteúdos relacionados ao tema no blog artesoftware.com.br e na plataforma Udemy.
  • 4. Clean Code (O Livro) formato da palestra 1 Código Limpo Regra do escoteiro, atitude do desenvolvedor 2 Nomes Significativos Classe=Substantivo, Método=verbo, Problema x Solução 3 Comentários (capítulo 4) São a última opção. Comentou, falhou em se expressar 4 Formatação (capítulo 5) Code style do projeto, formatação automática 5 Funções (capítulo 3) Pequenas (20 linhas), faz 1 coisa, 1 nível de abstração 6 Objetos e E. de Dados 7 Tratamento de Erro 8 Fronteiras (Limites) 9 Testes de Unidade 10 Classes 11 Sistemas Complexos 12 Simplicidade 13 Concorrência 14 Refinamento Sucessivo 15 Junit 16 Refatorando SerialDate 17 Smells e Heurísticas Dica de “Clean Code”
  • 5. Capítulos e Objetivos (Agenda) escopo 1 Código Limpo 2 Nomes Significativos 3 Comentários (capítulo 4) 4 Formatação (capítulo 5) 5 Funções (capítulo 3) 6 Objetos e E. de Dados 7 Tratamento de Erro 8 Fronteiras (Limites) 9 Testes de Unidade 10 Classes 11 Sistemas Complexos 12 Simplicidade 13 Concorrência 14 Refinamento Sucessivo 15 Junit 16 Refatorando SerialDate 17 Smells e Heurísticas 1 - Redução de Parâmetros 2 – Classe x Estrutura de Dados 3 – Usando “data class” do Kotlin 5 – Simulação do Jogo (versão Procedural) 7 – Classes Pequenas c/ 1 Respons. 8 – Baixo Acoplamento (versão OO) 0 – Introdução e o Problema do Jogo 5 3 5 7 5 59 – Código Mais Testável e Limpo 6 – Dificuldade de Testar (feedback) 4 – Simplicidade com Enuns
  • 6. Pedra, Tesoura e Papel o problema Tesoura “S” Papel “P” Pedra “R”
  • 7. Núcleo de Negócio o problema Mão 1 Mão 2 Entrada Saída Resultado Mão 1 Vence Mão 2 Vence Empata
  • 9. Dica: Evite “números mágicos” - use constantes
  • 10.
  • 12. Proposições Sobre Funções capítulo 3 - Funções devem ser pequenas (<= 20 linhas) - Funções devem fazer apenas uma coisa - Devem ter nomes descritivos do que fazem - Somente um nível de abstração por função - Funções devem ter o mínimo de parâmetros - Quanto mais funções puras, melhor - Quanto mais autocontida mais fácil de testar Complexidade Ciclomática 11 Complexidade Cognitiva 17
  • 13. Redução de Parâmetros - Redução de 2 para 1 parâmetro - Objeto “Rodada” sempre tem mãos válidas e tem um estado válido (checagem no construtor) - Mais semântico: “rodada” é melhor que “primeira e segunda” 1 - Redução de Parâmetros
  • 14. Objetos e EstruturasObjetos e Estruturas de Dadosde Dados Capítulo 6Capítulo 6
  • 15. Proposições sobre Objetos e Estruturas de Dados capítulo 6 Os objetos usam abstrações para esconder seus dados e expõem funções que operam sobre eles Estruturas de dados expõem seus dados e não possuem funções significativas (get/set = acessores) - Objetos buscam o menor conhecimento - Estruturas de dados (DTO) buscam imutabilidade
  • 16. Classe “Rodada” capítulo 6 1 2 “Classe” ou “Estrutura de Dados”? 2 – Classe x Estrutura de Dados 3 – Usando “data class” do Kotlin
  • 17. Capítulo 9Capítulo 9 Testes de UnidadeTestes de Unidade
  • 18. Proposições sobre Testes de Unidade capítulo 9 - Teste de unidade dá feedback sobre o design - O feedback deve chegar o quanto antes - TDD é uma boa opção para tornar mais fácil - Testes de unidade são atividade de construção - Cobertura de testes provê confiança - Refatoração sem cobertura pode ser uma aventura - Teste também é código e deve ser limpo
  • 19. Jogando “Pedra, Papel e Tesoura” capítulo 9 Requisitos do Melhor de 3 (Pedra, Papel e Tesoura) 1. Criar uma simulação de dois jogadores jogando “pedra, papel e tesoura” por um número variável de rodadas (3, 5 etc). 2. O jogo deve parar se um jogador já for o vencedor antes da última rodada (cenário de vitória antecipada). 3. Ao final deve ser indicado o vencedor (ou empate) e listados os resultados de todas as rodadas. Restrição: Usar o método “jogar” de PTP
  • 20. Abstração sobre uma “Mão” ou Opção de Jogada 4 – Simplicidade com Enuns ● Mais semântico ● Evita “Ifs” ● Evita usar Char (R,S e P) ● Adiciona comportamento (classe x estrut. de dados?) ● Método “vence” indica quem vence entre duas mãos quaisquer ● Factory Method “of” encapsula as letras da função legada Dica: “of” é legal!
  • 21. Teste de Unidade como Termômetro 4 – Simplicidade com Enuns ● Menos cenários de teste graças ao método “vence” ● Método “vence” muda a semântica da pergunta de quem vence: mais OO ● Uma mão sabe se vence ou não uma outra mão e não um código externo a ela ● Garantia e uso de R, P e S internamente através de “of”
  • 22. Abstração sobre o Resultado (-1,0,1) 4 – Simplicidade com Enuns ● Mais semântico ● Evita “Ifs” ● Evita usar Int (-1, 0, 1) ● Adiciona comportamento (classe x estrut. de dados?) ● Método “vence” indica quem vence entre duas mãos quaisquer ● Factory Method “of” encapsula os valores Int da função legada Dica: “of” é legal!
  • 23. Simulação Procedural 5 – Simulação do Jogo (versão Procedural) ● “Programa” de simulação ● Não parametrizável ● Faltou a “vitória antecipada” ● Jogadores com nomes chapados no código (Bill e Bob) ● Inicialização, Lógica de negócio, estado da simulação na mesma classe (mais impressão) ● Usa o método legado “jogar” Restrição
  • 24. Relembrando: Partes de um Teste de Unidade 6 – Dificuldade de Testar (feedback)
  • 25. Como Testar a Simulação Procedural? 6 – Dificuldade de Testar (feedback) ● Foi feito com TDD? ● Dar “Run” é um teste? ● Como testar um cenário controlado? Ou seja, evitando a “mão” aleatória ● Tá difícil criar um teste de unidade? ● Precisa “torcer” o código pra testar?
  • 27. Proposições sobre Classes capítulo 10 - Classes devem ser pequenas - Devem ter somente uma responsabilidade (SRP) - Ter apenas um motivo para mudar - Devem ter coesão interna* * Poucas variáveis de instância * Cada método manipula uma variável ou mais - Devem encapsular seus dados ao máximo - Devem ter baixo acoplamento a outras classes
  • 28. Jogando “Pedra, Papel e Tesoura” capítulo 10 Requisitos do Melhor de 3 (Pedra, Papel e Tesoura) 1. Criar uma simulação de dois jogadores jogando “pedra, papel e tesoura” por um número variável de rodadas (3, 5 etc). 2. O jogo deve parar se um jogador já for o vencedor antes da última rodada (cenário de vitória antecipada). 3. Ao final deve ser indicado o vencedor (ou empate) e listados os resultados de todas as rodadas. Restrição: Usar o método “jogar” de PTP
  • 29. Possível Solução Separando Responsabilidades (PTP) Jogo Disputa <Resultado> Resultado Simulação 7 – Classes Pequenas c/ 1 Respons. Dica: nomes das classes são importantes
  • 30. Classes e Suas Responsabilidades (PTP) Jogo Disputa Inicialização e Contexto Conceito: 1 JogadorConceito: 1 Disputa Conceito: O Jogo em si Várias rodadas e resultado Tem o “estado” do jogo Código “Legado”: Lógica do jogo Abstração sobre -1,0,1 Opções do Jogo: R, P e S Simulacao 7 – Classes Pequenas c/ 1 Respons.
  • 31. Classe Jogador: Representa um Jogador 7 – Classes Pequenas c/ 1 Respons. É uma estrutura de dados?
  • 32. Classe Disputa 7 – Classes Pequenas c/ 1 Respons. Comportamento Abstrato
  • 33. Classe DisputaLegada (Usa a classe PTP) 7 – Classes Pequenas c/ 1 Respons. Responsabilidade Principal Restrição: Usar o método “jogar” de PTP
  • 34. Classe DisputaNova (Não Usa a classe PTP) 7 – Classes Pequenas c/ 1 Respons. Responsabilidade Principal Substituição da regra de negócio
  • 35. Classe Jogo: O Estado do Conjunto de Rodadas 7 – Classes Pequenas c/ 1 Respons. Outro nível de abstração (indireção)
  • 36. Modelo com Duas Implementações de Disputa (PTP) Jogo Disputa Inicialização e Contexto Conceito: 1 Jogador Conceito: O Jogo em si Várias rodadas e resultado Tem o “estado” do jogo Abstração sobre -1,0,1 Opções do Jogo: R, P e S Simulacao Conceito: 1 Disputa DisputaNova DisputaLegada PTP 8 – Baixo Acoplamento (versão OO) 9 – Código Mais Testável e Limpo
  • 37. Questões sobre Acoplamento 8 – Baixo Acoplamento (versão OO) 1.Jogo está acoplado no jogador? Quanto? 2.Jogo estava acoplado ao código legado PTP? Quem estava acoplado a PTP? 3.Jogador está acoplado a Resultado? A quem ele está acoplado? 4.Resultado e Mao estão acoplados ao que?
  • 38. Questões sobre Acoplamento 8 – Baixo Acoplamento (versão OO) 1.Jogo está acoplado no jogador? Quanto? Sim, através do retorno do método “getVencedor()” e indiretamente pela Disputa 2.Jogo estava acoplado ao código legado PTP? Quem estava acoplado a PTP? Não. Apenas DisputaLegada estava acoplada à classe PTP. 3.Jogador está acoplado a Resultado? A quem ele está acoplado? Não. Apenas Jogo e Disputa conhecem a classe Resultado. 4.Resultado e Mao estão acoplados ao que? Nada, mas Resultado tem uma relação frágil com o retorno de PTP (-1,0,1).
  • 39. Questões sobre Testabilidade e Manutenção 1. Qual é a melhor simulação: Simulacao ou SimulacaoProcedural? 2. Dá pra testar um Jogo sem mocar o Jogador? 3. Onde é definido quem vence? Onde está a regra de negócio principal? 4. O que acontece se PTP.jogar() passar a retornar 1 para vitória do primeiro, 2 para vitória do segundo e 0 para empate? 5. O que acontece se a classe Disputa deixar de existir? 9 – Código Mais Testável e Limpo
  • 40. técnica, treino e tempotécnica, treino e tempo livros de arte não fazem um artista trabalho artesanal mas profissional
  • 41. Programação Funcional X Orientação a Objetos 41/41 1 42 3 5 Clean Code para encerrar... Obrigado! Douglas Siviotti douglas.siviotti@gmail.com artesoftware.com.br Prática Curso sobre Clean Code na Udemy https://www.udemy.com/course/clean-code-na-pratica/?referralCode=24F598EE94626485768C