Представьте себе эти отношения:
- 1 А имеет много Б
- 1 B имеет много C ...
В обратном порядке:
- C имеет 1 B
- B имеет 1A
- По транзитивности, C имеет 1 A
Чтобы смоделировать это отношение в БД, мы имеем:
TableA
a_id
TableB
b_id
a_id (fk to TableA)
TableC
c_id
b_id (fk to TableB)
Чтобы смоделировать эти отношения в ОО, мы имеем:
objA
objB
objC
И ...
- objB имеет ссылку на objA
- objC имеет ссылку на objB
Если у objC есть метод, который должен вызывать метод objA, что вы будете делать?
Вариант 1.
b.getA().runMethodX()
Множество людей, которых я знаю, делали бы это, но я также узнал, что это нехорошо, потому что getA () не является поведением B в чисто ОО смысле. Это похоже на процедурное программирование. Совпадают / Не
Вариант 2.
Пусть objC имеет прямую ссылку на objA и objB через инжектор / установщик конструктора
Это хорошая идея? но затем objB, на который ссылается objC, также имеет ссылку на objA. Это нормально? Или, если это не случай циклических ссылок на объекты, это приемлемо?
Вариант 3.
Переместите рассматриваемый метод в objA и передайте objC по параметру.
Я не уверен, рассматривает ли это как вариант. Я думаю, что это не сработает в каждом случае. Пусть метод в objC сведен к минимуму, который работает только для его состояний, и пусть objA сделает все, что нужно objA, до или после.
Вариант 4. (Делегация)
добавить runMethodXinA () к B, он вызывает
a.runMethodX()
C звонки
b.runMethodXinA()
Я пробовал этот метод раньше, но B, скорее всего, будет иметь столько же методов, что и A, и не будет ли один метод в B и A нарушать DRY?
Что вы, хотя? Есть еще варианты? Комментарии? Предложения?