比如说我有一个通过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
答案 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];
}
简单但有效。不需要过于复杂化。