我试图制作战舰游戏(参见维基百科:战舰_(游戏))。
我有Player
班,Grid
班和Ship
班。
每个玩家都有一个网格,每个玩家都有一套生活在网格上的船只。
我如何知道是否制作播放器或网格的Ships成员集?
在游戏开始时,玩家必须将他们的船只放在网格上。我有一种方法要求玩家在哪里放置他们的船。我怎么知道应该在哪个类中放置该方法?如果它在Player中但是Ships的集合在Grid中,那么我必须从Grid中获得对该组Ships的引用。然后我想要Grid :: PlaceShip(Ship)或Ship :: Place(x,y)?
有这种方法吗?我已经尝试过Class-Responsibilities-Collaborators但它没有给我答案让我开始编码。我宁愿学习如何自己找到答案而不是为这个具体的例子给出答案。
答案 0 :(得分:2)
它有点取决于周围的代码,但我的直觉是Ship应该是Grid的一部分。 Grid和Ship所代表的信息之间存在很多重叠,而这些信息与玩家并不真正相关:特定网格位置,合法猜测等。如果您将Ship作为Player的一部分,您仍然必须直接链接这两者,以便网格知道船何时被击中。如果它甚至不知道船只在哪里,那么拥有一个网格是没有意义的。
这个问题没有真正的硬性和快速的答案:我如何建立一个对象模型?我试着想象一下我可能要写的函数/方法/子程序,无论对象模型如何。如果相同的概念开始在同一组函数中弹出,那么它们应该在对象模型中绑定在一起。
当您在代码的不同部分中多次表示相同的信息时,也会注意到这一点。对于每个任务或资源,请尝试确保只有一部分代码对其负责。您可能需要调整您的抽象,以便负责的代码可以用于稍微不同的事情,所有这些都涉及相同类型的工作。
您的目标是简单的代码。如果你开始写作并且代码变得越来越复杂(即更难以理解),那就表明你需要重新思考和重构你的模型。