Language agnostic 方法应该属于谁?

Language agnostic 方法应该属于谁?,language-agnostic,oop,Language Agnostic,Oop,我正在尝试设计一个简单的游戏——Pong,Arkanoid——使用严格的“适当的OO”,不管这意味着什么 所以,通过设计自己的死亡,我试图达到一个点,我会知道下一次该做什么或不该做什么 例如,谁应该处理集体诉讼?记分呢 我的第一个想法是给球分配几个任务,但这开始以指数级的方式扩展成一个神的物体:球会知道它在哪里,撞到谁,并向记分物体报告 这对可怜的球来说太多了。这真的取决于你的实现,但我想你会有一个“gameboard”对象来管理记分,或者两边都有一个目标对象。至于碰撞,我认为您可能希望在对象之

我正在尝试设计一个简单的游戏——Pong,Arkanoid——使用严格的“适当的OO”,不管这意味着什么

所以,通过设计自己的死亡,我试图达到一个点,我会知道下一次该做什么或不该做什么

例如,谁应该处理集体诉讼?记分呢

我的第一个想法是给球分配几个任务,但这开始以指数级的方式扩展成一个神的物体:球会知道它在哪里,撞到谁,并向记分物体报告


这对可怜的球来说太多了。

这真的取决于你的实现,但我想你会有一个“gameboard”对象来管理记分,或者两边都有一个目标对象。至于碰撞,我认为您可能希望在对象之间传递事件。我认为任何物体都应该知道它的位置。

经验法则:

  • 如果一个对象逻辑上拥有所有涉及的状态,那么它就拥有使用该状态的方法
  • 如果一个方法需要来自多个对象的状态:
    • 如果容器对象拥有该方法使用的所有对象,那么它也拥有该方法
    • 否则,您需要一个“桥”对象来拥有实用程序方法
    • 除非有一个强有力的论据表明一个对象是该方法的“控制器”(但不能马上想到一个例子)

在您的情况下,“gameboard”或“game environment”可能会有一个“game physics”类(或一组方法),它拥有碰撞检测(实用程序/桥接)方法

在大多数游戏中,您都有静态和参与者。。演员们四处走动,每个人都能独立判断出他们何时会与某物发生碰撞,因为他们知道它们的形状和范围

好的或坏的设计会通过它如何适应意外的需求来显示出来,因此我建议随时准备一些潜在的“游戏功能”,以告知您的设计反应。既然你是作为一个学习项目来做这件事的,你就可以发疯

Arkanoid是一个很好的选择,它提供了很多选择。让不同的砖块获得不同的分数。使一些砖块在命中时改变其他砖块的分数。制作一些砖块需要多次点击。给球、桨或砖块赋予超能力。改变这些能力:其中一个使球键盘可控,另一个使其透明,另一个反转“重力”,等等。让砖块掉落物体

我们的目标是,当您进行这样的更改时,它会影响尽可能少的类和方法。了解您的设计必须如何更改以符合此标准

使用具有重构菜单的IDE,尤其是移动方法重构。(如果你没有,读这本书。)试着把你的各种方法放在这里和那里。请注意,当方法放置“错误”时,哪些内容变得难以更改,而当您将其放置在其他位置时,哪些内容变得更容易更改。当对象处理自己的状态时,方法被正确放置;你可以“告诉”一个物体做某事,而不是“问”它关于它的状态的问题,然后根据它的答案做出决定

让我们假设在您的设计中,每个精灵都是一个对象实例。(您可以选择其他策略。)通常,运动会改变精灵的状态,因此描述特定类型精灵运动的方法可能属于该精灵的类

碰撞检测是代码的敏感部分,因为它可能涉及检查所有可能的精灵对。您需要区分检查碰撞和通知对象碰撞。例如,您的球对象需要在与桨碰撞时改变其运动。但是,通常用于检测碰撞的算法不属于ball类,因为其他成对的对象可能会发生碰撞,其后果对游戏很重要


等等……

请记住,对象也可以存在于给定问题的逻辑元素中(不仅仅是真实元素,如球和板)


因此,对于碰撞检测,可以使用CollidingElement类来处理位置和形状状态。然后,该对象可以通过合成嵌入到任何在游戏中发生碰撞的对象中,并将任何需要的方法调用委托给它。

在这种情况下,我的参与者将是球和桨,对吗?当结肠破裂发生时会发生什么?球和桨应该在新的方向上达成一致吗?墙和目标是静态的吗?如果为了挑战,我添加了移动墙呢?什么时候一个对象不再是静态的?这是一个重要的评论。太多的新手似乎认为OO编程只是将所有可能的逻辑与现实世界中存在的物理对象进行耦合。我想我理解其中一些,比如第一个:由于记分对象保持所有记分状态,它还应该具有修改记分的方法。我不理解1.1,但是:因为每个碰撞都发生在棋盘上,所以我应该有board.Collishes(球,goal1)?@[Tordek]:是的-实际上你应该有board.CheckCollishes(AllObject),来检查所有球和目标以及活动游戏范围内任何其他可碰撞对象之间的碰撞。使用MovingObjects X CollidableObjects进行碰撞测试,并检查边界矩形以进行快速测试。