Os 10
mandamento do
Rei do código!
Objects Calisthenics
Marcelo Siqueira
 @marcelosiqueira


marsiqueira

 +MarceloSiqueira
 marsiqueira
 marcelosiqueira

Programador PHP e
Python, Defensor de
Software Livre e
GNU/Linux, Empreendedor,
Nerd e tomador de cerveja!
Essa palestra foi baseado
nas palestras.
Guilherme Blanco
@guilhermeblanco

Object Calisthenics aplicado ao PHP

Essa palestra foi baseado
nas palestras.
Guilherme Blanco
@guilhermeblanco

Object Calisthenics aplicado ao PHP

Essa palestra foi baseado
nas palestras.
Rafael Dohms
@rdohms

Your code sucks, let's fix it!
Lembrete

Essa palestra irá falar
sobre qualidade de
códigos!
Então, vamos agregar!
Meu código
agrega valor?
É legível?

Meu código
agrega valor?
É legível?

Meu código
agrega valor?
É testável?
É fácil a manutenção?

É legível?

Meu código
agrega valor?
É testável?
É fácil a manutenção?

É legível?

Meu código
agrega valor?
É reusável?

É testável
O que acham disso?
Não agrega valor!
Então, como podemos
agregar no código?
Object Calisthenics
cal·is·then·ics - substantivo - /ˌkaləsˈTHeniks/
Termo derivado do grego: "exercício",
"exercício de relaxamento", "ginástica rítmica"

Object Calisthenics
cal·is·then·ics - substantivo - /ˌkaləsˈTHeniks/
Termo derivado do grego: "exercício",
"exercício de relaxamento", "ginástica rítmica"

Object Calisthenics
Uma variedade de exercícios simples e
rítmicos para alcançar melhor qualidade
de código e OO.
“Então aqui está um exercício
que pode ajudá-lo a
internalizar princípios de um
bom design orientado a
objeto e, na verdade, usá-las
na vida real.”

--Jeff Bay
“Então aqui está um exercício
que pode ajudá-lo a
Importante:
internalizar princípios de um
bom design
PHP != JAVA orientado a
Algumas adaptações devem ser feitas
objeto e, na verdade, usá-las
na vida real.”

--Jeff Bay
O OC são nove (9) orientações,
regras, mandamentos,
"bem" simples
e que podem ser utilizadas
em qualquer linguagem
orientada a objetos.
Mas para agregar mostraremos
10(dez) orientações, regras,
mandamentos.
O OC são nove (9) orientações,
regras, mandamentos,
"bem" simples
e que podem ser utilizadas
Repetindo:
em PHP é !=linguagem
qualquer JAVA
orientada a objetos.
Algumas adaptações devem ser feitas
Mas para agregar mostraremos
10(dez) orientações, regras,
mandamentos.
# 1 Mandamento
"Somente um nível de
indentação por método"
método"
# 1 Mandamento
"Somente um nível de
indentação por método"
método"
Neologismo derivado da palavra inglesa
"indentation", que significa "recuo".
0
1

2
3
0
1

2
3
Espaço em branco
Espaço em branco

Logica duplicada
0
1

2
0
1

2
IF de uma linha, operação simples
Return rápido

IF de uma linha, operação simples
Return rápido

IF de uma linha, operação simples

Função nativa C, mais rápida.
Sempre podemos melhorar!
Interação rápida

Método reusável
Interação rápida

Retorno aceitável: expectativa/retorno

Método reusável
Interação rápida

Retorno aceitável: expectativa/retorno

Método reusável

Método matches, resultado “true”
#1 Mandamento
Somente um nível de indentação/recuo por método

Benefícios:
– Maior coesão;
– Reduz a complexidade ciclomática;
– Métodos acabam fazendo apenas uma coisa,
como deve ser;
– Aumenta a reusabilidade.
# 2 Mandamento
"Não utilize a
palavra-chave 'else'"
'else'"
Variável intermediária

Variável intermediária
Intermediária removida

Retorno rápido
#2 Mandamento
Não utilize a palavra-chave 'else'

Benefícios:
– Ajuda a prevenir duplicação de código;
– Reduz a complexidade ciclomática;
– Faz o código ficar mais limpo, passando por um
único caminho.
Adaptada

# 3 Mandamento
"Encapsule os tipos
primitivos e strings"
* se eles possuírem
comportamento
Operação incorreta
Operação incorreta
Agora pode encapsular todas as
operações relacionadas com a animação
Adaptada

#3 Mandamento
Encapsule os tipos primitivos e strings
* se eles possuírem comportamento

Benefícios:
– Ajuda a identificar o que deve ser um objeto;
– Indução de Tipo;
– Encapsulamento de operações.
Adaptada

# 4 Mandamento
"Somente um ponto
(“arrow” para o PHP) por
linha"
* cadeia getter ou uma
interface fluente
propriedades são mais difíceis de testar

Sem espaço em branco
Interface fluente
Interface fluente

Operadores alinhados
Interface fluente

Operadores alinhados

Somente geters (nenhuma operação)
Adaptada

#4 Mandamento
Somente um ponto (“arrow” para o PHP) por linha
* cadeia getter ou uma interface fluente

Benefícios:
– Legibilidade;
– Construção de testes facilitada (mocks);
– Mais fácil para depurar.
# 5 Madamento
"Não abreviar"
Por que você abrevia?
– Preguiça de escrever o mesmo
nome várias vezes...
• Talvez isso indique duplicidade de
código!
- Preguiça de escrever o nome do
método muito longo...
• Talvez isso indique que o seu
método faz mais de uma coisa. Isso
deve ser separado em vários
métodos ou até classes!
Mais do que uma responsabilidade?
Mais do que uma responsabilidade?

começa a partir de onde?
Mais do que uma responsabilidade?

começa a partir de onde?

Use nomes mais claras:
fetchPage()
downloadPage()
Mais do que uma responsabilidade?

começa a partir de onde?

Use nomes mais claras:
fetchPage()
downloadPage()

Use um dicionário:
fork, create, begin, open
Mais do que uma responsabilidade?

começa a partir de onde?

Use nomes mais claras:
fetchPage()
downloadPage()

Use um dicionário:
fork, create, begin, open
Linha de tabela?
#5 Mandamento
Não abreviar

Benefícios:
– Comunicação mais clara;
– Facilita a busca por problemas ocultos.
Adaptada

# 6 Mandamento
"Mantenha suas classes
"Mantenha
pequenas"
pequenas"
Regra original:
– 50 linhas por classe.
– 200 linhas por classe (para incluir
os blocos de documentação);
– 10 metodos por classes;
classes;
– 15 classes por
pacote/namespace/pasta;
– De 15 a 20 linhas por método.
Adaptada
#6 Mandamento
Mantenha suas classes pequenas

Benefícios:
– Responsabilidade única;
– Métodos objetivos;
– Pacotes/namespaces mais enxutos.
Adaptada

# 7 Mandamento
"Limite o número das
variáveis de instância
(máximo 5)"
5)"
Adapted

Limitar em 5
Adaptada
#7 Mandamento
Limite o número das variáveis de instância (2 para 5)

Benefícios:
– Lista reduzida de dependências;
– Mais fácil para fazer Mocking para testes.
# 8 Mandamento
"Use coleções de primeiro
nível"
Doctrine:
ArrayCollection
• Qualquer classe que contenha uma coleção
(ou tenha esse propósito), não deve conter
outras propriedades;
• Encapsulamento de coleções primitivas
(arrays);
• Utilização de Interfaces Orientadas a
Objetos:
– Collections do Java;
– SPL do PHP.
#8 Mandamento
Use coleções de primeiro nível

Benefícios:
– É possível implementar operações em coleções;
– Utilizar métodos já existentes em interfaces
pré-definidas.
Adaptada

# 9 Mandamento
"Não use métodos
getter/setter"
getter/setter"
* Use para propriedades
no código PHP
●

Muitos frameworks utilizam os
métodos getters e setters para
inicializar variáveis, reduzindo código e
evitando erros desnecessários.

●

Não coloque nenhum tipo de regra de
negócio nos getters e setters.
Adaptada

#9 Mandamento
Não use métodos getter/setter
* Use para propriedades no código PHP

Benefícios:
– Operações de injetor ;
– Encapsulamento das transformações.
Criada

# 10 Mandamento
"Documente seu código!"
código!
Mais do que uma responsabilidade?

começa a partir de onde?

Use nomes mais claras:
fetchPage()
downloadPage()

Use um dicionário:
fork, create, begin, open
Linha de tabela?
Uma nota sobre o custo
de execução da função

Marca todo para que não
se perca nas mudanças

Documentação gerada pela
API do phpDocumentor
#10 Mandamento
Documente seu código!
código!

Benefícios:
– Documentação automática por API;
– Transmissão de "linha de pensamento";
– Evita confusões.
Recaptulando:
#1. Somente um nível de indentação por método;
#2. Não utilize a palavra-chave 'eles';
'eles';
#3. Encapsule os tipos primitivos e strings;
#4. Somente um ponto por linha;
linha;
#5. Não abreviar;
#6. Mantenha suas classes pequenas
#7. Limite número das variáveis de instância (máximo 5);
#8. Use coleções de primeiro nível;
#9. Use métodos getter/setter;
getter/setter;
#10. Documente seu código.
Perguntas?
 @marcelosiqueira


marsiqueira

 +MarceloSiqueira
 marsiqueira
 marcelosiqueira
 eu@marcelosiqueira.com.br
eu@marcelosiqueira.com.br

Obrigado!

Objects calisthenics - Os 10 mandamentos do rei do código