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

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

Проблема

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

Решение

Добавьте недостающую связь в класс, в котором она отсутствует.
До
Change Unidirectional Association to Bidirectional - Before
После
Change Unidirectional Association to Bidirectional - After

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

Между классами изначально была одностороння связь. Однако с течением времени клиентскому коду потребовался доступ в обе стороны этой связи.

Достоинства

  • Если в классе возникает необходимость в обратной связи, её можно попросту вычислить. Однако, если такие вычисления оказываются довольно сложными, лучше хранить обратную связь.

Недостатки

  • Двусторонние связи гораздо сложнее в реализации и поддержке, чем односторонние.

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

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

  1. Добавьте поле, которое будет содержать обратную связь.

  2. Решите, какой класс будет «управляющим». Этот класс должен содержать методы, которые создают или обновляют связь при добавлении или изменении элементов, устанавливая связь в своём классе, а также вызывая служебные методы установки связи в связываемом объекте.

  3. Создайте служебный метод установки связи в «не управляющем классе». Этот метод должен заполнять поле со связью тем, что ему подают в параметрах. Назовите этот метод так, чтобы было очевидно, что его не стоит использовать в других целях.

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

  5. Если старые методы управления связью находились в «не управляющем классе», создайте управляющие методы в «управляющем классе», вызывайте их и делегируйте им выполнение.

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

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

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

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

Живой пример

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

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

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