3

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

  1. 在会议上有一个方法,我在其中传入 Action 对象,例如“addToMeeting(Action action)”。在会议的内部,然后我将操作链接到会议。对于这种方法,尽管 Meeting 对象需要了解并使用 Action 对象上的方法,但因此变得耦合。
  2. 在会议上有一个方法,我只需传递要链接的操作编号,例如“addToMeeting(int actionID)”。现在很好,会议对象不需要知道任何关于动作的信息,但是......现在将动作添加到会议的代码需要知道如何获取动作 ID,所以已经从这个“meeting.addToMeeting(action)”转向到这个“meeting.addToMeeting(action.getID())”。

对于良好的 OO 设计,应该使用哪种方法?或者有没有第三种方法......

4

4 回答 4

5

如果您计划链接到Meeting实例的唯一想法是动作,那么似乎最适合Meeting意识到Action,而不是相反。

Actions类操纵Meeting中断封装的内部结构,通常会使维护此类代码变得更加困难。所以,我会在这种情况下公开一个addAction(Action a)方法Meeting

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

您可以定义一个接口,例如它公开链接到此类项目所需的必要信息,而不是Meeting了解Action,反之亦然。然后将实现,从而可以执行以下操作:IMeetingItemMeetingActionIMeetingItem

meeting.addItem( action );  // action treated as an IMeetingItem in this context

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

于 2010-12-27T16:24:44.880 回答
1

我建议您使用由 Action 实现的方法 getID() 创建一个接口“可识别”

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

addToMeeting(Identifiable action);

在方法里面做

this.actionId = action.getID();
于 2010-12-27T16:22:40.210 回答
0

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

于 2010-12-27T16:21:32.807 回答
0

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

于 2010-12-27T16:22:22.883 回答