- Methoden- oder Funktionsaufrufe, die keinen Wert haben.
Nicht unbedingt schlecht. Methoden in einer Basisklasse rufen häufig leere Methoden auf, die als Überschreibungspunkte für Unterklassen gedacht sind. Beispiel: UIView von Cocoa Touch verfügt über eine -didAddSubview:
Methode, bei der in der Standardversion dokumentiert ist , dass sie nichts tut. Die -addSubview:
Methode von UIView muss aufgerufen werden -didAddSubview:
, obwohl sie nichts tut, da Unterklassen sie möglicherweise implementieren, um etwas zu tun. Methoden, die nichts tun, und die Gründe dafür sollten natürlich dokumentiert werden.
Wenn eine leere oder nutzlose Funktion / Methode aus historischen Gründen offensichtlich vorhanden ist, sollte sie entfernt werden. Schauen Sie sich frühere Versionen des Codes in Ihrem Quellcode-Repository an, wenn Sie sich nicht sicher sind.
- Redundante Prüfungen in einer separaten Klassendatei, einem Objekt oder einer Methode.
Schwer zu sagen, ob das ohne Kontext in Ordnung ist. Wenn die Überprüfungen eindeutig aus demselben Grund durchgeführt werden, kann dies bedeuten, dass die Zuständigkeiten nicht klar voneinander getrennt sind und eine Umgestaltung erforderlich ist, insbesondere, wenn beide Überprüfungen dazu führen, dass dieselbe Maßnahme ergriffen wird. Wenn die Aktion, die sich aus beiden Überprüfungen ergibt, nicht gleich ist, werden die beiden Überprüfungen wahrscheinlich aus unterschiedlichen Gründen durchgeführt, auch wenn die Bedingung gleich ist, und das ist wahrscheinlich in Ordnung.
- if-Anweisungen, die immer true ergeben.
Es gibt einen großen Unterschied zwischen:
if (1) {
// ...
}
und:
if (foo() == true) {
// ...
}
wo foo()
passiert immer wieder zurückkehren true
.
Der erste Fall passiert oft, wenn Leute debuggen. Es ist einfach , eine zu verwenden , if (0) {...
um vorübergehend ein Stück Code zu entfernen , während Sie versuchen , einen Fehler zu isolieren und dann die Änderung 0
auf 1
diesen Code wiederherzustellen. Das if
sollte natürlich entfernt werden, wenn Sie fertig sind, aber es ist leicht, diesen Schritt zu vergessen oder ein oder zwei zu verpassen, wenn Sie es an mehreren Stellen getan haben. (Es ist eine gute Idee, solche Bedingungen mit einem Kommentar zu kennzeichnen, nach dem Sie später suchen können.) Der einzige Schaden ist die Verwirrung, die dies in Zukunft verursachen könnte. Wenn der Compiler den Wert der Bedingung zur Kompilierungszeit ermitteln kann, wird er vollständig entfernt.
Der zweite Fall kann akzeptabel sein. Wenn die durch dargestellte Bedingung foo()
an mehreren Stellen im Code getestet werden muss, ist es oft das Richtige, sie in eine separate Funktion oder Methode zu zerlegen, auch wenn sie gerade foo()
immer wahr ist. Wenn es vorstellbar ist, dass foo()
es irgendwann zu einer Rückkehr kommt false
, können Sie durch Isolieren dieser Bedingung in einer Methode oder Funktion alle Stellen identifizieren, an denen sich der Code auf diese Bedingung stützt. Dies birgt jedoch das Risiko, dass die foo() == false
Bedingung nicht getestet wird und später zu Problemen führen kann. Die Lösung besteht darin, sicherzustellen, dass Sie Komponententests hinzufügen, die den false
Fall explizit testen .
- Fäden, die sich abspinnen und nichts Besonderes tun.
Dies klingt nach einem historischen Artefakt, das entweder während einer Codeüberprüfung oder durch regelmäßige Profilerstellung der Software identifiziert werden kann. Ich nehme an, es könnte absichtlich erstellt werden, aber es fällt mir schwer, mir vorzustellen, dass jemand das absichtlich tun würde.
if (false) {...}
Blöcke eignen sich hervorragend zum Auskommentieren von Code! </