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

标签 oop encapsulation

我想知道一个对象向另一个间接持有它的对象提问是否是“糟糕”的设计。例如...

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

在应用程序中,一个状态拥有一个 tilemanager 和一个角色管理器。 tilemanager 知道哪些图块可以访问,哪些不能访问。角色管理器知道角色的图块位置。

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

这是否违反了任何重要原则,导致 future 出现问题?

显然,这是概括并简化为理解问题所必需的。

最佳答案

我建议这可能是一个糟糕的设计,是的。可以这么说,“红旗”就是循环引用。你说:

... an object asking a question to another object that indirectly holds it



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

这构成了一个循环对象依赖图,并且通常是代码异味。

似乎其他一些类应该有责任了解角色和 TileManager 和/或 CharacterManager。

关于oop - OO 设计 - 对象向间接持有它的类提出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3285676/

相关文章:

language-agnostic - 在编写任何代码之前如何规划应用程序的架构?

javascript - 在模块模式中封装 "object factory"是否会使对象原型(prototype)消耗更多内存?

java - 对象是否封装了数据,以至于同一类的其他实例也无法访问数据?

c++ - 具有一个成员的命名空间或类?

c++ - 从另一个对象访问一个对象的方法(建议更好的方法?)

javascript - HTML 导入是否提供任何形式的 Javascript 封装?

JavaScript 构造函数属性无法识别 - Babylon.js

java - 当订阅者需要主消息类型的子类时,观察者模式就不够用了,替代方案?

oop - "Has a"与 "Is a"- 用于决定的代码气味

java - 一长串 if/else/execute 代码分支的最佳设计模式/方法