Также известен как Change Bidirectional Association to Unidirectional

Рефакторинг Замена двунаправленной связи однонаправленной

Проблема

У вас есть двухсторонняя связь между классами, но один из классов больше не использует фичи другого.

Решение

Уберите неиспользуемую связь.
До
Change Bidirectional Association to Unidirectional - Before
После
Change Bidirectional Association to Unidirectional - After

Причины рефакторинга

Двустороннюю связь, как правило, сложнее поддерживать, чем одностороннюю. Такая связь требует наличия дополнительного кода, который бы отслеживал корректное создание и удаление связанных объектов, что приводит к усложнению программы.

Кроме того, неправильно реализованная двусторонняя связь может приводить к проблемам с «очисткой мусора», т.е. освобождения памяти, занятой неиспользуемыми объектами.

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

Кроме того, существует проблема тесной зависимости между классами. Двусторонняя связь предполагает, что два класса должны знать друг о друге, а значит, такие классы невозможно использовать отдельно друг от друга. Наличие множества таких двусторонних связей приводит к тому, что части программы становятся слишком тесно связанными, и любое изменение в одном из компонентов приводит к необходимости менять другие компоненты программы.

Достоинства

  • Упрощает код класса, которому не нужна связь. Меньше кода — проще поддержка.

  • Уменьшает зависимость между классами. Независимые классы проще поддерживать, т.к. изменения в них затрагивают только эти классы.

Порядок рефакторинга

  1. Убедитесь, что один из следующих пунктов справедлив в отношении ваших классов:
  • связь не используется вообще;
  • есть другой способ получить связанный объект, например, используя запрос к базе данных;
  • связанный объект может быть передан как аргумент в методы, которые используют его.
  1. Избавьтесь от использование поля, содержащего связь с другим объектом. Проще всего заменить такую связь передачей нужного объекта в параметрах метода.

  2. Удалите код присваивания связанного объекта полю.

  3. Удалите неиспользуемое теперь поле.

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш новый интерактивный курс по рефакторингу. Он более информативный и гораздо более интересный, чем банальный текст.

Узнать больше...

Живой пример

Первый раз здесь? Ничего страшного!

У нас здесь всё просто – интерактивный пример очень похож на видео (но выглядит гораздо круче).

  1. После начала проигрывания, вам показываются разнообразные подсказки и сообщения. Вы продвигаетесь дальше, кликая на них.
  2. Вы можете перематывать шаги, используя стрелки слева.
  3. Кроме того, вы можете посмотреть разницу между первоначальным и получившимся кодом, нажав кнопку с глазом ().
  4. Кнопка компиляции () позвоялет проверить текущий код на наличие ошибок.