- Wywołania metod lub funkcji, które nie mają żadnej wartości.
Niekoniecznie źle. Metody w klasie bazowej często wywołują puste metody, które mają służyć jako punkty zastępujące podklasy. Przykład: UIView Cocoa Touch ma -didAddSubview:
metodę udokumentowaną jako brak działania w wersji domyślnej. -addSubview:
Metoda UIView musi wywoływać, -didAddSubview:
nawet jeśli nic nie robi, ponieważ podklasy mogą ją zaimplementować, aby coś zrobić. Metody, które nic nie robią i ich powody powinny być oczywiście udokumentowane.
Jeśli pusta lub bezużyteczna funkcja / metoda jest oczywiście dostępna z przyczyn historycznych, należy ją wyciąć. Jeśli nie jesteś pewien, spójrz na wcześniejsze wersje kodu w repozytorium kodu źródłowego.
- Nadmiarowe kontrole wykonane w osobnym pliku klasy, obiekcie lub metodzie.
Trudno powiedzieć, czy to w porządku bez kontekstu. Jeżeli kontrole są wyraźnie wykonywane z tego samego powodu, może to oznaczać, że nie ma wyraźnego podziału obowiązków i konieczne jest dokonanie refaktoryzacji, szczególnie gdy obie kontrole skutkują tym samym działaniem. Jeśli akcja wynikająca z obu kontroli nie jest taka sama, to prawdopodobnie dwie kontrole są wykonywane z różnych powodów, nawet jeśli warunek jest taki sam, i prawdopodobnie jest to w porządku.
- jeśli instrukcje, które zawsze mają wartość true.
Istnieje duża różnica między:
if (1) {
// ...
}
i:
if (foo() == true) {
// ...
}
gdzie foo()
zdarza się zawsze wracać true
.
Pierwszy przypadek zdarza się często, gdy ludzie debugują. Łatwo jest użyć if (0) {...
tymczasowo usunąć kawałek kodu, podczas gdy starasz się wyizolować problem, a następnie zmienić 0
na 1
przywrócenie tego kodu. if
Powinny zostać usunięte po skończysz, oczywiście, ale to łatwo zapomnieć, że krok, albo do pominięcia jednej lub dwóch, jeśli zrobiłeś to w kilku miejscach. (Dobrym pomysłem jest identyfikowanie takich warunków z komentarzem, który można później wyszukać). Jedyną szkodą jest zamieszanie, które może powodować w przyszłości; jeśli kompilator może określić wartość warunku w czasie kompilacji, usunie go całkowicie.
Drugi przypadek może być do zaakceptowania. Jeśli warunek reprezentowany przez foo()
musi zostać przetestowany z kilku miejsc w kodzie, faktoryzacja go w osobnej funkcji lub metodzie jest często słuszna, nawet jeśli foo()
zawsze dzieje się tak teraz. Jeśli można sobie wyobrazić, że foo()
może to w końcu powrócić false
, to izolowanie tego warunku w metodzie lub funkcji jest jednym ze sposobów identyfikacji wszystkich miejsc, w których kod opiera się na tym warunku. Takie postępowanie stwarza jednak pewne ryzyko, że foo() == false
stan ten nie zostanie przetestowany i może później spowodować problemy; rozwiązaniem jest upewnienie się, że dodano testy jednostkowe, które jawnie testują false
obudowę.
- Wątki, które się spinają i nic nie znaczą.
Brzmi to jak artefakt historii i coś, co można zidentyfikować podczas przeglądu kodu lub poprzez okresowe profilowanie oprogramowania. Przypuszczam, że można to zrobić celowo, ale trudno mi sobie wyobrazić, że ktoś faktycznie zrobiłby to celowo.
if (false) {...}
bloki świetnie nadają się do komentowania kodu! </sarcasm>