OO设计 - 对象向类间询问间接持有它的问题

时间:2010-07-19 22:41:22

标签: oop encapsulation

我想知道一个对另一个对象提出问题的对象是否是“坏”设计。例如......

要求: 字符(对象)在网格上移动。当它试图移动到另一个位置时,它需要知道该位置是否已被阻挡它的东西占据,或者该网格的那部分是否完全无法访问。 (注意角色本身需要知道)。

在应用程序中,状态持有tilemanager和charactermanager。 tilemanager知道哪些瓷砖是可访问的,哪些不是。角色管理员知道角色的瓦片位置。

字符从状态调用函数是合理的,比如AuthorizeMovement,它确定是否可以通过其TileManager和CharacterManager进行移动,如果是,则返回true,否则返回false?

这是否违反任何重要原则,导致路上的麻烦?

显然,这是概括性的,并且被理解为了解问题的必要条件。

3 个答案:

答案 0 :(得分:2)

我认为这可能是一个糟糕的设计,是的。可以说,“红旗”是循环参考。你说:

  

......向另一个间接提出问题的对象提问的对象

因此,“holding”对象具有对“hold”对象的引用,并且为了“提问”,“hold”对象将需要引用“holding”对象。

这是一个循环对象依赖图,通常是代码气味。

似乎其他一些类应该负责了解字符和TileManager和/或CharacterManager。

答案 1 :(得分:1)

我没有看到问题。 Good OO Design有许多原则。但在它的核心,你有4大:封装,继承,多态和抽象。此外,您需要高内聚和低耦合。这意味着您的对象/类可以适合任何地方,并且不依赖于特定的实现或类。

话虽如此,听起来你已经使用了上面的封装运动和字符将它们抽象成单独的类。因此,你的Character类不会直接修改电路板,如果是这样的话会很糟糕。

随着您对问题的深入了解,您可以随时重构代码以改进设计以利用其他原则。

答案 2 :(得分:0)

这不违反任何OOP原则。调用的细节完全是抽象的,无论如何你依赖于State对象。你到底怎么可能实现这个功能?

抽象和原则是有用的工具。但是你不应该依赖它们来使你的代码合格。并非每个抽象或每个原则都适用于每个场景或每个可能的实现。它们是指导方针,而不是规则。如果您无法快速查看替代实现,请使用此实现,然后再回到它。