想象一下这些关系:
- 1 A 有很多 B
- 1B有很多C...
相反:
- C有1个B
- B有1A
- 通过传递性,C 有 1 A
为了在 DB 中建模这种关系,我们有:
TableA
a_id
TableB
b_id
a_id (fk to TableA)
TableC
c_id
b_id (fk to TableB)
为了在 OO 中建模这种关系,我们有:
objA
objB
objC
并且... - objB 引用了 objA - objC 引用了 objB
如果objC有一个方法需要调用objA的一个方法,你会怎么做?
选项1。
b.getA().runMethodX()
我知道很多人会这样做,但我也知道这不好,因为 getA() 不是纯面向对象意义上的 B 行为。这样做就像进行过程编程一样。同意不同意?
选项 2。
让objC通过构造函数注入/setter直接引用objA和objB
这是一个好主意吗?但随后 objC 引用的 objB 也引用了 objA。这个可以吗?或者只要不是循环对象引用的情况,就可以接受?
选项 3。
将有问题的方法移动到objA,并通过参数传入objC。
我不确定这是否是一种选择。我认为它不会在所有情况下都有效。让 objC 中的方法减少到仅适用于其状态的最低限度,并让 objA 做 objA 之前或之后需要做的任何事情。
选项 4. (代表团)
将 runMethodXinA() 添加到 B,它调用
a.runMethodX()
C 调用
b.runMethodXinA()
我之前尝试过这种方法,但是 B 很可能最终会拥有与 A 一样多的方法,并且 B 和 A 中没有 1 个方法违反 DRY?
你的虽然是什么?还有其他选择吗?评论?建议?