[英]Class diagram UML
是否使用继承是恕我直言的成本/收益问题。
在实现继承时,在决定使用继承之后,需要在额外的类,表,文档和其他结果方面涉及一些成本。
继承是关于特殊和一般情况的。 首先,您可能想问一下案例之间的区别 - (称为鉴别器)。 在您的情况下,它是预留类型,您可以通过建模此类预留并基于预留类型实现不同的行为来避免继承。 这将导致如下设计:
避免继承
如果继承具有很高的优势,因为每个特殊情况都有许多额外的属性,关系或操作,那么您可以应用它。
在这种情况下有
并且还有一些额外的字段
目前缺少的是使应用继承变得合理的常见行为。 在下图中,我添加了概括。 此时不需要它,但只要有一般操作,您就想申请任何类型的预订:
应用继承
我肯定不会将该集合建模为单个的子类。 如果有的话,继承关系会运行另一个方向: Reservation
是一种特殊的Regular Reservation
,其中startDate == endDate
和frequency == 1
。
但那么为什么甚至模拟两个类? 考虑所有预订都是定期的。 从概念上讲, Reservation
是仅包含一个项目的集合。 Regular Reservation
是包含多个项目的集合。
在这种情况下,尝试使用单个Reservation抽象类,并从中创建两个子类, SingleReservation和RecurringReservation ,如下图所示 :
这将有助于您的业务逻辑确定如何处理每个预留,并防止在数据库中使用无空列。
继承不应该仅仅用作重用某些类成员的技巧。 如果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.