一个方法应该属于谁?

时间:2009-03-13 04:57:21

标签: language-agnostic oop

我正在尝试设计一个简单的游戏--- Pong,Arkanoid ---严格使用“正确的OO”,无论这意味着什么。

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

谁应该处理,例如,结果?和记分?

我的第一个想法是给球做几个工作,但是开始以指数方式扩展到一个神对象:球会知道它在哪里,它撞到了谁,并向记分对象报告。

这对于可怜的球来说太过分了。

5 个答案:

答案 0 :(得分:5)

经验法则:

  • 如果一个对象在逻辑上拥有所涉及的所有状态,那么它拥有使用该状态的方法
  • 如果方法需要来自多个对象的状态:
    • 如果容器对象拥有该方法使用的所有对象,那么它也拥有该方法
    • 否则您需要一个'bridge'对象来拥有实用程序方法
    • 除非有一个强大的参数让一个对象成为该方法的“控制器”(虽然不能想到一个例子)

在你的情况下,'游戏板'或'游戏环境'可能会有一个拥有碰撞检测(实用程序/桥接)方法的“游戏物理”类(或一组方法)

答案 1 :(得分:2)

一个好的或坏的设计通过它如何满足意想不到的要求显示出来,所以我建议保留一些潜在的“游戏功能”,以便为你的设计反思提供信息。既然你正在做这个学习项目,你就可以疯狂。

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

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

使用具有重构菜单的IDE,特别是移动方法重构。 (如果还没有,请阅读 Refactoring 一书。)尝试将各种方法放在这里和那里。注意当方法被置于“错误”时变得难以改变的东西,当你把它放在别处时会变得更容易。当物体照顾自己的状态时,方法就是正确的;你可以“告诉”一个物体做某事,而不是“询问”它的状态问题,然后根据它的答案做出决定。

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

碰撞检测是代码的一个敏感部分,因为它可能涉及检查所有可能的精灵对。您需要区分检查是否存在碰撞,通知碰撞对象。例如,你的球对象需要在与桨碰撞时改变其运动。但是一般来说,检测碰撞的算法不属于球类,因为其他对象可能会对游戏中的重要事件发生冲突。

等等......

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

这实际上取决于你的实现,但我想你有一个“游戏板”对象来管理得分保持,或者每一方都可能是一个目标对象。就碰撞而言,我认为您可能希望在对象之间传递事件。我认为任何物体都应该知道它的位置。

答案 4 :(得分:0)

在大多数游戏中你都有静力学和演员。 ..演员四处走动,他们每个人都会独立地弄清楚他们什么时候碰到东西,因为他们知道他们的形状和范围