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