Os 10 Os 10 mandamento domandamento do
Rei do código!Rei do código!Objects CalisthenicsObjects Calisthenics
Marcelo SiqueiraMarcelo Siqueira
@@marcelosiqueiramarcelosiqueira
marsiqueiramarsiqueira
+MarceloSiqueira+MarceloSiqueira
marsiqueiramarsiqueira
marcelosiqueiramarcelosiqueira
Programador PHP e Programador PHP e Python, Defensor de Python, Defensor de
Software Livre e Software Livre e GNU/Linux, Empreendedor, GNU/Linux, Empreendedor, Nerd e tomador de cerveja!Nerd e tomador de cerveja!
Essa palestra foi baseado Essa palestra foi baseado nas palestras.nas palestras.
Essa palestra foi baseado Essa palestra foi baseado nas palestras.nas palestras.
Guilherme BlancoGuilherme Blanco@guilhermeblanco@guilhermeblanco
Object Calisthenics aplicado ao PHPObject Calisthenics aplicado ao PHP
Essa palestra foi baseado Essa palestra foi baseado nas palestras.nas palestras.
Guilherme BlancoGuilherme Blanco@guilhermeblanco@guilhermeblanco
Object Calisthenics aplicado ao PHPObject Calisthenics aplicado ao PHP
Rafael DohmsRafael Dohms@rdohms@rdohms
Your code sucks, let's fix it!Your code sucks, let's fix it!
Essa palestra irá falar Essa palestra irá falar sobre qualidade de sobre qualidade de
códigos!códigos!
Então, vamos agregar!Então, vamos agregar!
LembreteLembrete
Meu códigoMeu códigoagrega valor?agrega valor?
Meu códigoMeu códigoagrega valor?agrega valor?
É legível?É legível?
Meu códigoMeu códigoagrega valor?agrega valor?
É legível?É legível?
É testável?É testável?
Meu códigoMeu códigoagrega valor?agrega valor?
É legível?É legível?É fácil a manutenção?É fácil a manutenção?
É testável?É testável?
Meu códigoMeu códigoagrega valor?agrega valor?
É legível?É legível?É fácil a manutenção?É fácil a manutenção?
É reusável?É reusável? É testávelÉ testável
O que acham disso?O que acham disso?
Não agrega valor!Não agrega valor!
Então, como podemos Então, como podemos agregar no código?agregar no código?
Object Object CalisthenicsCalisthenics
Object Object CalisthenicsCalisthenics
cal·is·then·ics cal·is·then·ics - substantivo - / kal s THeniks/ ˌ ə ˈ- substantivo - / kal s THeniks/ ˌ ə ˈTermo derivado do grego: "exercício", Termo derivado do grego: "exercício",
"exercício de relaxamento", "ginástica rítmica""exercício de relaxamento", "ginástica rítmica"
Object Object CalisthenicsCalisthenics
cal·is·then·ics cal·is·then·ics - substantivo - / kal s THeniks/ ˌ ə ˈ- substantivo - / kal s THeniks/ ˌ ə ˈTermo derivado do grego: "exercício", Termo derivado do grego: "exercício",
"exercício de relaxamento", "ginástica rítmica""exercício de relaxamento", "ginástica rítmica"
Uma variedade de exercícios simples eUma variedade de exercícios simples erítmicos para alcançar melhor qualidaderítmicos para alcançar melhor qualidade
de código e OO.de código e OO.
““Então aqui está um exercício Então aqui está um exercício que pode ajudá-lo a que pode ajudá-lo a
internalizar princípios de um internalizar princípios de um bom design orientado a bom design orientado a
objeto e, na verdade, usá-las objeto e, na verdade, usá-las na vida real.”na vida real.”
--Jeff Bay--Jeff Bay
““Então aqui está um exercício Então aqui está um exercício que pode ajudá-lo a que pode ajudá-lo a
internalizar princípios de um internalizar princípios de um bom design orientado a bom design orientado a
objeto e, na verdade, usá-las objeto e, na verdade, usá-las na vida real.”na vida real.”
--Jeff Bay--Jeff Bay
Importante:Importante:
PHP != JAVAPHP != JAVAAlgumas adaptações devem ser feitasAlgumas adaptações devem ser feitas
O OC são O OC são nove (9)nove (9) orientações, orientações, regras, mandamentos, regras, mandamentos,
"bem" simples "bem" simples e que podem ser utilizadas e que podem ser utilizadas
em qualquer linguagem em qualquer linguagem orientada a objetos.orientada a objetos.
Mas para agregar mostraremos Mas para agregar mostraremos 10(dez) orientações, regras, 10(dez) orientações, regras,
mandamentos.mandamentos.
O OC são O OC são nove (9)nove (9) orientações, orientações, regras, mandamentos, regras, mandamentos,
"bem" simples "bem" simples e que podem ser utilizadas e que podem ser utilizadas
em qualquer linguagem em qualquer linguagem orientada a objetos.orientada a objetos.
Mas para agregar mostraremos Mas para agregar mostraremos 10(dez) orientações, regras, 10(dez) orientações, regras,
mandamentos.mandamentos.
Repetindo:Repetindo:
PHP é != JAVAPHP é != JAVAAlgumas adaptações devem ser feitasAlgumas adaptações devem ser feitas
# 1# 1 MandamentoMandamento
"Somente "Somente umum nível de nível de indentação indentação por métodopor método""
# 1# 1 MandamentoMandamento
"Somente "Somente umum nível de nível de indentação indentação por métodopor método""
Neologismo derivado da palavra inglesa Neologismo derivado da palavra inglesa "indentation", que significa "recuo"."indentation", que significa "recuo".
00
11
22
33
00
11
22
33
Espaço em brancoEspaço em branco
Espaço em brancoEspaço em branco
Logica duplicadaLogica duplicada
00
1122
00
1122
IF de uma linha,IF de uma linha, operação simples operação simples
Return rápidoReturn rápido
IF de uma linha,IF de uma linha, operação simples operação simples
Função nativa C, mais rápida.Função nativa C, mais rápida.
IF de uma linha,IF de uma linha, operação simples operação simples
Return rápidoReturn rápido
Sempre podemos melhorar!Sempre podemos melhorar!
Interação rápidaInteração rápida
Método reusávelMétodo reusável
Interação rápidaInteração rápida
Método reusávelMétodo reusávelRetorno aceitável: Retorno aceitável: expectativa/retornoexpectativa/retorno
Interação rápidaInteração rápida
Método reusávelMétodo reusável
Método matches, resultadoMétodo matches, resultado “true” “true”
Retorno aceitável: Retorno aceitável: expectativa/retornoexpectativa/retorno
Benefícios:Benefícios:
– – Maior coesão;Maior coesão;
– – Reduz a complexidade ciclomática;Reduz a complexidade ciclomática;
– – Métodos acabam fazendo apenas uma coisa, Métodos acabam fazendo apenas uma coisa, como deve ser;como deve ser;
– – Aumenta a reusabilidade.Aumenta a reusabilidade.
#1#1 Mandamento Mandamento Somente um nível de indentação/recuo por métodoSomente um nível de indentação/recuo por método
# 2# 2 MandamentoMandamento
""NãoNão utilize a utilize a palavra-chave palavra-chave 'else''else'""
Variável intermediáriaVariável intermediária
Variável intermediáriaVariável intermediária
Intermediária removidaIntermediária removida
Retorno rápidoRetorno rápido
Benefícios:Benefícios:
– – Ajuda a prevenir duplicação de código;Ajuda a prevenir duplicação de código;
– – Reduz a complexidade ciclomática;Reduz a complexidade ciclomática;
– – Faz o código ficar mais limpo, passando por um Faz o código ficar mais limpo, passando por um único caminho.único caminho.
#2#2 MandamentoMandamentoNãoNão utilize a palavra-chave utilize a palavra-chave 'else''else'
# 3# 3 MandamentoMandamento
"Encapsule os tipos "Encapsule os tipos primitivos e strings"primitivos e strings"
* se eles possuírem * se eles possuírem comportamentocomportamento
AdaptadaAdaptada
Operação incorretaOperação incorreta
Operação incorretaOperação incorreta
Agora pode encapsular todas asAgora pode encapsular todas asoperações relacionadas com a animaçãooperações relacionadas com a animação
Benefícios:Benefícios:
– – Ajuda a identificar o que deve ser um objeto;Ajuda a identificar o que deve ser um objeto;
– – Indução de Tipo;Indução de Tipo;
– – Encapsulamento de operações.Encapsulamento de operações.
#3 #3 MandamentoMandamentoEncapsule os tipos primitivos e stringsEncapsule os tipos primitivos e strings
* se eles possuírem comportamento* se eles possuírem comportamento
AdaptadaAdaptada
# 4 # 4 MandamentoMandamento
"Somente um ponto "Somente um ponto (“arrow” para o PHP) por (“arrow” para o PHP) por
linha"linha"
* cadeia getter ou uma * cadeia getter ou uma interface fluenteinterface fluente
AdaptadaAdaptada
propriedades são mais difíceis de testarpropriedades são mais difíceis de testar
Sem espaço em brancoSem espaço em branco
Interface fluenteInterface fluente
Operadores alinhadosOperadores alinhados
Interface fluenteInterface fluente
Somente geters (nenhuma operação)Somente geters (nenhuma operação)
Interface fluenteInterface fluente
Operadores alinhadosOperadores alinhados
Benefícios:Benefícios:
– – Legibilidade;Legibilidade;
– – Construção de testes facilitada (mocks);Construção de testes facilitada (mocks);
– – Mais fácil para depurar.Mais fácil para depurar.
#4 #4 MandamentoMandamentoSomente um ponto (“arrow” para o PHP) por linhaSomente um ponto (“arrow” para o PHP) por linha
* cadeia getter ou uma interface fluente* cadeia getter ou uma interface fluente
AdaptadaAdaptada
# 5 # 5 MadamentoMadamento
""NãoNão abreviar" abreviar"
Por que você abrevia?Por que você abrevia?
– – Preguiça de escrever o mesmo Preguiça de escrever o mesmo nome várias vezes...nome várias vezes...
• • Talvez isso indique duplicidade de Talvez isso indique duplicidade de código!código!
- Preguiça de escrever o nome do - Preguiça de escrever o nome do método muito longo...método muito longo...
• • Talvez isso indique que o seu Talvez isso indique que o seu método faz mais de uma coisa. Isso método faz mais de uma coisa. Isso
deve ser separado em vários deve ser separado em vários métodos ou até classes!métodos ou até classes!
Mais do que uma responsabilidade?Mais do que uma responsabilidade?
começa a partir de onde?começa a partir de onde?
Mais do que uma responsabilidade?Mais do que uma responsabilidade?
começa a partir de onde?começa a partir de onde? Use nomes mais claras:Use nomes mais claras:fetchPage()fetchPage()
downloadPage()downloadPage()
Mais do que uma responsabilidade?Mais do que uma responsabilidade?
começa a partir de onde?começa a partir de onde?
Use um dicionário:Use um dicionário:fork, create, begin, openfork, create, begin, open
Use nomes mais claras:Use nomes mais claras:fetchPage()fetchPage()
downloadPage()downloadPage()
Mais do que uma responsabilidade?Mais do que uma responsabilidade?
começa a partir de onde?começa a partir de onde?
Use um dicionário:Use um dicionário:fork, create, begin, openfork, create, begin, open
Use nomes mais claras:Use nomes mais claras:fetchPage()fetchPage()
downloadPage()downloadPage()
Linha de tabela?Linha de tabela?
Mais do que uma responsabilidade?Mais do que uma responsabilidade?
Benefícios:Benefícios:
– – Comunicação mais clara;Comunicação mais clara;
– – Facilita a busca por problemas ocultos.Facilita a busca por problemas ocultos.
#5 #5 MandamentoMandamentoNão abreviarNão abreviar
# 6# 6 MandamentoMandamento"M"Mantenha suas classesantenha suas classes
pequenaspequenas""
AdaptadaAdaptada
Regra original:Regra original:
– – 50 linhas por classe.50 linhas por classe.
– – 200200 linhas por classe (para incluir linhas por classe (para incluir os blocos de documentação);os blocos de documentação);
– – 1010 metodos por metodos por classesclasses;;
– – 1515 classes por classes por pacote/namespace/pasta;pacote/namespace/pasta;– De – De 1515 a a 2020 linhas por método. linhas por método.
Benefícios:Benefícios:
– – Responsabilidade única;Responsabilidade única;
– – Métodos objetivos;Métodos objetivos;
– – Pacotes/namespaces mais enxutos.Pacotes/namespaces mais enxutos.
#6 #6 MandamentoMandamentoMMantenha suas classes antenha suas classes pequenaspequenas
AdaptadaAdaptada
# 7# 7 MandamentoMandamento
""Limite Limite o número das o número das variáveis de instânciavariáveis de instância
(máximo 5)(máximo 5)""
AdaptadaAdaptada
AdaptedAdapted
Limitar em 5Limitar em 5
Benefícios:Benefícios:
– – Lista reduzida de dependências;Lista reduzida de dependências;
– – Mais fácil para fazer Mocking para testes.Mais fácil para fazer Mocking para testes.
#7 #7 MandamentoMandamentoLimite o número das variáveis de instânciaLimite o número das variáveis de instância (2 para 5) (2 para 5)
AdaptadaAdaptada
# 8 # 8 MandamentoMandamento
"Use "Use coleçõescoleções de primeiro de primeiro nível"nível"
Doctrine:Doctrine:ArrayCollectionArrayCollection
• • Qualquer classe que contenha uma coleção Qualquer classe que contenha uma coleção (ou tenha esse propósito), não deve conter (ou tenha esse propósito), não deve conter outras propriedades;outras propriedades;
• • Encapsulamento de coleções primitivas Encapsulamento de coleções primitivas (arrays);(arrays);
• • Utilização de Interfaces Orientadas a Utilização de Interfaces Orientadas a Objetos:Objetos:
– – Collections do Java;Collections do Java;– SPL do PHP.– SPL do PHP.
Benefícios:Benefícios:
– – É possível implementar operações em coleções;É possível implementar operações em coleções;
– – Utilizar métodos já existentes em interfaces Utilizar métodos já existentes em interfaces pré-definidas.pré-definidas.
#8 #8 MandamentoMandamentoUse Use coleçõescoleções de primeiro nível de primeiro nível
# 9 # 9 MandamentoMandamento
""NãoNão use métodos use métodos getter/settergetter/setter""
* Use para propriedades * Use para propriedades no código PHPno código PHP
AdaptadaAdaptada
● Muitos frameworks utilizam os Muitos frameworks utilizam os métodos getters e setters paramétodos getters e setters para
inicializar variáveis, reduzindo código e inicializar variáveis, reduzindo código e evitando erros desnecessários.evitando erros desnecessários.
● Não coloque nenhum tipo de regra de Não coloque nenhum tipo de regra de negócio nos getters e setters.negócio nos getters e setters.
Benefícios:Benefícios:
– – Operações de injetor ;Operações de injetor ;
– – Encapsulamento das transformações.Encapsulamento das transformações.
#9 #9 MandamentoMandamentoNãoNão use métodos getter/setter use métodos getter/setter
* Use para propriedades no código PHP* Use para propriedades no código PHP
AdaptadaAdaptada
# 10 # 10 MandamentoMandamento
""DocumenteDocumente seu código seu código!!""
CriadaCriada
começa a partir de onde?começa a partir de onde?
Use um dicionário:Use um dicionário:fork, create, begin, openfork, create, begin, open
Use nomes mais claras:Use nomes mais claras:fetchPage()fetchPage()
downloadPage()downloadPage()
Linha de tabela?Linha de tabela?
Mais do que uma responsabilidade?Mais do que uma responsabilidade?
Marca Marca todotodo para que não para que não se perca nas mudanças se perca nas mudanças
Uma nota sobre o custoUma nota sobre o custo de execução da função de execução da função
Documentação gerada pelaDocumentação gerada pelaAPI do phpDocumentorAPI do phpDocumentor
Benefícios:Benefícios:
– – Documentação automática por API;Documentação automática por API;
– – Transmissão de "linha de pensamento";Transmissão de "linha de pensamento";
– – Evita confusões.Evita confusões.
#10 #10 MandamentoMandamentoDocumente seu códigoDocumente seu código!!
#1. Somente #1. Somente um nível de indentaçãoum nível de indentação por método; por método;
#2. #2. NãoNão utilize a palavra-chave utilize a palavra-chave 'eles''eles';;
#3. Encapsule os tipos primitivos e strings;#3. Encapsule os tipos primitivos e strings;
#4. Somente #4. Somente um ponto por linhaum ponto por linha;;
#5. #5. NãoNão abreviar; abreviar;
#6. Mantenha suas classes #6. Mantenha suas classes pequenaspequenas
#7. #7. LimiteLimite número das número das variáveis de instânciavariáveis de instância (máximo 5); (máximo 5);
#8. Use #8. Use coleçõescoleções de primeiro nível; de primeiro nível;
#9. Use métodos #9. Use métodos getter/settergetter/setter;;
#10. #10. DocumenteDocumente seu código. seu código.
Recaptulando:Recaptulando:
Perguntas?Perguntas? @@marcelosiqueiramarcelosiqueira
marsiqueiramarsiqueira
+MarceloSiqueira+MarceloSiqueira
marsiqueiramarsiqueira
marcelosiqueiramarcelosiqueira
Obrigado!Obrigado!