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

marsiqueira

 +MarceloSiqueira
 marsiqueira
 marcelosiqueira

Programador PHP e
...
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 Do...
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ást...
cal·is·then·ics - substantivo - /ˌkaləsˈTHeniks/
Termo derivado do grego: "exercício",
"exercício de relaxamento", "ginást...
“Então aqui está um exercício
que pode ajudá-lo a
internalizar princípios de um
bom design orientado a
objeto e, na verdad...
“Então aqui está um exercício
que pode ajudá-lo a
Importante:
internalizar princípios de um
bom design
PHP != JAVA orienta...
O OC são nove (9) orientações,
regras, mandamentos,
"bem" simples
e que podem ser utilizadas
em qualquer linguagem
orienta...
O OC são nove (9) orientações,
regras, mandamentos,
"bem" simples
e que podem ser utilizadas
Repetindo:
em PHP é !=linguag...
# 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", q...
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át...
# 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 complexid...
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 i...
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íci...
# 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
...
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 dic...
Mais do que uma responsabilidade?

começa a partir de onde?

Use nomes mais claras:
fetchPage()
downloadPage()

Use um dic...
#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
paco...
Adaptada
#6 Mandamento
Mantenha suas classes pequenas

Benefícios:
– Responsabilidade única;
– Métodos objetivos;
– Pacote...
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...
# 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;
• Encapsulament...
#8 Mandamento
Use coleções de primeiro nível

Benefícios:
– É possível implementar operações em coleções;
– Utilizar métod...
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 d...
Adaptada

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

Benefícios:
– Operações de in...
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 dic...
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 ...
#10 Mandamento
Documente seu código!
código!

Benefícios:
– Documentação automática por API;
– Transmissão de "linha de pe...
Recaptulando:
#1. Somente um nível de indentação por método;
#2. Não utilize a palavra-chave 'eles';
'eles';
#3. Encapsule...
Perguntas?
 @marcelosiqueira


marsiqueira

 +MarceloSiqueira
 marsiqueira
 marcelosiqueira
 eu@marcelosiqueira.com....
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
Próximos SlideShares
Carregando em…5
×

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

481 visualizações

Publicada em

Objects Calisthenics são um conjunto de técnicas e regras que vão te ajudar a identificar áreas de problemas em seu código, e assim você irá escrever um código melhor, evitando armadilhas comuns.

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
481
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
7
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Os 10 mandamento do Rei do código! Objects Calisthenics
  2. 2. Marcelo Siqueira  @marcelosiqueira  marsiqueira  +MarceloSiqueira  marsiqueira  marcelosiqueira Programador PHP e Python, Defensor de Software Livre e GNU/Linux, Empreendedor, Nerd e tomador de cerveja!
  3. 3. Essa palestra foi baseado nas palestras.
  4. 4. Guilherme Blanco @guilhermeblanco Object Calisthenics aplicado ao PHP Essa palestra foi baseado nas palestras.
  5. 5. Guilherme Blanco @guilhermeblanco Object Calisthenics aplicado ao PHP Essa palestra foi baseado nas palestras. Rafael Dohms @rdohms Your code sucks, let's fix it!
  6. 6. Lembrete Essa palestra irá falar sobre qualidade de códigos! Então, vamos agregar!
  7. 7. Meu código agrega valor?
  8. 8. É legível? Meu código agrega valor?
  9. 9. É legível? Meu código agrega valor? É testável?
  10. 10. É fácil a manutenção? É legível? Meu código agrega valor? É testável?
  11. 11. É fácil a manutenção? É legível? Meu código agrega valor? É reusável? É testável
  12. 12. O que acham disso?
  13. 13. Não agrega valor!
  14. 14. Então, como podemos agregar no código?
  15. 15. Object Calisthenics
  16. 16. cal·is·then·ics - substantivo - /ˌkaləsˈTHeniks/ Termo derivado do grego: "exercício", "exercício de relaxamento", "ginástica rítmica" Object Calisthenics
  17. 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 Uma variedade de exercícios simples e rítmicos para alcançar melhor qualidade de código e OO.
  18. 18. “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
  19. 19. “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
  20. 20. 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.
  21. 21. 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.
  22. 22. # 1 Mandamento "Somente um nível de indentação por método" método"
  23. 23. # 1 Mandamento "Somente um nível de indentação por método" método" Neologismo derivado da palavra inglesa "indentation", que significa "recuo".
  24. 24. 0 1 2 3
  25. 25. 0 1 2 3
  26. 26. Espaço em branco
  27. 27. Espaço em branco Logica duplicada
  28. 28. 0 1 2
  29. 29. 0 1 2
  30. 30. IF de uma linha, operação simples
  31. 31. Return rápido IF de uma linha, operação simples
  32. 32. Return rápido IF de uma linha, operação simples Função nativa C, mais rápida.
  33. 33. Sempre podemos melhorar!
  34. 34. Interação rápida Método reusável
  35. 35. Interação rápida Retorno aceitável: expectativa/retorno Método reusável
  36. 36. Interação rápida Retorno aceitável: expectativa/retorno Método reusável Método matches, resultado “true”
  37. 37. #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.
  38. 38. # 2 Mandamento "Não utilize a palavra-chave 'else'" 'else'"
  39. 39. Variável intermediária Variável intermediária
  40. 40. Intermediária removida Retorno rápido
  41. 41. #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.
  42. 42. Adaptada # 3 Mandamento "Encapsule os tipos primitivos e strings" * se eles possuírem comportamento
  43. 43. Operação incorreta
  44. 44. Operação incorreta
  45. 45. Agora pode encapsular todas as operações relacionadas com a animação
  46. 46. 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.
  47. 47. Adaptada # 4 Mandamento "Somente um ponto (“arrow” para o PHP) por linha" * cadeia getter ou uma interface fluente
  48. 48. propriedades são mais difíceis de testar Sem espaço em branco
  49. 49. Interface fluente
  50. 50. Interface fluente Operadores alinhados
  51. 51. Interface fluente Operadores alinhados Somente geters (nenhuma operação)
  52. 52. 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.
  53. 53. # 5 Madamento "Não abreviar"
  54. 54. Por que você abrevia?
  55. 55. – Preguiça de escrever o mesmo nome várias vezes... • Talvez isso indique duplicidade de código!
  56. 56. - 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!
  57. 57. Mais do que uma responsabilidade?
  58. 58. Mais do que uma responsabilidade? começa a partir de onde?
  59. 59. Mais do que uma responsabilidade? começa a partir de onde? Use nomes mais claras: fetchPage() downloadPage()
  60. 60. 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
  61. 61. 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?
  62. 62. #5 Mandamento Não abreviar Benefícios: – Comunicação mais clara; – Facilita a busca por problemas ocultos.
  63. 63. Adaptada # 6 Mandamento "Mantenha suas classes "Mantenha pequenas" pequenas"
  64. 64. Regra original: – 50 linhas por classe.
  65. 65. – 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.
  66. 66. Adaptada #6 Mandamento Mantenha suas classes pequenas Benefícios: – Responsabilidade única; – Métodos objetivos; – Pacotes/namespaces mais enxutos.
  67. 67. Adaptada # 7 Mandamento "Limite o número das variáveis de instância (máximo 5)" 5)"
  68. 68. Adapted Limitar em 5
  69. 69. 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.
  70. 70. # 8 Mandamento "Use coleções de primeiro nível"
  71. 71. Doctrine: ArrayCollection
  72. 72. • 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.
  73. 73. #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.
  74. 74. Adaptada # 9 Mandamento "Não use métodos getter/setter" getter/setter" * Use para propriedades no código PHP
  75. 75. ● 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.
  76. 76. 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.
  77. 77. Criada # 10 Mandamento "Documente seu código!" código!
  78. 78. 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?
  79. 79. 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
  80. 80. #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.
  81. 81. 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.
  82. 82. Perguntas?  @marcelosiqueira  marsiqueira  +MarceloSiqueira  marsiqueira  marcelosiqueira  eu@marcelosiqueira.com.br eu@marcelosiqueira.com.br Obrigado!

×