Object Calisthenics é basicamente um conjunto de boas práticas e regras de programação para aumentar a qualidade do seu código, ele foi introduzido por Jeff Bay e publicado no seu livro chamado Thought Works Anthology, sua principal motivação para o Object Calisthenics é aplicar alguns princípios do Solid.
As regras do Object Calisthenics são focadas em manutenibilidade, legibilidade, testabilidade e compreensão de seu código. Se você já consegue escrever um código utilizando essas boas práticas como manutenção, legível, testável e compreensível essas regras o ajudarão a escrever um código ainda mais sustentável, mais legível e mais compreensível.
São 9 regras do Object Calisthenics:
- Apenas um nível de indentação por método.
A principal ideia é que cada método faça apenas uma coisa, dessa forma facilita a leitura e a manutenção do código. Você pode extrair comportamentos para outros métodos garantindo um único nível de indentação, assim, você está fazendo a aplicação do Extract Method Pattern.
Antes
<? php show de função pública ($ slug) { $ lição = $ this-> repository-> findBySlug ($ slug); if ($ lição) { if (! vazio ($ lição-> polegar_url)) { $ this-> seo () -> addImages ($ lição-> polegar_url); } if ($ lesson-> track) { $ this-> seo () -> setTitle ($ lição-> título. '['. $ lição-> faixa-> título. ']'); } outro { $ this-> seo () -> setTitle ($ lição-> título); } $ this-> seo () -> setDescription ($ lição-> descrição); return $ this-> view ('aulas :: show') -> com (compacto ('lição')); } retornar redirecionamento (rota ('lição.index')); }
Depois
<? php show de função pública ($ slug) { $ lição = $ this-> repository-> findBySlug ($ slug); if ($ lição) { $ this-> addThumbToImages ($ lição-> polegar_url); $ trackTitle =! $ lição-> acompanhar? '': '['. $ lição-> faixa-> título. ']'; $ this-> seo () -> setTitle ($ lição-> título. $ trackTitle); $ this-> seo () -> setDescription ($ lição-> descrição); return $ this-> view ('aulas :: show') -> com (compacto ('lição')); } retornar redirecionamento (rota ('lição.index')); } função protegida addThumbToImages ($ thumbURL) { if (vazio ($ thumbURL)) { retorna falso; } retornar $ this-> seo () -> addImages ($ thumbURL); }
Segunda Regra: Não use else
A ideia principal dessa regra é evitar o máximo possível o uso do “else” e assumindo que temos um fluxo de execução.
Antes
<? php função protegida indexAction () { if ($ this-> security-> isGranted ('ADMIN')) { $ view = 'admin / index.html.twig'; } outro { $ view = 'home / access_denied.html.twig'; } retornar $ this-> render ($ view); } Depois
<? php função protegida indexAction () { if ($ this-> security-> isGranted ('ADMIN')) { retorne $ this-> render ('admin / index.html.twig'); } retorne $ this-> render ('home / access_denied.html.twig'); }
Terceira regra: Envolva seus tipos primitivos
Essa regra é simples, pois ela diz que você deve encapsular todos os tipos primitivos dentro dos objetos, prevenindo assim Primitive Obsession Anyi-Pattern.
Antes
<? php ordem da classe { função pública notifyBuyer ($ email) { if (filter_var ($ email, FILTER_VALIDATE_EMAIL) === false) { lançar novo InvalidEmailException; } retornar $ this-> repository-> sendEmail ($ email); } }
Depois
<? php classe Email { público $ email; função pública __construct ($ email) { if (filter_var ($ email, FILTER_VALIDATE_EMAIL) === false) { lançar novo InvalidEmailException; } retornar $ this-> email = $ email; } } ordem da classe { função pública notifyBuyer ($ email) { retornar $ this-> repository-> sendEmail (novo email ($ email)); } }
Quarta regra: Envolva sua collections em classes
Essa regra diz que se você tiver um conjunto de elementos e quiser manipula-los, é necessário criar uma classe dedica apenas para este conjunto, sendo assim, ao atualizar aquele valor, com certeza será em sua collection.
Seguindo o comportamento dessa regra, você deixa os comportamento relacionados. A regra tem como objetivo Aderir o Single Responsibility Principle e High Cohersion.
Quinta regra: Use apenas um ponto por linha
O “ponto” é o que você usa para chamar métodos em Java ou C#; no PHP seria uma seta. Esta regra é o exemplo da Lei de Deméter: você nunca deve usar mais de um operador de objeto, explicando com outras palavras, você não deve encadear chamadas de métodos.
Sexta Regra: Não Abrevie
Por mais tentador que seja abreviarmos nomes de variáveis, classes ou métodos, não façam isso, pois as abreviações podem ser confusas e tendem a esconder problemas maiores.
Sempre tente manter nome de suas classes, métodos ou variáveis, com apenas duas palavras, e que essas palavras não sejam repetitivas.
Sétima regra: Mantenha todas as classes pequenas
É recomendável que uma classe tenha no máximo 50 linhas, e os pacotes não tenham mais do que 10 arquivos, pois geralmente quando criamos uma classe com mais de 50 linhas, atribuímos a ela mais responsabilidades, tornando-a mais difícil de se entender e reutilizar.
As classes e os pacotes devem ser coesos e ter um propósito, e esse proposito deve ser fácil de se entender.
Oitava regra: Não tenha mais que duas variáveis de instância em sua classe
A regra pode ser muito simples, mas ao mesmo tempo é uma das mais difíceis a serem implementadas, já que ela depende de um mindset totalmente diferente do habitual. Quando temos no máximo duas variáveis de instância, desta forma estamos garantindo o respeito novamente ao Single Responsibility Principle e High Cohesion. Se sua classe tem mais que duas variáveis de instância, é provável que ela esteja fazendo mais de uma responsabilidade
Nona regra: Não use Getters ou Setters
É uma ideia básica, onde você retira os getters e setters para poder adicionar decisões no próprio objeto, qualquer decisão baseada inteiramente no estado de um objeto deve ser feita diretamente nele. Com isso melhoramos nosso código reduzindo a duplicação de regras e damos uma melhor compreensão àquele objeto.