Тут речь идет о том, что плохо пахнет и что не стоит использовать в коде. Есть еще книга "Рефакторинг" Мартина Фаулера.
❗️ — плохо
✅ — хорошо
Заметки:
Комментарии:
- ❗️ Неуместная информация.
- ❗️ Устаревшие комментарии.
- ❗️ Избыточные комментарии.
- ❗️ Плохо написанный комментарий.
- ❗️ Закомментированный код.
Рабочая среда:
- ❗️ Построение состоит из нескольких этапов.
- ❗️ Тестирование состоит из нескольких этапов (речь о том, что все тесты запускаются одним нажатием или одной командой).
Функции:
- ❗️ Слишком много аргументов.
- ❗️ Выходные аргументы.
- ❗️ Флаги в аргументах.
- ❗️ Мертвые функции (те, которые не используются).
Разное:
- ❗️ Несколько языков в одном исходном файле.
- ❗️ Очевидное поведение не реализовано (не следует принципе наименьшего удивления https://ru.wikipedia.org/wiki/Правило_наименьшего_удивления)
- ❗️ Некорректное граничное поведение.
- ❗️ Отключенные средства безопасности.
- ❗️ Дублирование.
- ❗️ Код на неверном уровне абстракции.
- ❗️ Базовые классы, зависящие от производных.
- ❗️ Слишком много информации.
- ❗️ Мертвый код.
- ❗️ Вертикальное разделение (это про то, что надо объявлять поближе к месту использования).
- ❗️ Непоследовательность.
- ❗️ Балласт.
- ❗️ Искусственные привязки.
- ❗️ Функциональная зависть (для метода не должны быть важны переменные другого класса). Как будто бы метод мечтает находиться в другом классе, чтобы иметь доступ к переменным.
- ❗️ Аргументы-селекторы. Это когда есть метод calculateKittens, который почему-то возвращает true. Лучше несколько функций с хорошими именами.
- ❗️ Непонятные намерения.
- ❗️ Неверное размещение.
- ❗️ Неуместные статические методы. Если сомневаетесь — всегда делайте нестатической.
- ✅ Используйте пояснительные переменные.
- ✅ Имена функций должны описывать выполняемую операцию.
- ✅ Понимание алгоритма. Надо знать и понимать как работает ваш код.
- ✅ Преобразование логических зависимостей в физические.
- ✅ Используйте полиморфизм вместо if-else или switch-case.
- ✅ Соблюдайте стандартные конвенции.
- ✅ Заменяйте волшебные числа именованными константами.
- ✅ Будьте точны.
- ✅ Структура важнее конвенций.
- ✅ Инкапсулируйте условные конструкции.
- ✅ Избегайте отрицательных условий.
- ✅ Функции должны выполнять одну операцию.
- ❗️ Скрытые временные привязки. Если что-то должно вызываться подряд, то надо быть аккуратной, а то в другом месте другой разработчик может вызвать в другом порядке. Поэтому лучше, чтобы функции возвращали аргументы, необходимые для следующих функций.
- ✅ Структура кода должна быть обоснована.
- ✅ Инкапсулируйте граничные условия. Соберите их в одном месте.
- ✅ Функции должны быть написаны на одном уровне абстракции.
- ✅ Храните конфигурационные данные на высоких уровнях.
- ✅ Избегайте транзитивных обращений. Если Мурзик общается с Барсиком, а Барсик дружит с Пушистиком, то Мурзик ничего НЕ должен знать о Пушистике.
Java:
- ✅ Используйте обобщенные директивы импорта.
- ✅ Не наследуйтесь от констант. Наследование не должно использоваться для обхода правил видимости. Используйте статику.
- ✅ Используйте Enum, а не константы.
Имена:
- ✅ Используйте содержательные имена.
- ✅ Выбирайте имена на подходящем уровне абстракции.
- ✅ Не бойтесь использовать названия паттернов и технические штуки в именах.
- ✅ Недвусмысленные имена.
- ✅ Длинные имена для длинных областей видимости.
- ✅ Избегайте кодирования. Никакой венгерской записи и информации о типе в названиях.
- ✅ Имена должны описывать побочные эффекты.
Тесты:
- ❗️ Нехватка тестов — это беда.
- ✅ Используйте средства анализа покрытия кода тестами.
- ✅ Не пропускайте тривиальные тесты.
- ✅❗️ Закомментированные тест — это вопрос для CR, чтобы помогли разобраться с реализацией.
- ✅ Тестируйте граничные условия.
- ✅ Тщательно тестируйте код рядом с ошибками. Если обнаружили одну, то где-то рядом может быть вторая. Они как грибы и живут вместе. :)
- ✅ Закономерности сбоев част несут полезную информацию.
- ✅ Закономерности покрытия кода часто несут полезную информацию.
- ✅ Тесты должны работать быстро.