Autumn SALE

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

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

Проблема

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

Решение

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

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

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

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

Достоинства

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

Недостатки

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

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

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

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

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

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

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

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