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

Object calisthenics