- Виклики методу або функції, які нічого не мають значення.
Не обов’язково погано. Методи базового класу часто називають порожніми методами, які мають на увазі як заміщення точок для підкласів. Приклад: UIView Cocoa Touch має -didAddSubview:
метод, задокументований як нічого не робити у версії за замовчуванням. -addSubview:
Метод UIView повинен викликати, -didAddSubview:
хоча він нічого не робить, оскільки підкласи можуть його реалізувати, щоб зробити щось. Методи, які нічого не роблять, і причини для них повинні бути задокументовані, звичайно.
Якщо порожня або непотрібна функція / метод, очевидно, є з історичних причин, її слід вирізати. Перегляньте більш ранні версії коду у сховищі вихідного коду, якщо ви не впевнені.
- Надмірні перевірки, виконані в окремому файлі, об'єкті чи методі класу.
Важко сказати, чи нормально це без певного контексту. Якщо перевірки чітко зроблені з тієї ж причини, це може означати, що немає чіткого розподілу обов'язків і вимагається деякий рефакторинг, особливо коли обидві перевірки призводять до однакових дій. Якщо дія, що є результатом обох перевірок, не однакова, то дві перевірки, ймовірно, робляться з різних причин, навіть якщо умова однакова, і це, ймовірно, добре.
- якщо твердження, які завжди оцінюють як істинні.
Існує велика різниця між:
if (1) {
// ...
}
і:
if (foo() == true) {
// ...
}
куди foo()
трапляється завжди повертатися true
.
Перший випадок трапляється багато, коли люди налагоджують. Це легко використовувати if (0) {...
для тимчасового видалення шматка коду, коли ви намагаєтесь виділити помилку, а потім змінити 0
на, 1
щоб відновити цей код. if
Повинно бути видалено , як тільки ви зробили, звичайно, але це легко забути цей крок, або пропустити один або два , якщо ви зробили це в декількох місцях. (Це гарна ідея ототожнювати такі умови з коментарем, який можна пізніше шукати.) Єдина шкода - це плутанина, яка може спричинити в майбутньому; якщо компілятор може визначити значення умови під час компіляції, він видалить його повністю.
Другий випадок може бути прийнятним. Якщо умову, представлену foo()
потребою, потрібно перевірити з декількох місць у коді, часто розбиваючи їх на окрему функцію чи метод, це часто правильна річ, навіть якщо зараз це foo()
завжди відповідає дійсності. Якщо можливо, що foo()
врешті-решт повернеться false
, то виділення цієї умови методом чи функцією - це один із способів визначити всі місця, де код покладається на цю умову. Однак це робить певний ризик того, що foo() == false
умова залишиться неперевіреною і може призвести до проблем пізніше; рішення полягає в тому, щоб переконатися, що ви додаєте одиничні тести, які явно перевіряють цей false
випадок.
- Нитки, які відкручуються і нічого не роблять.
Це звучить як артефакт історії, і щось, що можна було б ідентифікувати або під час перегляду коду, або за допомогою періодичного профілювання програмного забезпечення. Я гадаю, це може бути створене навмисно, але мені важко уявити, що хтось насправді зробить це задумано.
if (false) {...}
блоки чудово підходять для коментування коду! </sarcasm>