- Chamadas de método ou função que não fazem nada de valor.
Não necessariamente ruim. Os métodos em uma classe base geralmente chamam métodos vazios que são considerados pontos de substituição para subclasses. Exemplo: o UIView do Cocoa Touch possui um -didAddSubview:
método documentado como não fazendo nada na versão padrão. O -addSubview:
método do UIView precisa chamar, -didAddSubview:
mesmo que não faça nada, porque as subclasses podem implementá-lo para fazer alguma coisa. Métodos que não fazem nada e as razões para eles devem ser documentados, é claro.
Se uma função / método vazio ou inútil estiver obviamente presente por razões históricas, deve ser excluído. Dê uma olhada nas versões anteriores do código no seu repositório de códigos-fonte, se você não tiver certeza.
- Verificações redundantes feitas em um arquivo de classe, objeto ou método separado.
Difícil dizer se está tudo bem sem algum contexto. Se as verificações forem claramente feitas pelo mesmo motivo, isso pode significar que não há uma separação clara de responsabilidades e é necessária alguma refatoração, especialmente quando as duas verificações resultam na mesma ação. Se a ação resultante das duas verificações não for a mesma, as duas verificações provavelmente estão sendo realizadas por motivos diferentes, mesmo que a condição seja a mesma, e isso provavelmente está correto.
- declarações if sempre avaliadas como verdadeiras.
Há uma grande diferença entre:
if (1) {
// ...
}
e:
if (foo() == true) {
// ...
}
onde foo()
acontece sempre retornar true
.
O primeiro caso acontece muito quando as pessoas estão depurando. É fácil usar um if (0) {...
para remover temporariamente um pedaço de código enquanto você tenta isolar um bug e depois alterar 0
para 1
para restaurar esse código. Ele if
deve ser removido assim que você terminar, é claro, mas é fácil esquecer essa etapa ou perder uma ou duas, se você a tiver feito em vários lugares. (É uma boa idéia identificar esses condicionais com um comentário que você possa pesquisar mais tarde.) O único dano é a confusão que isso pode causar no futuro; se o compilador puder determinar o valor da condição em tempo de compilação, ele a removerá completamente.
O segundo caso pode ser aceitável. Se a condição representada por foo()
precisar ser testada em vários locais do código, fatorá-la em uma função ou método separado é geralmente a coisa certa a ser feita, mesmo que foo()
sempre seja verdadeira agora. Se for concebível que foo()
possa eventualmente retornar false
, isolar essa condição em um método ou função é uma maneira de identificar todos os locais onde o código se baseia nessa condição. No entanto , isso cria algum risco de que a foo() == false
condição não seja testada e possa levar a problemas mais tarde; a solução é garantir que você adicione testes de unidade que testam explicitamente o false
caso.
- Tópicos que se desdobram e não fazem nada de importante.
Isso soa como um artefato da história e algo que pode ser identificado durante uma revisão de código ou por meio de criação de perfil periódica do software. Suponho que poderia ser criado intencionalmente, mas tenho dificuldade em imaginar que alguém realmente faria isso de propósito.
if (false) {...}
blocos são ótimos para comentar o código! </sarcasm>