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