Найти в Дзене

Чистый код. Конспект. Глава 17. Запахи и эвристические правила.

Тут речь идет о том, что плохо пахнет и что не стоит использовать в коде. Есть еще книга "Рефакторинг" Мартина Фаулера.

❗️ — плохо

✅ — хорошо

Заметки:

Комментарии:

  1. ❗️ Неуместная информация.
  2. ❗️ Устаревшие комментарии.
  3. ❗️ Избыточные комментарии.
  4. ❗️ Плохо написанный комментарий.
  5. ❗️ Закомментированный код.

Рабочая среда:

  1. ❗️ Построение состоит из нескольких этапов.
  2. ❗️ Тестирование состоит из нескольких этапов (речь о том, что все тесты запускаются одним нажатием или одной командой).

Функции:

  1. ❗️ Слишком много аргументов.
  2. ❗️ Выходные аргументы.
  3. ❗️ Флаги в аргументах.
  4. ❗️ Мертвые функции (те, которые не используются).

Разное:

  1. ❗️ Несколько языков в одном исходном файле.
  2. ❗️ Очевидное поведение не реализовано (не следует принципе наименьшего удивления https://ru.wikipedia.org/wiki/Правило_наименьшего_удивления)
  3. ❗️ Некорректное граничное поведение.
  4. ❗️ Отключенные средства безопасности.
  5. ❗️ Дублирование.
  6. ❗️ Код на неверном уровне абстракции.
  7. ❗️ Базовые классы, зависящие от производных.
  8. ❗️ Слишком много информации.
  9. ❗️ Мертвый код.
  10. ❗️ Вертикальное разделение (это про то, что надо объявлять поближе к месту использования).
  11. ❗️ Непоследовательность.
  12. ❗️ Балласт.
  13. ❗️ Искусственные привязки.
  14. ❗️ Функциональная зависть (для метода не должны быть важны переменные другого класса). Как будто бы метод мечтает находиться в другом классе, чтобы иметь доступ к переменным.
  15. ❗️ Аргументы-селекторы. Это когда есть метод calculateKittens, который почему-то возвращает true. Лучше несколько функций с хорошими именами.
  16. ❗️ Непонятные намерения.
  17. ❗️ Неверное размещение.
  18. ❗️ Неуместные статические методы. Если сомневаетесь — всегда делайте нестатической.
  19. ✅ Используйте пояснительные переменные.
  20. ✅ Имена функций должны описывать выполняемую операцию.
  21. ✅ Понимание алгоритма. Надо знать и понимать как работает ваш код.
  22. ✅ Преобразование логических зависимостей в физические.
  23. ✅ Используйте полиморфизм вместо if-else или switch-case.
  24. ✅ Соблюдайте стандартные конвенции.
  25. ✅ Заменяйте волшебные числа именованными константами.
  26. ✅ Будьте точны.
  27. ✅ Структура важнее конвенций.
  28. ✅ Инкапсулируйте условные конструкции.
  29. ✅ Избегайте отрицательных условий.
  30. ✅ Функции должны выполнять одну операцию.
  31. ❗️ Скрытые временные привязки. Если что-то должно вызываться подряд, то надо быть аккуратной, а то в другом месте другой разработчик может вызвать в другом порядке. Поэтому лучше, чтобы функции возвращали аргументы, необходимые для следующих функций.
  32. ✅ Структура кода должна быть обоснована.
  33. ✅ Инкапсулируйте граничные условия. Соберите их в одном месте.
  34. ✅ Функции должны быть написаны на одном уровне абстракции.
  35. ✅ Храните конфигурационные данные на высоких уровнях.
  36. ✅ Избегайте транзитивных обращений. Если Мурзик общается с Барсиком, а Барсик дружит с Пушистиком, то Мурзик ничего НЕ должен знать о Пушистике.

Java:

  1. ✅ Используйте обобщенные директивы импорта.
  2. ✅ Не наследуйтесь от констант. Наследование не должно использоваться для обхода правил видимости. Используйте статику.
  3. ✅ Используйте Enum, а не константы.

Имена:

  1. ✅ Используйте содержательные имена.
  2. ✅ Выбирайте имена на подходящем уровне абстракции.
  3. ✅ Не бойтесь использовать названия паттернов и технические штуки в именах.
  4. ✅ Недвусмысленные имена.
  5. ✅ Длинные имена для длинных областей видимости.
  6. ✅ Избегайте кодирования. Никакой венгерской записи и информации о типе в названиях.
  7. ✅ Имена должны описывать побочные эффекты.

Тесты:

  1. ❗️ Нехватка тестов — это беда.
  2. ✅ Используйте средства анализа покрытия кода тестами.
  3. ✅ Не пропускайте тривиальные тесты.
  4. ✅❗️ Закомментированные тест — это вопрос для CR, чтобы помогли разобраться с реализацией.
  5. ✅ Тестируйте граничные условия.
  6. ✅ Тщательно тестируйте код рядом с ошибками. Если обнаружили одну, то где-то рядом может быть вторая. Они как грибы и живут вместе. :)
  7. ✅ Закономерности сбоев част несут полезную информацию.
  8. ✅ Закономерности покрытия кода часто несут полезную информацию.
  9. ✅ Тесты должны работать быстро.