带ID的OO设计问题

时间:2009-12-24 15:58:13

标签: java oop

比如说我有一个通过Race类参加比赛的Player类。这些比赛的数量是固定的,并加载到一个可以静态访问的数组中。

我的问题是Player类是否应该有一个索引ID号,然后需要调用静态函数getRaceByID(int)来检索Race类来进行一些内部计算。现在,如果我要直接在Player类中使用种族参考,那么我可以解决这个问题,但是将播放器保存到文件会变得有问题。我只希望将Race的引用与Player数据一起存储。就像一个ID。

我想避免存储Race数据的副本,而只是引用它。有什么我应该做的不同吗?是否有任何模式可以解决这样的问题?数据库处理ID,但它在OO开发中似乎不能很好地工作。感谢任何帮助。谢谢。


class Player
{
  Race race;
}

在这种情况下,我需要将此种族与我的静态数组中的种族进行比较,以便我可以正确地写出索引ID。另一种解决方案是将ID存储在Race类中,以便我可以直接从Race类中引用它,如下所示:

race.getID();

或者用这样的东西来加强这种关系会更好:

class Player
{
  int raceID;
}

Race r = MyFile.getRaceByID(raceID);

// can now use race

3 个答案:

答案 0 :(得分:1)

您在内存中拥有的内容不一定是您在数据库中存储的内容。

详细信息取决于您使用的语言和对象到数据库技术。

如果你有

Player {
     Race myRace;
     // etc
}

这并不一定意味着您拥有Race的副本,在某些语言中,这意味着对比赛的“引用”或“指针”。

当你来存储数据库时,只存储比赛的ID是很正常的。

换句话说,您不需要牺牲OO设计来达到您想要的效果。

答案 1 :(得分:0)

在OO设计中使用ID的一些相关性:Alexandrescu的 Modern C++ Design 在对象工厂方面有一个很好的章节。如果您的ID上有一个很大的switch语句,那么您可能会从阅读本章中受益,因为它将向您展示处理这类事情的OO方式。正如书中所说:

  

形状绘图示例[of   多态性]经常   在C ++书籍中遇到过,包括   Bjarne Stroustrup的经典之作   (Stroustrup 1997)。但是,大多数   介绍性的C ++书籍何时停止   来自文件加载图形,   正是因为好的模特   有单独的绘图对象   休息....一个简单的实现   是要求每个Shape派生   用于保存整数标识符的对象   在一开始。每个对象   应该有自己独特的ID。然后   读取文件看起来像这样:

     

[大开关代码]

     

....唯一的   问题[与这种类型的代码]是它   打破了最重要的规则   面向对象:[E.G.,]它   收集在一个源文件中   关于所有Shape派生的知识   课程中的课程......

答案 2 :(得分:-1)

基于ID的概念没有理由不起作用。它不违反任何OO原则,并且有几个好处。我认为没有理由不去那条路,特别是如果你已经确定它适合你的话。

顺便说一句,如果你想避免在你的代码中散布static_races[player.race_id],一个简单的包装函数就足以维持一个更“OO的感觉”(Psudocode,因为你没有说过一种语言:< / p>

function Race Player::GetRace() {
    return static_races[this.race_id];
}

简单但有效。不需要过于复杂化。