Заміна одностороннього зв'язку двонаправленим
Проблема
У вас є два класи, яким потрібно використовувати фічі один одного, але між ними існує тільки односторонній зв’язок.
Рішення
Додайте бракуючий зв’язок у клас, в якому він відсутній.
Причини рефакторингу
Між класами спочатку був односторонній зв’язок. Проте з часом клієнтському коду знадобився доступ в обидві сторони цього зв’язку.
Переваги
- Якщо в класі виникає необхідність в зворотньому зв’язку, її можна просто вичислити. Проте, якщо такі обчислення виявляються досить складними, краще зберігати зворотній зв’язок.
Недоліки
-
Двосторонні зв’язки набагато складніші в реалізації і підтримці, ніж односторонні.
-
Двосторонні зв’язки роблять класи залежними один від одного. При односторонньому зв’язку один з них можна було використовувати окремо від іншого.
Порядок рефакторингу
-
Додайте поле, яке міститиме зворотний зв’язок.
-
Вирішіть, який клас буде керуючим. Цей клас повинен містити методи, які створюють або оновлюють зв’язок при додаванні або зміні елементів, встановлюючи зв’язок у своєму класі, а також викликаючи службові методи установки зв’язку в зв’язуваному об’єкті.
-
Створіть службовий метод установки зв’язку в керуючому класі. Цей метод повинен заповнювати поле із зв’язком тим, що йому подають в параметрах. Назвіть цей метод так, щоби було зрозуміло, що його не варто використовувати в інших цілях.
-
Якщо старі методи управління одностороннім зв’язком знаходилися в керуючому класі, доповніть їх викликами службових методів із зв’язуваного об’єкта.
-
Якщо старі методи управління зв’язком знаходилися в керуючому класі, створіть методи управління в керуючому класі, викликайте їх і делегуйте їм виконання.