- Method or function calls that do nothing of value.
Non necessariamente male. I metodi in una classe base spesso chiamano metodi vuoti che sono intesi come punti override per le sottoclassi. Esempio: l'UIView di Cocoa Touch ha un metodo -didAddSubview:
che è documentato come non fare nulla nella versione predefinita. Il metodo -addSubview:
di UIView deve chiamare -didAddSubview:
anche se non fa nulla perché le sottoclassi possono implementarlo per fare qualcosa. Metodi che non fanno nulla e le ragioni per cui dovrebbero essere documentati, naturalmente.
Se una funzione / metodo vuoto o inutile è ovviamente presente per ragioni storiche, dovrebbe essere cancellato. Dai un'occhiata alle versioni precedenti del codice nel tuo repository del codice sorgente, se non sei sicuro.
- Redundant checks done in a separate class file, object or method.
Difficile dire se va bene senza un contesto. Se i controlli sono chiaramente fatti per lo stesso motivo, ciò potrebbe significare che non c'è una chiara separazione delle responsabilità e che alcuni refactoring sono richiesti, specialmente quando entrambi i controlli portano alla stessa azione intrapresa. Se l'azione risultante da entrambi i controlli non è la stessa, probabilmente i due controlli vengono eseguiti per ragioni diverse anche se la condizione è la stessa, e probabilmente è ok.
- if statements that always evaluate to true.
C'è una grande differenza tra:
if (1) {
// ...
}
e
if (foo() == true) {
// ...
}
dove foo()
succede sempre restituire true
.
Il primo caso si verifica molto quando le persone eseguono il debug. È facile utilizzare if (0) {...
per rimuovere temporaneamente un blocco di codice mentre stai cercando di isolare un bug, quindi modificare il 0
in 1
per ripristinare quel codice. Il if
dovrebbe essere rimosso una volta che hai finito, ovviamente, ma è facile dimenticarlo, o perdere uno o due se lo hai fatto in più punti. (È una buona idea identificare tali condizionali con un commento che è possibile cercare successivamente.) L'unico danno è la confusione che potrebbe causare in futuro; se il compilatore può determinare il valore della condizione al momento della compilazione, lo rimuoverà completamente.
Il secondo caso può essere accettabile. Se la condizione rappresentata da foo()
deve essere testata da più punti del codice, il factoring in una funzione o un metodo separati è spesso la cosa giusta da fare anche se foo()
è sempre vero in questo momento. Se è ipotizzabile che foo()
possa alla fine restituire false
, isolare quella condizione in un metodo o funzione è un modo per identificare tutte le posizioni in cui il codice si basa su tale condizione. Tuttavia , facendo ciò si rischia che la condizione foo() == false
non venga testata e potrebbe causare problemi in seguito; la soluzione è assicurarsi di aggiungere test unitari che testino esplicitamente il caso false
.
- Threads that spin off and do nothing of note.
Questo sembra un artefatto della storia e qualcosa che potrebbe essere identificato durante una revisione del codice o attraverso la profilazione periodica del software. Suppongo che potrebbe essere creato intenzionalmente, ma ho difficoltà a immaginare che qualcuno lo faccia di proposito.