Autumn SALE

Заміна одностороннього зв'язку двонаправленим

Також відомий як: Change Unidirectional Association to Bidirectional

Проблема

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

Рішення

Додайте бракуючий зв’язок у клас, в якому він відсутній.

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

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

Між класами спочатку був односторонній зв’язок. Проте з часом клієнтському коду знадобився доступ в обидві сторони цього зв’язку.

Переваги

  • Якщо в класі виникає необхідність в зворотньому зв’язку, її можна просто вичислити. Проте, якщо такі обчислення виявляються досить складними, краще зберігати зворотній зв’язок.

Недоліки

  • Двосторонні зв’язки набагато складніші в реалізації і підтримці, ніж односторонні.

  • Двосторонні зв’язки роблять класи залежними один від одного. При односторонньому зв’язку один з них можна було використовувати окремо від іншого.

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

  1. Додайте поле, яке міститиме зворотний зв’язок.

  2. Вирішіть, який клас буде керуючим. Цей клас повинен містити методи, які створюють або оновлюють зв’язок при додаванні або зміні елементів, встановлюючи зв’язок у своєму класі, а також викликаючи службові методи установки зв’язку в зв’язуваному об’єкті.

  3. Створіть службовий метод установки зв’язку в керуючому класі. Цей метод повинен заповнювати поле із зв’язком тим, що йому подають в параметрах. Назвіть цей метод так, щоби було зрозуміло, що його не варто використовувати в інших цілях.

  4. Якщо старі методи управління одностороннім зв’язком знаходилися в керуючому класі, доповніть їх викликами службових методів із зв’язуваного об’єкта.

  5. Якщо старі методи управління зв’язком знаходилися в керуючому класі, створіть методи управління в керуючому класі, викликайте їх і делегуйте їм виконання.