Back-End

14 jul, 2016

Como melhorar seus códigos usando Object Calisthenics

Publicidade

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