Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!

Замена двунаправленной связи однонаправленной

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

Проблема

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

Решение

Уберите неиспользуемую связь.

До
Change Bidirectional Association to Unidirectional - Before
После
Change Bidirectional Association to Unidirectional - After

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

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

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

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

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

Достоинства

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

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

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

  1. Убедитесь, что один из следующих пунктов справедлив в отношении ваших классов:

    • связь не используется вообще;

    • есть другой способ получить связанный объект, например, используя запрос к базе данных;

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

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

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

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