Перемещение функций между объектами
Если вы разместили функциональность по классам не самым удачным образом — это еще не повод отчаиваться.
Рефакторинги этой группы показывают как безопасно перемещать функциональность из одних классов в другие, создавать новые классы, а также скрывать детали реализации из публичного доступа.
Проблема: Метод используется в другом классе больше, чем в собственном.
Решение: Создайте новый метод в классе, который использует его больше других, и перенесите туда код из старого метода. Код оригинального метода превратите в обращение к новому методу в другом классе либо уберите его вообще.
Проблема: Поле используется в другом классе больше, чем в собственном.
Решение: Создайте поле в новом классе и перенаправьте к нему всех пользователей старого поля.
Проблема: Один класс работает за двоих.
Решение: Создайте новый класс, переместите в него поля и методы, отвечающие за определённую функциональность.
Проблема: Класс почти ничего не делает, ни за что не отвечает, и никакой ответственности для этого класса не планируется.
Решение: Переместите все фичи из описанного класса в другой.
Проблема: Клиент получает объект B из поля или метода объекта А. Затем клиент вызывает какой-то метод объекта B.
Решение: Создайте новый метод в классе А, который бы делегировал вызов объекту B. Таким образом, клиент перестанет знать о классе В и зависеть от него.
Проблема: Класс имеет слишком много методов, которые просто делегируют работу другим объектам.
Решение: Удалите эти методы и заставьте клиента вызывать конечные методы напрямую.
Проблема: Служебный класс не содержит метода, который вам нужен, при этом у вас нет возможности добавить метод в этот класс.
Решение: Добавьте метод в клиентский класс и передавайте в него объект служебного класса в качестве аргумента.
Проблема: В служебном классе отсутствуют некоторые методы, которые вам нужны. При этом добавить их в этот класс вы не можете.
Решение: Создайте новый класс, который бы содержал эти методы, и сделайте его наследником служебного класса, либо его обёрткой.