在OO设计中耦合

时间:2010-12-27 16:17:08

标签: coupling oop

我有两个对象。会议对象和Action对象(在会议中引发的操作)。行动也可以独立于会议而存在。我有两种方法将提出的行动与会议联系起来:

  1. 有一个方法会议我在哪里 传入Action对象,如 “addToMeeting(动作动作)”。 在会议的内部 然后我将动作链接到 会议。对于这种方法虽然如此 会议对象需要了解 并使用Action上的方法 对象因此变得耦合。
  2. 在我刚刚通过的会议上有一个方法 要链接的动作号码 as“addToMeeting(int actionID)”。 好现在会议对象没有 需要了解有关Action的任何信息 但......现在代码添加了 会议的行动需要知道 如何获得动作ID 转过身来 “meeting.addToMeeting(action)”来 这个 “meeting.addToMeeting(action.getID())”。
  3. 对于良好的OO设计,应该使用哪种方法?还是有第三种方式......

4 个答案:

答案 0 :(得分:5)

如果只考虑您计划链接到Meeting个实例的行为,那么让Meeting了解Action而不是其他Actions似乎是最合适的。四处走走。

Meeting类操作addAction(Action a)的内部中断会破坏封装,并且通常会使维护此类代码变得更加困难。因此,在这种情况下,我会在Meeting上公开方法Meeting

但是,如果还有其他可以链接到会议的内容,您可能需要考虑抽象“会议项目”的概念。

您可以定义Action这样的接口,而不是让IMeetingItem了解Meeting,而不是Action,这些接口会公开IMeetingItem需要链接的必要信息这些物品。然后meeting.addItem( action ); // action treated as an IMeetingItem in this context 会实施Meeting,从而可以执行以下操作:

{{1}}

请注意,在这两种方法中,{{1}}类调解向自身添加项目的功能,而不是让添加的项目操纵会议的内部表示。

答案 1 :(得分:1)

我建议您使用方法getID()创建一个“Identifiable”接口,该接口由Action实现

然后您可以执行以下操作:

addToMeeting(Identifiable action);

并在方法内部执行

this.actionId = action.getID();

答案 2 :(得分:0)

只要会议以任何方式与行动相关联,您就会有一些耦合。但是,您可以考虑采用第三种方法来构建生成操作对象的“动作工厂”。一旦创建(并且可能保存),ID就是Action对象上的属性。所有会议都会告诉工厂生成一个动作,并能够访问动作的ID属性。

答案 3 :(得分:0)

我会选择#1 - 在你的情况下,耦合并不是坏事,因为对象之间存在明确的关系。我会选择#1。这使您可以选择会议具有MeetingActions[]或类似的属性。