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