Запахи кода.
Признаки более глубоких проблем в коде. Каждая статья содержит ссылки на приёмы рефакторинга, которые помогают их устранить.
Два класса выполняют одинаковые функции, но имеют разные названия методов.
Если подкласс использует лишь малую часть унаследованных методов и свойств суперкласса, это является признаком неправильной иерархии. При этом ненужные методы могут просто не использоваться либо быть переопределёнными и выбрасывать исключения.
У вас есть сложный оператор switch или последовательность if-ов.
Временные поля — это поля, которые нужны объекту только при определённых обстоятельствах. Только тогда они заполняются какими-то значениями, оставаясь пустыми в остальное время.
Метод содержит множество поясняющих комментариев.
Классы данных — это классы, которые содержат только поля и простейшие методы для доступа к ним (геттеры и сеттеры). Это просто контейнеры для данных, используемые другими классами. Эти классы не содержат никакой дополнительной функциональности и не могут самостоятельно работать с данными, которыми владеют.
Переменная, параметр, поле, метод или класс больше не используются (чаще всего потому, что устарели).
Два фрагмента кода выглядят почти одинаковыми.
На понимание и поддержку классов всегда требуются затраты времени и денег. А потому, если класс не делает достаточно много, чтобы уделять ему достаточно внимания, он должен быть уничтожен.
Класс, метод, поле или параметр не используются.
Иногда в разных частях кода встречаются одинаковые группы переменных (например, параметры подключения к базе данных). Такие группы следует превращать в самостоятельные классы.
Класс содержит множество полей/методов/строк кода.
Метод содержит слишком большое число строк кода. Длина метода более десяти строк должна начинать вас беспокоить.
Количество параметров метода больше трёх-четырёх.
Элементарные типы используются вместо маленьких объектов для небольших задач (валюта, диапазоны, специальные строки для телефонных номеров и т. п.), константы — для кодирования информации (например, USER_ADMIN_ROLE = 1 для пользователей с правами администратора), а строковые константы — в качестве названий полей в массивах данных.
При внесении изменений в класс приходится изменять большое число различных методов. Например, для добавления нового вида товара вам нужно изменить методы поиска, отображения и заказа товаров.
Всякий раз при создании подкласса какого-то класса приходится создавать ещё один подкласс для другого класса.
При выполнении любых модификаций приходится вносить множество мелких изменений в большое число классов.
Метод обращается к данным другого объекта чаще, чем к собственным данным.
Один класс использует служебные поля и методы другого класса.
Вы видите в коде цепочки вызовов вида a.b().c().d().
Если класс выполняет одно действие — делегирует работу другому классу — стоит задуматься, зачем он вообще существует.