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

94
Os 10 Os 10 mandamento do mandamento do Rei do código! Rei do código! Objects Calisthenics Objects Calisthenics

description

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.

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

Page 1: Objects calisthenics - Os 10 mandamentos do rei do código

Os 10 Os 10 mandamento domandamento do

Rei do código!Rei do código!Objects CalisthenicsObjects Calisthenics

Page 2: Objects calisthenics - Os 10 mandamentos do rei do código

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!

Page 3: Objects calisthenics - Os 10 mandamentos do rei do código

Essa palestra foi baseado Essa palestra foi baseado nas palestras.nas palestras.

Page 4: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 5: Objects calisthenics - Os 10 mandamentos do rei do código

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!

Page 6: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 7: Objects calisthenics - Os 10 mandamentos do rei do código

Meu códigoMeu códigoagrega valor?agrega valor?

Page 8: Objects calisthenics - Os 10 mandamentos do rei do código

Meu códigoMeu códigoagrega valor?agrega valor?

É legível?É legível?

Page 9: Objects calisthenics - Os 10 mandamentos do rei do código

Meu códigoMeu códigoagrega valor?agrega valor?

É legível?É legível?

É testável?É testável?

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

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?

Page 11: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 12: Objects calisthenics - Os 10 mandamentos do rei do código
Page 13: Objects calisthenics - Os 10 mandamentos do rei do código

O que acham disso?O que acham disso?

Page 14: Objects calisthenics - Os 10 mandamentos do rei do código

Não agrega valor!Não agrega valor!

Page 15: Objects calisthenics - Os 10 mandamentos do rei do código

Então, como podemos Então, como podemos agregar no código?agregar no código?

Page 16: Objects calisthenics - Os 10 mandamentos do rei do código

Object Object CalisthenicsCalisthenics

Page 17: Objects calisthenics - Os 10 mandamentos do rei do código

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"

Page 18: Objects calisthenics - Os 10 mandamentos do rei do código

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.

Page 19: Objects calisthenics - Os 10 mandamentos do rei do código

““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

Page 20: Objects calisthenics - Os 10 mandamentos do rei do código

““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

Page 21: Objects calisthenics - Os 10 mandamentos do rei do código

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.

Page 22: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 23: Objects calisthenics - Os 10 mandamentos do rei do código

# 1# 1 MandamentoMandamento

"Somente "Somente umum nível de nível de indentação indentação por métodopor método""

Page 24: Objects calisthenics - Os 10 mandamentos do rei do código

# 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".

Page 25: Objects calisthenics - Os 10 mandamentos do rei do código
Page 26: Objects calisthenics - Os 10 mandamentos do rei do código

00

11

22

33

Page 27: Objects calisthenics - Os 10 mandamentos do rei do código

00

11

22

33

Page 28: Objects calisthenics - Os 10 mandamentos do rei do código
Page 29: Objects calisthenics - Os 10 mandamentos do rei do código

Espaço em brancoEspaço em branco

Page 30: Objects calisthenics - Os 10 mandamentos do rei do código

Espaço em brancoEspaço em branco

Logica duplicadaLogica duplicada

Page 31: Objects calisthenics - Os 10 mandamentos do rei do código

00

1122

Page 32: Objects calisthenics - Os 10 mandamentos do rei do código

00

1122

Page 33: Objects calisthenics - Os 10 mandamentos do rei do código

IF de uma linha,IF de uma linha, operação simples operação simples

Page 34: Objects calisthenics - Os 10 mandamentos do rei do código

Return rápidoReturn rápido

IF de uma linha,IF de uma linha, operação simples operação simples

Page 35: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 36: Objects calisthenics - Os 10 mandamentos do rei do código

Sempre podemos melhorar!Sempre podemos melhorar!

Page 37: Objects calisthenics - Os 10 mandamentos do rei do código

Interação rápidaInteração rápida

Método reusávelMétodo reusável

Page 38: Objects calisthenics - Os 10 mandamentos do rei do código

Interação rápidaInteração rápida

Método reusávelMétodo reusávelRetorno aceitável: Retorno aceitável: expectativa/retornoexpectativa/retorno

Page 39: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 40: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 41: Objects calisthenics - Os 10 mandamentos do rei do código

# 2# 2 MandamentoMandamento

""NãoNão utilize a utilize a palavra-chave palavra-chave 'else''else'""

Page 42: Objects calisthenics - Os 10 mandamentos do rei do código
Page 43: Objects calisthenics - Os 10 mandamentos do rei do código
Page 44: Objects calisthenics - Os 10 mandamentos do rei do código

Variável intermediáriaVariável intermediária

Variável intermediáriaVariável intermediária

Page 45: Objects calisthenics - Os 10 mandamentos do rei do código
Page 46: Objects calisthenics - Os 10 mandamentos do rei do código
Page 47: Objects calisthenics - Os 10 mandamentos do rei do código

Intermediária removidaIntermediária removida

Retorno rápidoRetorno rápido

Page 48: Objects calisthenics - Os 10 mandamentos do rei do código

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'

Page 49: Objects calisthenics - Os 10 mandamentos do rei do código

# 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

Page 50: Objects calisthenics - Os 10 mandamentos do rei do código
Page 51: Objects calisthenics - Os 10 mandamentos do rei do código

Operação incorretaOperação incorreta

Page 52: Objects calisthenics - Os 10 mandamentos do rei do código

Operação incorretaOperação incorreta

Page 53: Objects calisthenics - Os 10 mandamentos do rei do código

Agora pode encapsular todas asAgora pode encapsular todas asoperações relacionadas com a animaçãooperações relacionadas com a animação

Page 54: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 55: Objects calisthenics - Os 10 mandamentos do rei do código

# 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

Page 56: Objects calisthenics - Os 10 mandamentos do rei do código

propriedades são mais difíceis de testarpropriedades são mais difíceis de testar

Sem espaço em brancoSem espaço em branco

Page 57: Objects calisthenics - Os 10 mandamentos do rei do código
Page 58: Objects calisthenics - Os 10 mandamentos do rei do código

Interface fluenteInterface fluente

Page 59: Objects calisthenics - Os 10 mandamentos do rei do código

Operadores alinhadosOperadores alinhados

Interface fluenteInterface fluente

Page 60: Objects calisthenics - Os 10 mandamentos do rei do código

Somente geters (nenhuma operação)Somente geters (nenhuma operação)

Interface fluenteInterface fluente

Operadores alinhadosOperadores alinhados

Page 61: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 62: Objects calisthenics - Os 10 mandamentos do rei do código

# 5 # 5 MadamentoMadamento

""NãoNão abreviar" abreviar"

Page 63: Objects calisthenics - Os 10 mandamentos do rei do código
Page 64: Objects calisthenics - Os 10 mandamentos do rei do código
Page 65: Objects calisthenics - Os 10 mandamentos do rei do código

Por que você abrevia?Por que você abrevia?

Page 66: Objects calisthenics - Os 10 mandamentos do rei do código

– – 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!

Page 67: Objects calisthenics - Os 10 mandamentos do rei do 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!

Page 68: Objects calisthenics - Os 10 mandamentos do rei do código

Mais do que uma responsabilidade?Mais do que uma responsabilidade?

Page 69: Objects calisthenics - Os 10 mandamentos do rei do código

começa a partir de onde?começa a partir de onde?

Mais do que uma responsabilidade?Mais do que uma responsabilidade?

Page 70: Objects calisthenics - Os 10 mandamentos do rei do código

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?

Page 71: Objects calisthenics - Os 10 mandamentos do rei do código

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?

Page 72: Objects calisthenics - Os 10 mandamentos do rei do código

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?

Page 73: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 74: Objects calisthenics - Os 10 mandamentos do rei do código

# 6# 6 MandamentoMandamento"M"Mantenha suas classesantenha suas classes

pequenaspequenas""

AdaptadaAdaptada

Page 75: Objects calisthenics - Os 10 mandamentos do rei do código

Regra original:Regra original:

– – 50 linhas por classe.50 linhas por classe.

Page 76: Objects calisthenics - Os 10 mandamentos do rei do código

– – 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.

Page 77: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 78: Objects calisthenics - Os 10 mandamentos do rei do código

# 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

Page 79: Objects calisthenics - Os 10 mandamentos do rei do código

AdaptedAdapted

Limitar em 5Limitar em 5

Page 80: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 81: Objects calisthenics - Os 10 mandamentos do rei do código

# 8 # 8 MandamentoMandamento

"Use "Use coleçõescoleções de primeiro de primeiro nível"nível"

Page 82: Objects calisthenics - Os 10 mandamentos do rei do código

Doctrine:Doctrine:ArrayCollectionArrayCollection

Page 83: Objects calisthenics - Os 10 mandamentos do rei do código

• • 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.

Page 84: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 85: Objects calisthenics - Os 10 mandamentos do rei do código

# 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

Page 86: Objects calisthenics - Os 10 mandamentos do rei do código
Page 87: Objects calisthenics - Os 10 mandamentos do rei do código

● 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.

Page 88: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 89: Objects calisthenics - Os 10 mandamentos do rei do código

# 10 # 10 MandamentoMandamento

""DocumenteDocumente seu código seu código!!""

CriadaCriada

Page 90: Objects calisthenics - Os 10 mandamentos do rei do código

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?

Page 91: Objects calisthenics - Os 10 mandamentos do rei do código

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

Page 92: Objects calisthenics - Os 10 mandamentos do rei do código

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!!

Page 93: Objects calisthenics - Os 10 mandamentos do rei do 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:

Page 94: Objects calisthenics - Os 10 mandamentos do rei do código

Perguntas?Perguntas? @@marcelosiqueiramarcelosiqueira

marsiqueiramarsiqueira

+MarceloSiqueira+MarceloSiqueira

marsiqueiramarsiqueira

marcelosiqueiramarcelosiqueira

eu@[email protected]

Obrigado!Obrigado!