Что делать с бессмысленными функциями в коде?
Что проверяют
Отличаете ли вы мёртвый код от кода, смысла которого вы просто не поняли, и есть ли у вас безопасная процедура удаления. Вопрос про аккуратность: удалять легко, а восстанавливать связи, которых не увидел поиск по проекту, тяжело.
Как отвечать
Сначала классификация. Бессмысленная функция бывает трёх видов: её никто не вызывает; она вызывается, но ничего не меняет; и третий случай, когда она нужна, а причина неочевидна.
Дальше проверка, что вызовов действительно нет:
- поиск по имени во всём репозитории, включая тесты и конфиги;
- инструмент для неиспользуемых экспортов, например
knipилиts-prune; - покрытие: строка, ни разу не выполненная ни на тестах, ни в проде, это кандидат на удаление.
Обязательно перечислите ловушки: вызов по имени из строки, реэкспорт в публичном интерфейсе пакета, точка расширения для внешних потребителей, обёртка ради стабильной сигнатуры. В React есть своя категория: useCallback выглядит лишним, но держит стабильную ссылку для React.memo или для зависимостей эффекта, и его удаление добавляет лишние перерисовки.
Процедура: удалять, а не комментировать, отдельным коммитом и не вперемешку с фичей, сомнительное согласовывать с автором кода. Git помнит удалённое, закомментированный блок не помнит никто.
Где спотыкаются
Обещают прирост скорости. Неиспользуемый код сборщик и так отрезает при tree shaking, выигрыш от чистки в читаемости и иногда в размере бандла, а не в скорости выполнения. Обещание производительности на ревью сразу вызывает вопрос, чем оно измерено.
Полагаются на линтер целиком. Правило про неиспользуемые переменные работает в границах модуля, а экспортированную функцию, которую никто не импортирует, оно не увидит: для этого нужен отдельный инструмент.
Делают чистку одним коммитом с фичей. Ревью такого диффа превращается в угадайку, а откат фичи возвращает весь мусор обратно. Рядом живёт крайность в другую сторону: закомментировать вместо удаления и оставить кладбище блоков, которое читает каждый следующий разработчик.