如何处理 SysML/UML 中的不同实现?

How to handle different implementations in SysML/UML?

假设我们正在构建一个图书馆系统。我们的用例可能是

想象一下,我们可以由图书管理员或机器来完成这些用例。我们需要实现这些用例。

  1. 我们是否应该为不同的流程绘制不同的用例实现? 如果没有,从机器和人那里借书是很不一样的。我们该如何处理?
  2. 而且,万一哪天图书馆机器更新了版本呢? (比如一个带键盘,一个带触摸屏)那怎么办?流程保持不变,但硬件和软件最终会有所不同。
  3. 你会用什么来实现用例,为什么?

这可能是一个基本问题,但我没能找到关于这个问题的具体例子来理解什么是正确的。提前谢谢大家。

UML 是 method-agnostic。即使没有选择,也有不同的建模方法,例如:

  • 拥有一个模型并通过需求、分析(问题的领域模型)、设计(要实现的抽象)、实现(类 真正在代码中的阶段成功地完善它.
  • 不同阶段有不同的模型并保持最新
  • 有连续的模型,没有更新前面的阶段。
  • 只保留高级设计模型以获得全局,但没有可以在代码中找到的实现细节。

同样,对于您的问题,您可以考虑使用不同的替代模型,或者将具有不同替代模型的一个模型分组在不同的包中(以避免命名冲突)。就个人而言,我会选择后者,因为不同的选择不应该太详细。但归根结底,这是您所处环境的成本和收益问题。

顺便说一句,Ivar Jacobson 的书,Object advantage 将 OO 建模技术应用于业务流程设计。所以 UML 非常适合人类解决方案。只是所考虑的系统不再是一个IT系统,而是一个更广泛的组织系统,其中IT代表了一些组件。

UML 具有协作元素以显示不同的实现。用例是锚点,因为参与者的附加值不会改变。但是,您可以通过不同的方式实现这些用例。这就是合作发挥作用的地方。协作看起来像用例,但具有虚线边框。您从一个或多个协作中得出一个用例的实现关系。在协作中,您展示了不同实现的 类 如何协作(因此得名)。

UML 2.5 的第 213 页 11.7 协作:

The primary purpose of Collaborations is to explain how a system of communicating elements collectively accomplish a specific task or set of tasks without necessarily having to incorporate detail that is irrelevant to the explanation. Collaborations are one way that UML may be used to capture design patterns.

A CollaborationUse represents the application of the pattern described by a Collaboration to a specific situation involving specific elements playing its collaborationRoles.

没有单一的真理或你“应该”做的方式。我会给你我的方法,基于统一过程。

用例技术主要用于描述人类用户(参与者)与应用程序之间的对话。它被建模为椭圆,并进一步指定为 activity 图或只是步骤列表:1 参与者执行 A,2 系统执行 B,3 参与者执行 C 等。在这种方法中,应用程序是视为黑盒。

“用例实现”描述了系统如何执行其步骤(白盒),例如在协作组件方面,对用户透明。

有 so-called 个业务用例是可能的,但不太常见。在那种情况下,“系统”代表一个企业或一个业务单元。在您的情况下,它将是图书馆。 “演员”代表外部人员或组织,例如客户或供应商。在您的情况下,它将是一个客户。对于业务用例,图书馆被视为一个黑盒子。这些步骤仍然采用“参与者执行 A;系统执行 B”的格式,但此处未指定库的哪些操作由人类执行,哪些由应用程序执行。系统就是组织,与外部参与者进行交互,而不管这是由员工还是由应用程序实现的。

“业务用例实现”指定系统如何执行其步骤(白盒)并指定哪些部分由员工完成,哪些部分由机器完成。

现在,让我一一为您解答。

问题一

如果您已将您的用例描述为业务用例,并且它的抽象级别如此之高,以至于 client-librarian 交互的步骤与 client-machine 交互的步骤相同,那么您将有一个业务用例“借书”和该业务用例的两个业务用例实现。

但是,更常见的做法是只使用 user-application 交互的用例。如果客户与系统交互的方式与图书管理员代表客户的方式相同,那么您将只有一个用例“借书”,参与者为“人”。这个演员有两个专长:“客户”和“图书管理员”。每个用例只有一个用例实现。

否则,您将有一个用例“在线借书”描述当客户端直接与应用程序交互时的事件流,连接到参与者“客户端”和另一个用例“为客户端借书”描述图书馆员在与客户交谈时与应用程序交互时的事件流。后一个用例将“图书管理员”作为其参与者。同样,每个用例只有一个用例实现。

您可以选择单独对 Client-Librarian 交互建模,或者根本不建模,具体取决于您建模的目的。

问题二

让我们以用例“在线借书”为例。对于此用例,您可能有两种用例实现:一种用于键盘机,一种用于触摸屏机。如果这些用例实现非常相似,那么我只会制作一个用例实现并描述在该单个实现中有两种可能的输入设备这一事实。

问题三

对于业务用例实现,我会使用 BPMN 2.0 或 UML activity 图。这些非常适合业务工作流程规范。

对于一个正常的用例实现,我通常会制作一个序列图,其中那些图中的生命线是指在一个公共组件图中定义的组件。在序列图的左边空白处,我通常用 UML 注释符号写下用例的步骤。序列图侧重于组件之间的交互,使用它们的接口。这很好地概述了特定用例上下文中组件之间的协作。

更多信息请参考我的白皮书Which UML models should we make?。用例实现在第 19 页描述。