模拟现实世界或适当的OOP世界?或两者?

Pup*_*Pup 8 oop design-patterns actionscript-3

我正在编写一个游戏,鼠标驱动的控制器对象点击一个玩家对象让它做某事.

有两种方法可以启动鼠标和播放器之间的交互:

  • 控制器调用播放器的功能:
    控制器侦听鼠标事件.当鼠标单击发生在屏幕上的任何位置时,控制器将搜索所单击的点下的所有对象.如果其中一个对象是一个玩家对象,并且它的"可点击"属性为true,则调用其相应的函数.
  • 播放器调用控制器的功能:
    播放器侦听鼠标事件.当播放器上出现鼠标点击,并且播放器自己的"可点击"属性为真时,则调用控制器的相应功能.

我的困境在于,第一种选择似乎更直观,我想象现实世界中的场景,但第二种选择似乎更直观,适当的面向对象设计,因为它不需要查看另一个对象的属性,这违反了封装在某种程度上(控制器必须调查播放器以读取其"可点击"属性).此外,第二个选项似乎与"控制器"设计模式一致.

这对我来说总是很困难 - 我是否违背了适当的面向对象设计(例如选项1)或者我是否使用了与现实世界相似的实现(例如选项2)?

我希望我缺少一些中间立场.

Chr*_*isW 8

这对我来说总是很困难 - 我是否违背了适当的面向对象设计(例如选项1)或者我是否使用了与现实世界相似的实现(例如选项2)?

我不认为面向对象的目的是模拟现实世界.

我认为OO模型经常遵循现实世界模型的一个(?)原因是现实世界没有太大变化:因此选择现实世界作为模型意味着软件不会改变很多,即维护成本低廉.

对现实世界的忠诚本身并不是设计目标:相反,您应该尝试最大化其他指标的设计,例如简单性.

"面向对象"中的"对象"是软件对象,不一定是现实世界的对象.


str*_*ger 5

为什么不选择选项3,这与选项1类似?

  • 控制器调用播放器的功能:
    控制器侦听鼠标事件.当鼠标单击发生在屏幕上的任何位置时,控制器将搜索所单击的点下的所有对象.如果其中一个对象实现了IClickable或继承了Clickable(或其他),则调用其相应的函数(或触发事件,以适当的方式).

  • 这并不会掩盖你的斗争.实现iClickable(或类似的东西)使可点击性成为对象界面的一部分,因此查询对象的可点击性并不违反封装.斗争结束.此外,我会解释"告诉,不要问" - 原则说,应该告诉玩家已被点击而不是询问被点击. (3认同)