7

当我为我的项目构建自己的系统时,我学到了很多关于设计模式的知识。我想问你一个我找不到答案的设计问题。

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

  1. 持有 nick、age 和 Room-object 等信息的 Person-class 。
  2. 房间类,包含房间名称、主题和当前在该房间的人员列表等信息。
  3. 酒店级,在服务器上有一个人员列表和一个房间列表。

我做了一个图表来说明它:

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

这是糟糕的设计吗?有没有另一种方法来实现它?

谢谢。

4

4 回答 4

9

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

您不一定要迭代来获取您的客人数量。您可以只保留一个运行计数 ($Hotel->total_guests) 并在它发生变化时对其进行修改。

于 2010-04-11T02:45:38.673 回答
4

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

interface IPerson
    IRoom getRoom()
    // etc

interface IRoom
    iter<IPerson> iterPerson()
    // etc

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

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

于 2010-04-11T03:03:23.530 回答
1

在更大的系统中,这会很糟糕,但是根据我对您的应用程序的理解,这三个类只能一起使用,所以问题不大。只需确保以表明它包含对房间的引用而不是实例的方式命名人员的成员变量。

此外,除非出于性能原因(例如,您将拥有大量房间),否则创建一个可以遍历房间并收集人员的属性或吸气剂可能会更清洁,而不是在酒店中缓存他们。

于 2010-04-11T02:48:01.810 回答
0

相互依赖本身并不坏。有时数据使用需要它。

我以不同的方式思考它。维护通常具有较少关系的代码会更容易 - 是否相互依赖。尽可能简单。与您的情况有关的唯一额外技巧是,在创建和删除序列期间,有时会出现检查和鸡蛋问题。你有更多的簿记链接。

如果您在这种情况下询问是否需要酒店人员名单,我认为有两个答案。我首先让您的对象(在内存中)提供这些关系,但您不需要数据库中人员和酒店之间的额外连接表。如果您使用的是 Hibernate,如果您向酒店中的人员询问它,它将自动为您生成一个有效的加入(它会为您加入 rooms.hotel_id 上的酒店)。

于 2010-04-11T03:59:42.200 回答