Dev (Back & Front)ARTIGO

Como melhorar seus códigos usando Object Calisthenics

O Object Calisthenics é uma série de boas práticas e regras de programação que foram criadas pela comunidade de desenvolvedores Java.

Em um dos primeiros projetos que a Coderockr participou, tivemos o privilégio de trabalhar com um “dream team”: Eduardo Shiota, Guilherme Blanco, Rafael Dohms e Otavio Ferreira (em ordem alfabética porque é impossível perfilá-los em qualquer ordem de relevância).

Neste projeto, foi possível aprimorarmos vários pontos importantes como TDDTestes automatizados4 conteúdosComo migrei meus testes automatizados de Java para Ruby… Será que fiz bem?Dev (Back & Front) · jun 2019TDD em Nodejs: conhecendo o JestDev (Back & Front) · mar 2019Arquitetura Hexagonal na prática com exemplos em PythonDev (Back & Front) · mai 2025Ver tudo em Dev (Back & Front) , ScrumScrum7 conteúdosPMP vs Scrum Master: Qual certificação escolher em 2026?Marketing Tech · nov 2025Scrum passo a passo para implementação do Ágile MarketingGestão Dev & TI · jul 2020Scrum Gathering anuncia novidadesDev (Back & Front) · mai 2019Ver tudo em Gestão Dev & TI , trabalho remoto, análise, integração contínuaCI/CD23 conteúdosCI/CD Mobile: o caos invisível que separa times comuns de times de alta performanceDev (Back & Front) · abr 2026Lambda: implementando com GitLab CI/CD e Terraform para Integração SFTP, S3 e Databricks em GoDev (Back & Front) · nov 2023Publicando sua aplicação Web Python no WebApp do Azure e configurando o CI/CD da sua aplicaçãoDevSecOps · abr 2019Ver tudo em DevSecOps etc. Mas o que mais me marcou foram os conceitos de Clean Code e Object Calisthenics que eram aplicados ao projeto.

O Object Calisthenics é uma série de boas práticas e regras de programação que foram criadas pela comunidade de desenvolvedores Java. O Guilherme e o Rafael foram os responsáveis por adaptar estas regras para o ambiente PHP e são grandes evangelizadores destes conceitos. Se você tiver a oportunidade de ver alguma palestra deles sobre o assunto, eu recomendo fortemente. Mas como eles estão vivendo fora do Brasil você pode começar olhando os slides da palestra PHP para Adultos: Clean Code e Object Calisthenics e You code sucks, let’s fix it.

Eu lembrei deste tópico esta semana, quando me deparei com o seguinte código em um projeto que estou dando manutenção/ desenvolvendo novas features:

<?php 
public function unsubscribe($user, $category) { 
   // Se o usuário pode ser bloqueado 
   if ($this->isUserLockable($user)) { 
       // Se a categoria pode ser bloqueada 
       if ($this->isCategoryLockable($category)) { 
           // Se essa opção não foi executada ainda, ou seja, usuário e categoria não estão bloqueados ainda 
           if (!$this->isUserAndCategoryLocked($user, $category)) { 
               return [ 
                   'type' => 'success', 
                   'message' => 'Pronto! Você não receberá mais ' . $category['name'] . ' de ' . $user['name'] . '. Para reativar o recebimento dessas mensagens, <a href="' . $this->getRequest()->getBasePath() . '/messages/setting">acesse suas configurações</a>' 
                ]; 
            } else { 
                return [ 
                    'type' => 'success', 
                    'message' => 'Você não está recebendo ' . $category['name'] . ' de ' . $user['name'] . '.' 
                ]; 
            } 
        } else { 
            return [ 
                'type' => 'error', 
                'message' => 'Algo deu errado. A categoria ' . $category['name'] . ' parece não ser passível de bloqueio.' 
            ]; 
        } 
    } else { 
        return [ 
           'type' => 'error', 
           'message' => 'Algo deu errado. O usuário ' . $user['name'] . ' parece não ser passível de bloqueio.' 
        ]; 
    } 
}

É um código totalmente funcional, mas analisando algumas regras do Object Calisthenics é possível refatorá-lo para algo assim:

<?php 
public function unsubscribe($user, $category) { 
        if (!$this->isUserLockable($user)) { 
            return [ 
                'type' => 'error', 
                'message' => 'Algo deu errado. O usuário ' . $user['name'] . ' parece não ser passível de bloqueio.' 
            ]; 
        } 
        if (!$this->isCategoryLockable($category)) { 
            return [ 
                'type' => 'error', 
                'message' => 'Algo deu errado. A categoria ' . $category['name'] . ' parece não ser passível de bloqueio.' 
            ]; 
        } 
        if (!$this->isUserAndCategoryLocked($user, $category)) { return [ 
                'type' => 'success', 
                'message' => 'Pronto! Você não receberá mais ' . $category['name'] . ' de ' . $user['name'] . '. Para reativar o recebimento dessas mensagens, <a href="' . $this->getRequest()->getBasePath() . '/messages/setting">acesse suas configurações</a>q' 
           ]; 
        } 
        return [ 
            'type' => 'success', 
            'message' => 'Você não está recebendo ' . $category['name'] . ' de ' . $user['name'] . '.' 
        ]; 
   }

Desta forma, o código fica mais legível e de fácil manutenção. E o código se torna mais performático, pois possui uma complexidade bem menor.

Minha recomendação é revisar as dicas do Guilherme e do Rafael e tentar aplicá-las aos seus códigos. Ou pelo menos tentar, aos poucos, absorvê-las e adaptá-las a sua realidade. O resultado é muito recompensador e vale o pequeno investimento.

Possui graduação e especialização em Ciência de Computação. É desenvolvedor desde 1998 e professor desde 2004. Autor dos livros Frameworks para Desenvolvimento em PHP, Grid Computing in Research and Education, Zend Framework na prática, Zend Framework 2 na prática, Iniciando com o Zend Framework 2 e Doctrine na prática.

Ver perfil