SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
Object Calisthenics
Conjunto de dicas para melhorar o seu design de código
O porquê
Seu primeiro dia em um projeto novo, uma calculadora de salários !
Objetivo:
- integrar com um sistema legado, dando manutenção nele se
necessário
- garantir que tudo está ok e bem testado
O porquê
O porquê
O porquê
O porquê
● Difícil de entender
O porquê
● Difícil de entender
● Testar
O porquê
● Difícil de entender
● Testar
● Dar manutenção
O porquê
● Difícil de entender
● Testar
● Dar manutenção
O porquê
● Difícil de entender
● Testar
● Dar manutenção
"Programe como se a pessoa que for dar
manutenção do seu código fosse um psicopata
violento que sabe onde você vive."
Anônimo
Object Calisthenics
Um conjunto de exercícios de programação
descritos por Jeff Bay, formalizado em 9 regras
Visam melhorar o código em 4 pontos:
● Manutenção
● Leitura
● Testabilidade
● Compreensão
Ou expandindo...
1. Coesão
2. Baixo acoplamento
3. Sem redundância
4. Encapsulamento
5. Testabilidade
6. Legibilidade
7. Foco
Quais são as regras?
1. Um nível de indentação por
método
2. Não usar else
3. Encapsular tipos primitivos
4. Encapsular coleções em classes
5. Um ponto por linha
6. Evitar abreviações
7. Manter as entidades pequenas
8. Não ter mais de duas variáveis de
instância por classe
9. Não usar getters / setters
Mas antes...
Um nível de indentação por método
Camadas de indentação
X
Leitura
Um nível de indentação por método
Camadas de indentação
X
Leitura
Um nível de indentação por método
Camadas de indentação
X
Leitura
Um nível de indentação por método
#callback hell
Código extraído de http://callbackhell.com/
Um nível de indentação por método
#callback hell
Código extraído de http://callbackhell.com/
Um nível de indentação por método
#callback hell
Código extraído de http://callbackhell.com/
Não usar else
Repete o mesmo problema de legibilidade da última regra
Aumenta o fator de ramificação do código (aumentando a
complexidade dos testes)
Não usar else
Não usar else
Não usar else
Não usar else
Não usar else
Encapsular tipos primitivos
● Alguns tipos podem ter comportamentos que valem a pena ser
capturados
● Value Objects X Entidades
● Evita o code smell "Primitive Obsession"
Encapsular tipos primitivos
X
Encapsular coleções em classes
Encapsular coleções em classes
Um ponto por linha
Não é válido para Fluent Interfaces ou Method Chaining (exemplo: chai)
Em outros casos:
● Múltiplos encadeamentos podem indicar múltiplas responsabilidades
● "Fale com seus amigos próximos, não fale com estranhos"
● "Cannot read property of undefined / null"
Um ponto por linha
Dilema: Open/Closed
Uma classe deve ser aberta a extensão, mas fechadas a mudanças
Um ponto por linha
Evitar abreviações
Por que abreviar?
Abreviações "ocultam" palavras e podem ocultar problemas
E os termos de domínio?
Evitar abreviações
Evitar abreviações
?
Evitar abreviações
!
Evitar abreviações
Manter as entidades pequenas
Tentar manter as funções / arquivos em um número
pequeno de linhas (50 ~ 100 linhas)
Manter uma responsabilidade por arquivo
Manter as entidades pequenas
SFA (Single File Application)
Manter as entidades pequenas
SFA (Single File Application)
1
2
2
1
Não ter + de 2 vars de instância p/ classe
Controlar a variação de estados de um objeto / componente
Evitar um grande número de dependências dentro de uma classe / entidade
Não usar getters / setters
#Polêmica
Não usar getters / setters
#Polêmica
Não usar getters / setters
#Polêmica
vs "Tell don't ask"
Não usar getters / setters
Não usar getters / setters
Termina aqui?
● SOLID
● Design Patterns
● Domain Driven Design
● Clean Code
● etc...
Referências
● https://pragprog.com/titles/twa/thoughtworks-anthology
● https://williamdurand.fr/2013/06/03/object-calisthenics/
● https://blog.neoassist.com/object-calisthenics-9-regras-para-aperfeicoar-seus-codigos/
● https://github.com/bennadel/Object-Calisthenics
● https://www.slideshare.net/rdohms/your-code-sucks-lets-fix-it-15471808
● https://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
● https://sourcemaking.com/refactoring
Obrigado!
danielbpdias@gmail.com
http://github.com/danielbdias

Mais conteúdo relacionado

Mais procurados

Aula 31 certificação
Aula 31 certificaçãoAula 31 certificação
Aula 31 certificaçãoJolvani Morgan
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In TubaRafael Paz
 
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
 
5 dicas para melhorar a legibilidade de código dos testes automáticos
5 dicas para melhorar a legibilidade de código dos testes automáticos 5 dicas para melhorar a legibilidade de código dos testes automáticos
5 dicas para melhorar a legibilidade de código dos testes automáticos Ariane Izac
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Programe a eficácia do seu código
Programe a eficácia do seu códigoPrograme a eficácia do seu código
Programe a eficácia do seu códigoAna Claudia Nogueira
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfAndreCosta502039
 
Curso de logica de programação aula 1com imagens
Curso de logica de programação aula 1com imagensCurso de logica de programação aula 1com imagens
Curso de logica de programação aula 1com imagensAntonio Tadeu Segat
 
SOLID Os princípios da linguagem orientada a objeto
SOLID Os princípios da linguagem orientada a objetoSOLID Os princípios da linguagem orientada a objeto
SOLID Os princípios da linguagem orientada a objetoAlberto Monteiro
 
Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012Jorge Oleques
 
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...Thiago Barradas
 
Tratamento de exceção em java
Tratamento de exceção em javaTratamento de exceção em java
Tratamento de exceção em javaMarques Amaro
 

Mais procurados (20)

Aplicando SOLID com PHP7
Aplicando SOLID com PHP7Aplicando SOLID com PHP7
Aplicando SOLID com PHP7
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Aula 31 certificação
Aula 31 certificaçãoAula 31 certificação
Aula 31 certificação
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Clean code
Clean codeClean code
Clean code
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
Php, por onde começar
Php, por onde começar Php, por onde começar
Php, por onde começar
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
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 )
 
5 dicas para melhorar a legibilidade de código dos testes automáticos
5 dicas para melhorar a legibilidade de código dos testes automáticos 5 dicas para melhorar a legibilidade de código dos testes automáticos
5 dicas para melhorar a legibilidade de código dos testes automáticos
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Ruby
RubyRuby
Ruby
 
Programe a eficácia do seu código
Programe a eficácia do seu códigoPrograme a eficácia do seu código
Programe a eficácia do seu código
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
 
Curso de logica de programação aula 1com imagens
Curso de logica de programação aula 1com imagensCurso de logica de programação aula 1com imagens
Curso de logica de programação aula 1com imagens
 
SOLID Os princípios da linguagem orientada a objeto
SOLID Os princípios da linguagem orientada a objetoSOLID Os princípios da linguagem orientada a objeto
SOLID Os princípios da linguagem orientada a objeto
 
Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012
 
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
 
Tratamento de exceção em java
Tratamento de exceção em javaTratamento de exceção em java
Tratamento de exceção em java
 
Solid
SolidSolid
Solid
 

Semelhante a Object calisthenics

Programação Pragmática
Programação PragmáticaProgramação Pragmática
Programação Pragmáticaelliando dias
 
Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7Inael Rodrigues
 
Boas práticas com TDD
Boas práticas com TDD Boas práticas com TDD
Boas práticas com TDD Camilo Lopes
 
O Programador Pragmático
O Programador PragmáticoO Programador Pragmático
O Programador PragmáticoTadeu Marinho
 
Livro Código limpo: Classes
Livro Código limpo:  ClassesLivro Código limpo:  Classes
Livro Código limpo: ClassesInael Rodrigues
 
Lapidando código ruby com Object Calisthenics
Lapidando código ruby com Object CalisthenicsLapidando código ruby com Object Calisthenics
Lapidando código ruby com Object CalisthenicsCarlos Eduardo Lima
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisAna Paula Gomes
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 
5 meses de python o que aprendi
5 meses de python  o que aprendi5 meses de python  o que aprendi
5 meses de python o que aprendiVinta Software
 
Test driven development
Test driven developmentTest driven development
Test driven developmentclauvane1708
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
Seja um júnior não seja um sobrinho
Seja um júnior não seja um sobrinhoSeja um júnior não seja um sobrinho
Seja um júnior não seja um sobrinhoAlexandre Andrade
 

Semelhante a Object calisthenics (20)

PHP Além da universidade
PHP Além da universidadePHP Além da universidade
PHP Além da universidade
 
Clean code
Clean codeClean code
Clean code
 
Programação Pragmática
Programação PragmáticaProgramação Pragmática
Programação Pragmática
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7Livro Código Limpo: Tratamento de Erros - Cap 7
Livro Código Limpo: Tratamento de Erros - Cap 7
 
Boas práticas com TDD
Boas práticas com TDD Boas práticas com TDD
Boas práticas com TDD
 
Codigo limpo.pptx
Codigo limpo.pptxCodigo limpo.pptx
Codigo limpo.pptx
 
O Programador Pragmático
O Programador PragmáticoO Programador Pragmático
O Programador Pragmático
 
Refatoração de Código Legado
Refatoração de Código LegadoRefatoração de Código Legado
Refatoração de Código Legado
 
Livro Código limpo: Classes
Livro Código limpo:  ClassesLivro Código limpo:  Classes
Livro Código limpo: Classes
 
Lapidando código ruby com Object Calisthenics
Lapidando código ruby com Object CalisthenicsLapidando código ruby com Object Calisthenics
Lapidando código ruby com Object Calisthenics
 
Clean code part 2
Clean code   part 2Clean code   part 2
Clean code part 2
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e mais
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
5 meses de python o que aprendi
5 meses de python  o que aprendi5 meses de python  o que aprendi
5 meses de python o que aprendi
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Test First, TDD e outros Bichos
Test First, TDD e outros BichosTest First, TDD e outros Bichos
Test First, TDD e outros Bichos
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
Seja um júnior não seja um sobrinho
Seja um júnior não seja um sobrinhoSeja um júnior não seja um sobrinho
Seja um júnior não seja um sobrinho
 

Mais de Daniel Baptista Dias

AWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS LambdaAWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS LambdaDaniel Baptista Dias
 
De 0 ao infinito - Evoluindo um aplicativo Node.js em produção
De 0 ao infinito - Evoluindo um aplicativo Node.js em produçãoDe 0 ao infinito - Evoluindo um aplicativo Node.js em produção
De 0 ao infinito - Evoluindo um aplicativo Node.js em produçãoDaniel Baptista Dias
 
Sistemas distribuídos - uma introdução
Sistemas distribuídos - uma introduçãoSistemas distribuídos - uma introdução
Sistemas distribuídos - uma introduçãoDaniel Baptista Dias
 
Microserviços: uma introdução
Microserviços: uma introduçãoMicroserviços: uma introdução
Microserviços: uma introduçãoDaniel Baptista Dias
 
TDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS LambdaTDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS LambdaDaniel Baptista Dias
 
Domain Driven Design: como modelar uma aplicação em Node.js com DDD
Domain Driven Design: como modelar uma aplicação em Node.js com DDDDomain Driven Design: como modelar uma aplicação em Node.js com DDD
Domain Driven Design: como modelar uma aplicação em Node.js com DDDDaniel Baptista Dias
 
Domain Driven Design - Uma introdução
Domain Driven Design - Uma introduçãoDomain Driven Design - Uma introdução
Domain Driven Design - Uma introduçãoDaniel Baptista Dias
 
Processamento de dados com Node.js, AWS Lambda e Kinesis Streams
Processamento de dados com Node.js, AWS Lambda e Kinesis StreamsProcessamento de dados com Node.js, AWS Lambda e Kinesis Streams
Processamento de dados com Node.js, AWS Lambda e Kinesis StreamsDaniel Baptista Dias
 
Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...
Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...
Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...Daniel Baptista Dias
 
Planejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDP
Planejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDPPlanejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDP
Planejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDPDaniel Baptista Dias
 

Mais de Daniel Baptista Dias (14)

AWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS LambdaAWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
AWS Meetup - Processando dados em alta escala com Node.js e AWS Lambda
 
De 0 ao infinito - Evoluindo um aplicativo Node.js em produção
De 0 ao infinito - Evoluindo um aplicativo Node.js em produçãoDe 0 ao infinito - Evoluindo um aplicativo Node.js em produção
De 0 ao infinito - Evoluindo um aplicativo Node.js em produção
 
Sistemas distribuídos - uma introdução
Sistemas distribuídos - uma introduçãoSistemas distribuídos - uma introdução
Sistemas distribuídos - uma introdução
 
Domain Driven Design Tático
Domain Driven Design TáticoDomain Driven Design Tático
Domain Driven Design Tático
 
Microserviços: uma introdução
Microserviços: uma introduçãoMicroserviços: uma introdução
Microserviços: uma introdução
 
Microservices: an introduction
Microservices: an introductionMicroservices: an introduction
Microservices: an introduction
 
Serverless API
Serverless APIServerless API
Serverless API
 
TDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS LambdaTDC - Processamento de dados em alta escala com Node.js e AWS Lambda
TDC - Processamento de dados em alta escala com Node.js e AWS Lambda
 
Domain Driven Design: como modelar uma aplicação em Node.js com DDD
Domain Driven Design: como modelar uma aplicação em Node.js com DDDDomain Driven Design: como modelar uma aplicação em Node.js com DDD
Domain Driven Design: como modelar uma aplicação em Node.js com DDD
 
Domain Driven Design - Uma introdução
Domain Driven Design - Uma introduçãoDomain Driven Design - Uma introdução
Domain Driven Design - Uma introdução
 
Processamento de dados com Node.js, AWS Lambda e Kinesis Streams
Processamento de dados com Node.js, AWS Lambda e Kinesis StreamsProcessamento de dados com Node.js, AWS Lambda e Kinesis Streams
Processamento de dados com Node.js, AWS Lambda e Kinesis Streams
 
Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...
Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...
Programação dinâmica em tempo real para Processos de Decisão Markovianos com ...
 
Iteração de política
Iteração de políticaIteração de política
Iteração de política
 
Planejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDP
Planejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDPPlanejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDP
Planejamento Probabilístico - Uma introdução aos MDPs e aos algoritmos IV e RTDP
 

Object calisthenics