В книгах Мартина Фаулера он всегда говорил о чистом коде и хорошо спроектированном коде, потом в 1999 году он написал книгу под названием «Рефакторинг», рекомендую прочитать 2-е издание, написанное в 2018 году.

Итак, что такое запахи кода?

Запах кода — это любая характеристика исходного кода программы, которая может указывать на более глубокую проблему. Определение того, что является запахом кода, а что нет, является субъективным и зависит от языка, разработчика и методологии разработки.

Термин был популяризирован Кентом Беком на WardsWiki в конце 1990-х. Использование этого термина увеличилось после того, как он был показан в книге «Рефакторинг» 1999 года.

Теперь давайте кратко упомянем 22 наиболее распространенных запаха кода:

  1. Повторяющийся код:
  • Одна и та же структура кода в нескольких местах.
  • Совет: всегда прислушивайтесь к предупреждениям IDE.

2. Длинный метод:

  • Чем длиннее процедура, тем сложнее ее понять.
  • SonarLint поможет вам избежать этого.

3. Большие классы: когда класс пытается сделать слишком много, дублированный код не может быть далеко позади, я лично в 2016 году работал над классом, который имеет более 50 000 строк кода, просто это была катастрофа.

4. Длинный список параметров:

Они трудны для понимания, непоследовательны и сложны в использовании.

5. Дивергентное изменение: когда один класс обычно изменяется по-разному по разным причинам.

6. Хирургия дробовика:Каждый раз, когда вы вносите какие-то изменения, вам приходится вносить множество мелких изменений во множество разных классов.

7. Feature Envy: метод, который кажется более заинтересованным в классе, отличном от того, в котором он находится.

8. Сгустки данных: сгустки данных (поля, параметры…), которые висят вместе.

9. Первобытная одержимость:

  • Чрезмерное использование примитивных типов для представления ваших моделей данных.
  • Соберите связанные поля в объекте, POJO — ваши друзья.

10. Операторы Switch:

  • Относится к использованию операторов switch с кодом типа для получения другого поведения или данных вместо использования подклассов и полиморфизма.
  • Для рефакторинга просто используйте/уважайте полиморфизм.

11. Иерархии параллельного наследования:

  • Каждый раз, когда вы создаете подкласс одного класса, вы также должны создавать подкласс другого.
  • Другими словами, этот запах возникает, когда дерево наследования зависит от другого дерева наследования по составу, и они поддерживают особые отношения, когда один подкласс зависимого наследования должен зависеть от одного конкретного подкласса другого Наследования.
  • Наиболее распространенный способ рефакторинга стратегии — использование методов «Метод перемещения» и «Поле перемещения».

12. Ленивый класс:

  • Курс, который не делает достаточно, чтобы окупить себя, считается «недостаточно используемым».
  • Просто этот класс надо ликвидировать.

13. Спекулятивная универсальность: всевозможные крючки и специальные случаи для обработки вещей, которые не требуются.

14. Временное поле: переменная экземпляра устанавливается только в определенных обстоятельствах.

15. Цепочка сообщений:

  • возникает, когда класс (класс A), чтобы получить некоторые данные от класса D, должен получить доступ к классу B и использовать его для доступа к классу C, а также использовать класс C для доступа к классу D.
  • Способ избежать этого состоит в том, что класс A становится зависимым от реализации промежуточных классов (классов B и C).
  • Для проведения рефакторинга необходимо использовать шаблон рефакторинга Скрыть делегата.

16. Средний человек:

  • Средний человек — это класс, ответственный, главным образом, за делегирование полномочий.
  • Класс с запахом посредника увеличивает сложность кода, не влияя на функциональность программы, а также позволяет коду избегать логических потоков данных, основанных на отношениях между классами.

17. Неуместная близость:

18. Альтернативные классы с разными интерфейсами:

  • Этот запах кода возникает, когда два класса похожи внутри, но отличаются снаружи, то есть код похож или почти идентичен, но имя метода или сигнатура метода немного отличаются.
  • Для восстановления можно использовать интерфейс.

19. Неполный библиотечный класс:

  • Когда нам нужны дополнительные функции в библиотеках.
  • Вы можете реорганизовать это, введя несколько методов в библиотечный класс.

20. Класс данных:

Не допускайте манипуляций в классах данных. Используйте инкапсуляцию и неизменность.

21. Отказ в завещании:

Подклассы, которые не используют родительские методы.

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

Не все комментарии, а те, что есть, потому что код плохой.