两个彼此依赖的对象.那不好吗?

Kas*_*bbe 7 oop dependencies dependency-management

当我为我的项目构建自己的系统时,我正在学习很多关于设计模式的知识.我想问你一个我无法找到答案的设计问题.

目前我正在使用多个客户端的套接字构建一个小型聊天服务器.现在我有三个班:

  1. 持有缺口,年龄和房间对象等信息的人类.
  2. 房间类,包含房间名称,主题和当前在该房间的人员列表等信息.
  3. 酒店级,其中包含人员列表和服务器上的房间列表.

我已经制作了一个图表来说明它:

我在酒店级服务器上有一个人员列表,因为现在跟踪在线有多少人会很好(不必遍历所有房间).这些人住在酒店级,因为我希望能够在不搜索房间的情况下搜索特定的人.

这是不好的设计吗?还有另一种实现方式吗?

谢谢.

Syn*_*ror 9

我不喜欢它.酒店包含客房,房间包含人.人们不包含房间,他们属于他们.

您不一定要迭代来计算您的访客数量.您可以保持运行计数($ Hotel-> total_guests)并在其更改时进行修改.

  • 我非常感谢你的渴望毫秒,因为我分享了这种激情 - 但是令人敬畏的OOP是关于更快/更清晰地读取和编写代码,而不是更快的执行时间.我建议你尝试两种方式和时间 - 差异可能不会像你想象的那么大.(如果您这样做,请将结果发布给我们!) (4认同)
  • “人们不包含房间,他们属于他们” - 人们知道他们所属的房间。 (3认同)

Ale*_*lli 4

严格来说,类之间的相互依赖问题可以通过使用接口(抽象类,如果您的语言是 C++ 或 Python)和;IRoomIPerson解决。在伪代码中

interface IPerson
    IRoom getRoom()
    // etc

interface IRoom
    iter<IPerson> iterPerson()
    // etc
Run Code Online (Sandbox Code Playgroud)

这使得只有接口相互依赖——实际的实现只需要依赖于接口。

如果您想避免循环引用循环(例如在 CPython 中,这可能会减慢垃圾收集速度,这可能会带来麻烦),这也为您在实现方面提供了足够的回旋余地——您可以使用弱引用,这是一个具有典型“的底层关系数据库”对于第一个简单的原型,您可以使用您选择的语言中最简单的东西(可能很简单,而且必然是循环的,引用 [[pointers, in C++]] 并引用PersonaRoom和一个Room到一个list<Person>)。

  • @Kasper,重点是,对_接口_(包括相互的接口)的依赖并没有真正的问题——它主要是对你真正想要避免的_具体_软件的依赖(例如,在“循环”的情况下)。从快速而肮脏的实施开始并随后切换到更健全的实施的自由也加速了软件原型设计以及其发展和维护中的迭代。 (2认同)