让我们假设您正在尝试模拟租车与司机服务。您有一个Driver
类来表示有关驱动程序的信息。每个驱动程序都可以有一个或多个(1..*
)可用汽车,以Car
类(我猜)表示。每个驱动程序还可以insert
一个或多个(1..*
)转移,在此期间它们可用(转换的特征为area
,day
一个starting_time
和一个ending_time
),因此我想象一个Shift
课程。对于给定时间内某个区域内的可用汽车,User
班级可以search()
。
您必须绘制此系统的类图以及search()
用例的序列图。
在这种情况下,您如何表示Shift
类?
我的意思是,所有这些课程显然不代表单一实体,而是代表该类型的一组数据。现在,对于用户或驱动程序,您可以通过获取单个用户或单个驱动程序对象轻松地表示它们,并且它们将总结所有这些对象的行为。但是你如何使用Shift
类做到这一点? search()
操作必须在整个数据集上完成,而不是在单个对象上完成,单个对象显然不能保存有关所有轮班的所有信息。另外,转换对象肯定没有getAvailableCars()
方法,因为它再次保存了关于单个班次的信息。
不用说这样的事情(这是我到目前为止提出的关于序列图的内容)
看起来过于简单而不正确。
我应该引入ShiftsList
班级和CarsList
班级吗?我应该以其他方式将其视为一组对象吗?
我可以想象如何使用E / R图来模拟这样的问题,因为在这种情况下Shift
实体将是数据库的表,它是一组数据,设计,但是我真的很难把它放在UML中。
答案 0 :(得分:2)
您的设计听起来很合理,除非我将用户替换为驱动程序。
不要在UML中建模列表。列表是实现与0 .. *多重性的关联的一种方式。
可用的汽车只是一个返回的Car类,多重性为0 .. *。
答案 1 :(得分:1)
在类图中,您将获得*基数关系,您可以将其视为合成。它允许持有“搜索”功能的类(前端)引用所有Shift实例。
您应该首先考虑前端的签名,它带有您系统的数据,即一组驱动程序,一组Car ......
它承载着高级别的操作:
即
void addAvailability(driverName:String, carLicense:String, area:String, ....)
以及搜索功能的参数是什么(?未给出问题)
您可能希望“可用性”类存储驱动程序可用的数据。 它带有对Driver(1基数)和区域/日期对的引用。 或者可能是相应Shift实例的列表。
然后,根据搜索的参数,您希望可用性具有“匹配(searchCriterion):bool”。
要对序列图中的迭代建模,你确实有“循环”片段,但它真的有用吗?
当“匹配”函数返回true时的序列图,你会没事的。 为在前端类(搜索)上调用操作的User(演员)放置一条生命线。前端调用shift上的matches(),如果是查询相关驱动程序的真实查询,则查询他的汽车。在返回弧上绘制返回值({“Joe's mercedes”})给actor。
答案 2 :(得分:1)
快速回答。我觉得你只触及冰山一角。如果你想计划轮班,整个事情比一个班级更复杂。
希望这有助于您开始朝着正确的方向前进。让我们了解您的进度;)
问候,真实分析