quinta-feira, 18 de março de 2010

Refactoring e Clareza de Código - Negação da Negação

Este faz parte de uma série de pequenos posts com os tags código limpo e refactoring que vou estar publicando na medida que vou limpando alguns códigos por aqui.

A negação da negação geralmente atrapalha a leitura:
if(!$userAllowed) {
//x
} // aqui estamos negando a negação do if acima...
else {
//y
}
ou seja, se o sistema não tiver acesso, faça x e se ele não não tiver (que é o mesmo que ele ter, mas da um trabalho para ler) faça y. Sei que isso parece simples, principalmente em um código pequeno, mas tudo que diminui a velocidade de leitura deve ser evitado, até mesmo porque em alguns métodos fica difícil não ter um código extenso.

Normalmente quando um if tem um else, é mais claro se não começamos negando. Porque então o else vai ser a negação da negação.

Ou então algo assim:

if(!$accesForbidden) {//a} else {//b}

parece normal, mas da um trabalhinho pra ler. É bem mais fácil ler algo como:

if($hasAccess) {//a} else {//b}

ou no máximo:

if($accesForbidden) {//b} else {//a}
apesar de que este segundo caso só acho aceitável quando a variável accessForbiden já existe e tem esse nome justificado em outro contexto.

Um comentário:

  1. Interessante, Como esse exemplo é um caso de controle de acesso, mais simples ainda é abstrair essa situação: if ($this->hasAccess($acl)) {$this->display();} else {$this->accessForbidden();}

    Nesse seu post um exemplo válido seria algo como
    if ($this->save()) {//a} else {//b}

    ResponderExcluir