【问题标题】:Designing classes for Hotel酒店设计课程
【发布时间】:2016-01-28 11:00:11
【问题描述】:

我即将设计一个具有对象列表的类,列表中的每个对象也是另一个对象列表。有没有更好的方法来设计这种场景?

这里,如果我要遍历所有房间,我需要先遍历楼层列表,然后再遍历房间。

例如:酒店 HAS=> 楼层列表 HAS=> 房间列表

class Room
{
  int roomNo;
  boolean occupied;
}


class Floor
{
  int floorNo;
  ArrayList<Room> roomList = new ArrayList<Room>();
}

class Hotel
{
  ArrayList<Floor> floorList = new ArrayList<Floor>();
}

【问题讨论】:

  • 这样想:如果你真的在酒店里要亲自动手做这件事,你会怎么做?
  • @JonK 我会先检查一楼的空缺情况,然后是第二个......直到最后一层。
  • 那是不是必须遍历两个列表?你能否保留一个单独的列表,只包含空房间,不管它们在哪一层?这使得检查空闲房间的效率更高(您只需vacantRooms.isEmpty()),但您必须记住在每个房间被占用时将其从列表中删除。
  • @JonK 好的。我可以做到。我只能遍历空房间,但正如你所说,我需要注意维护新的vacantRooms 列表。谢谢
  • 如果你走这条路,你只需要确保你的 occupy()vacate() 方法(或它们的等效方法)正确地添加和删除该列表。

标签: java oop object


【解决方案1】:

例如:酒店 HAS=> 楼层列表 HAS=> 房间列表

开发人员需要停止尝试模仿对象之间的真实关系。仅仅因为你说“某种实体有另一种实体”并不意味着它们都属于一个对象集群。

您需要查看的是您的对象模型将要处理的用例(命令),以及在此过程中必须保护哪些不变量(规则)

如果不知道它将解决什么问题,您就无法真正想出一个好的对象模型。更传统的数据结构也是如此;例如在不知道将使用的数据访问模式的情况下,您无法在 ArrayListHashMap 之间选择更合适的选项。

例如,如果您尝试对不应接受重叠预订的房间预订流程进行建模,那么您必须创建尽可能小的数据集群,以允许您的对象模型完成此任务。

您是否需要记住整个房间列表以及他们的所有预订才能完成单间客房预订?可能不是,那么为什么需要一个包含Floor 集合的Hotel 对象,而后者又将包含Room 的集合?

您可能只需要一个 Room 聚合,其中包含它自己即将进行的预订列表。

现在,出于查询目的,您可能仍希望能够列出特定楼层或酒店的所有房间,但不必通过对象引用来表达关系。如果Room 持有floorIdFloor 持有hotelId,则可以通过数据库查询来完成这些查询。

我知道您的问题纯粹是学术问题,可能与现实生活中的问题无关,但您需要了解对象模型并非仅从现实生活中的关系中得出:您需要查看 命令

【讨论】:

  • 是的,我需要根据用例进行设计。但是我很难理解您的 cmets 关于重叠预订和 Room 聚合的问题。你能解释一下吗
  • @mc20 预订 Room 时,为了确保预订不会与另一个预订冲突,您需要围绕所有即将到来的预订和特定房间(一个包含所有这个数据)。因此,Room 聚合将保留一组即将到来的预订。致电room.book(...) 时,您可以遍历预订以查看是否存在冲突。如果有则拒绝预订,如果没有则记录预订。
  • @mc20 正如我们所见,您不需要加载Hotel 类来处理这个用例。还必须建立并发保护机制,以避免通过竞争条件破坏规则。通常乐观并发比悲观锁定更有效。我不确定这是否回答了您的问题?
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2021-11-10
  • 2012-03-27
  • 2013-06-12
相关资源
最近更新 更多