【发布时间】:2018-06-03 19:41:48
【问题描述】:
我想就以下问题收集您的意见。
我们有一个名为“Room”的类。每个房间可能包含“Person”类的零个或多个实例,因此 Room 存储一个 Person 集合(例如向量)。它拥有他们。但是,在 Room 之间移动 Person 有一些耗时的逻辑,因此 Person 还包含他们当前所在的 Room。它只是一个 没有所有权的指针。这个信息在理论上是多余的,因为可以从房间里的 Persons 集合中得到它,但是假设房间数很大 >> 人数,这样的操作会很慢......
class Room {
std::vector<Person> peopleInside;
};
class Person {
Room* currentRoom; //could be shared_ptr to avoid raw pointers
};
当然,它更复杂(类比这更多),但我已尽可能简化它。
我的问题是:
1) 在这种情况下,这本身是循环依赖吗?
2) 这个解决方案对您来说是否肮脏/不优雅?
3) 是否值得换成别的东西?
【问题讨论】:
-
如果人们经常在房间之间移动,我认为向量
可能是一个不好的选择。 -
我不喜欢的是这种设计会给出不一致的状态,即房间 A 中的人可能指向房间 B。但是要评估是否可以避免这种情况,有必要使用一些用例描述,即对数据进行什么样的操作?例如,我想一个操作是将人 X 移动到房间 A,对吗?那么如何抓到人呢?要搜索的名称?你如何获得 Room A。你有 Room 的向量吗?
-
是的,我同意这两者 - 存储直接对象会导致复制过多并且可能出现不一致的状态。我有一张房间和它们之间的过渡图。如果有过渡,一个人可能会移动到相邻的房间,移动是一个动作(就像在游戏中一样),游戏逻辑将更新集合以使它们同步......但我自己看到了这种设计的弱点。 ..
-
你能描述一下为什么 Person 需要了解 Room 吗?从您评论中的描述来看,您的控制器似乎已经知道涉及哪些房间。
-
@4386427 这可能很方便。否则,如果您手头只有
Person,您将不得不询问您的Rooms容器(无论是什么),以找到该人当前所在的Room,这将涉及某种搜索。
标签: c++ architecture software-design