В книгах Мартина Фаулера он всегда говорил о чистом коде и хорошо спроектированном коде, потом в 1999 году он написал книгу под названием «Рефакторинг», рекомендую прочитать 2-е издание, написанное в 2018 году.
Итак, что такое запахи кода?
Запах кода — это любая характеристика исходного кода программы, которая может указывать на более глубокую проблему. Определение того, что является запахом кода, а что нет, является субъективным и зависит от языка, разработчика и методологии разработки.
Термин был популяризирован Кентом Беком на WardsWiki в конце 1990-х. Использование этого термина увеличилось после того, как он был показан в книге «Рефакторинг» 1999 года.
Теперь давайте кратко упомянем 22 наиболее распространенных запаха кода:
- Повторяющийся код:
- Одна и та же структура кода в нескольких местах.
- Совет: всегда прислушивайтесь к предупреждениям 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. Комментарии:
Не все комментарии, а те, что есть, потому что код плохой.