如何表示"事物的集合"在UML的类和序列图中?

时间:2015-07-02 15:16:21

标签: language-agnostic uml

让我们假设您正在尝试模拟租车与司机服务。您有一个Driver类来表示有关驱动程序的信息。每个驱动程序都可以有一个或多个(1..*)可用汽车,以Car类(我猜)表示。每个驱动程序还可以insert一个或多个(1..*转移,在此期间它们可用(转换的特征为areaday一个starting_time和一个ending_time),因此我想象一个Shift课程。对于给定时间内某个区域内的可用汽车,User班级可以search()

您必须绘制此系统的类图以及search()用例的序列图

在这种情况下,您如何表示Shift类?

我的意思是,所有这些课程显然不代表单一实体,而是代表该类型的一组数据。现在,对于用户驱动程序,您可以通过获取单个用户或单个驱动程序对象轻松地表示它们,并且它们将总结所有这些对象的行为。但是你如何使用Shift类做到这一点? search()操作必须在整个数据集上完成,而不是在单个对象上完成,单个对象显然不能保存有关所有轮班的所有信息。另外,转换对象肯定没有getAvailableCars()方法,因为它再次保存了关于单个班次的信息。

不用说这样的事情(这是我到目前为止提出的关于序列图的内容)

sequence diagram for the search() use case

看起来过于简单而不正确。

我应该引入ShiftsList班级和CarsList班级吗?我应该以其他方式将其视为一组对象吗?

我可以想象如何使用E / R图来模拟这样的问题,因为在这种情况下Shift实体将是数据库的表,它是一组数据,设计,但是我真的很难把它放在UML中。

3 个答案:

答案 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)

快速回答。我觉得你只触及冰山一角。如果你想计划轮班,整个事情比一个班级更复杂。

  1. 您不希望将用户建模为域的一部分(他不是)。用户被建模为用例模型中的参与者。他与系统交互,而不是与现实生活中的对象(事物)交互。
  2. 考虑插入班次的司机,这种模式很少有效。通常你需要一个经理来同步和计划事情(班次计划班,其中包含[0 .. *]班次),这样你就不会有极端情况(没有任何司机的一天或所有司机的一天)正在转变,但没有足够的客户等。)
  3. 司机与汽车之间的关系如下:"司机驾驶汽车"。这是最重要的信息。在驾驶员和现实生活中的所有可用汽车之间没有真正的关系,直到他驾驶一辆。我们模拟现实生活关系,以提供真实的生活价值。
  4. 您可能希望将区域建模为枚举以保持一致。
  5. 希望这有助于您开始朝着正确的方向前进。让我们了解您的进度;)

    问候,真实分析