O documento apresenta 10 mandamentos do Object Calisthenics, uma abordagem para melhorar a qualidade do código orientado a objetos através de exercícios simples. Os mandamentos incluem: somente um nível de indentação por método, não usar a palavra-chave "else", encapsular tipos primitivos e strings, somente um ponto por linha, não abreviar nomes, manter classes pequenas, limitar variáveis de instância, usar coleções de primeiro nível, usar métodos getter/setter de forma adequada e documentar o código. A aplicação desses princípi
17. cal·is·then·ics - substantivo - /ˌkaləsˈTHeniks/
Termo derivado do grego: "exercício",
"exercício de relaxamento", "ginástica rítmica"
Object Calisthenics
18. 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.
19. “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
20. “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
21. 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.
22. 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.
40. #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.
48. #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.
54. 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.
61. 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.
66. – Preguiça de escrever o mesmo
nome várias vezes...
• Talvez isso indique duplicidade de
código!
67. - 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!
69. Mais do que uma responsabilidade?
começa a partir de onde?
70. Mais do que uma responsabilidade?
começa a partir de onde?
Use nomes mais claras:
fetchPage()
downloadPage()
71. 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
72. 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?
76. – 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.
77. Adaptada
#6 Mandamento
Mantenha suas classes pequenas
Benefícios:
– Responsabilidade única;
– Métodos objetivos;
– Pacotes/namespaces mais enxutos.
80. 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.
83. • 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.
84. #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.
87. ●
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.
88. 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.
90. 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?
91. 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
92. #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.
93. 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.