Альтернативные классы с разными интерфейсами
Симптомы и признаки
Два класса выполняют одинаковые функции, но имеют разные названия методов.
![](/images/refactoring/content/smells/alternative-classes-with-different-interfaces-01.png?id=e5fccb2e5390e0a62b5c9f56029bd361)
Причины появления
Программист, который создал один из классов, скорей всего, не знал о том, что в программе уже существует аналогичный по функциям класс.
Лечение
Постарайтесь привести интерфейс классов к общему знаменателю:
-
Переименуйте методы так, чтобы они стали одинаковыми во всех альтернативных классах.
-
Используйте перемещение метода, добавление параметра и параметризацию метода для того, чтобы сигнатура и реализация методов стали одинаковыми.
-
Если только часть функциональности классов идентична, попробуйте извлечь эту часть в общий суперкласс. Существующие классы в этом случае станут подклассами.
-
После того как вы определились с вариантом «лечения» и осуществили его, подумайте, возможно, один из классов теперь можно удалить.
Выигрыш
-
Вы избавляетесь от ненужного дублирования кода, и, таким образом, уменьшаете его размер.
-
Повышается читабельность кода, улучшается его понимание. Вам больше не придется гадать, зачем создавался второй класс, выполняющий точно такие же функции, как и первый.
![](/images/refactoring/content/smells/alternative-classes-with-different-interfaces-02.png?id=669874e082965799a70076a120288c6a)
Не стоит трогать, если...
- Иногда объединить классы оказывается невозможно либо настолько сложно, что смысла заниматься этой работой нет. Один из примеров — альтернативные классы находятся в двух разных библиотеках, каждая из которых имеет свою версию класса.