Meu nome é Elton Minetto

Como melhorar seus códigos usando Object Calisthenics

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 TDD, Scrum, trabalho remoto, análise, integração contínua, 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 torna-se 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.