繁体   English   中英

类图UML

[英]Class diagram UML

我正在为房间预订系统创建一个类图。 可以选择创建常规预订(例如,3月的每个星期二)。 我想知道是否应该设计一个这样的特定类:

在此输入图像描述

  • 我应该设计一个特定的课程吗? 也许
  • 像这样? 没有

是否使用继承是恕我直言的成本/收益问题。

在实现继承时,在决定使用继承之后,需要在额外的类,表,文档和其他结果方面涉及一些成本。

继承是关于特殊和一般情况的。 首先,您可能想问一下案例之间的区别 - (称为鉴别器)。 在您的情况下,它是预留类型,您可以通过建模此类预留并基于预留类型实现不同的行为来避免继承。 这将导致如下设计:

避免继承

避免继承

如果继承具有很高的优势,因为每个特殊情况都有许多额外的属性,关系或操作,那么您可以应用它。

在这种情况下有

  • 常规预订和预订之间的额外1:n关系(在您的设计中不可见,但属性常规预约隐含)

并且还有一些额外的字段

  • 开始日期
  • 结束日期
  • 频率

目前缺少的是使应用继承变得合理的常见行为。 在下图中,我添加了概括。 此时不需要它,但只要有一般操作,您就想申请任何类型的预订:

应用继承

应用继承

我肯定不会将该集合建模为单个的子类。 如果有的话,继承关系会运行另一个方向: Reservation是一种特殊的Regular Reservation ,其中startDate == endDatefrequency == 1

但那么为什么甚至模拟两个类? 考虑所有预订都是定期的。 从概念上讲, Reservation是仅包含一个项目的集合。 Regular Reservation是包含多个项目的集合。

在这种情况下,尝试使用单个Reservation抽象类,并从中创建两个子类, SingleReservationRecurringReservation ,如下图所示

在此输入图像描述

这将有助于您的业务逻辑确定如何处理每个预留,并防止在数据库中使用无空列。

这种设计不是严重缺陷吗?

继承不应该仅仅用作重用某些类成员的技巧。 如果RegularReservation将从Reservation继承,则意味着常规预订是一些简单的预留。 这是真的吗? 例如,单个Reservation Date :有一个日期。 它对定期预订有什么意义吗?

所以这里有一些缺陷:

  • 它将(私有)接口( date成员)的无用部分强加给所有类型的预留,即使它没有任何意义。 这违反了接口隔离原则
  • 基类必须知道继承类( regular_reservation成员)。 因此,如果明天你想创建一个MultipleReservation (几个不相关的日期),你需要再次修改基类。 这违反了开放式原则
  • 使用Reservation课程需要知道有关不同类型预订的详细信息,以便处理他们的特定能力。 这违背了最不了解原则

你想解决什么问题?

房间预订系统的挑战不仅是登记预订,而且如果房间是免费的或已经预订的话,也知道每个给定的时间段。

后果:

  • 您必须能够在给定的时间间隔内获得所有定期预订。
  • 您应该确定定期预订的发生是单一预订,还是单一和常规预订都应该具有某种发生对象。

拟议的设计

抽象Reservation始终是关于Client预订Room的价格为一个或多个TimeSlots TimeSlots仅与日期,时间,持续时间有关。 这有助于确保关注点分离:

由时隙组成的抽象保留

插槽的数量以及这些插槽的创建方式取决于Reservation的类型。 但一般原则是删除一个预留会删除所有时间段(好的:如果过去有插槽怎么办?)。

您可能还有一些通用方法:

  • getAllSlots()将返回完整的时隙集合
  • getSlotsInInterval(startDate, endDate)将仅返回间隔中的那些时隙

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM