2008年11月14日星期五

Rational Edge: 利用 RUP 对遗留系统进行逆向工程

级别: 初级

Philippe Dugerdil, 信息系统系, HEG, University of Applied Sciences

2006 年 11 月 13 日

本文来自于 Rational Edge:许多技术和工具已经被提出来,用于对遗留的信息系统进行逆向工程。但这些技术很少在明确定义过程的环境中被描述过。本文将介绍如何将 IBM Rational 统一过程应用于逆向工程,特别是应用于对系统架构的恢复。

插图 过去的 15 年,软件再造工程已经成为计算机科学中的重要分支学科。较大的企业日益将关键任务自动化,这使得这些业务高度依赖于它们的信息系统。但在很多情况下,这些系统维持了许多年 —— 也就是,这些是对企业很重要的“遗留系统”,但它们经常是很难被理解和维护的。

出于预算的原因,从零开始对这些系统重新开发是糟糕的选择。

另一种选择是再造工程,它可以分解成两个子工程:逆向工程(构建实际代码的表示)以及正向工程(重新构建并/或重新开发代码的一些部分)。 1 特 别地,逆向工程中的一个重要的活动是恢复系统的架构。这是 RUP 强大的地方。在本文中,我将介绍这样一个情况,遗留信息系统的原始开发人员不能提供程序原始结构的信息,并且不能提供可用的文档。我们的过程必须重新构建 共同提供系统的架构视图的统一建模语言(UML)模型。

逆向工程中的一个关键问题是,著名的“概念分配问题”—— 也就是,领域概念到源代码元素的映射。 2 虽然此问题的解决方案依赖于我们所说的“领域概念”,但是我们将展示通过基于 RUP 的规程重新构建软件的 UML 模型能够如何帮助解决该问题。在该过程的最后,我们将能够通过可溯性链接将高层次的业务元素和系统功能链接到代码元素上。

如 同在 RUP 中一样,用例模型的构造对我们的逆向工程过程是重要的。第一,用例模型是用例恢复系统所支持的业务过程模型。第二,分析用例来构建表示软件推测架构的系统 分析模型。第三,用例用作场景的来源,运行以找到业务功能实现中所涉及的软件元素。本文仅仅提供了我们的过程的概述,突出了其主要任务和工作产品。

过程

将 系统逆向工程所需要的大部分任务和工作产品可以在 RUP 中找到。在逆向工程项目中,关键的工作产品是从源代码恢复回来的系统的表示和模型。然而,在某些情况下,任务的相关顺序必须相对于原始的 RUP 过程来修改,因为系统已经开发了。特别的是,随着时间的过去,每个规程的重点的变化将与“零起点”软件开发项目不同。从概念上讲,我们的逆向工程过程通过 以下三个步骤进行:

  1. 估计项目再造工程的范围。
  2. 构建抽象模型。
  3. 恢复软件的架构。

图 1 显示了与这些步骤相关联的任务在传统的二维 RUP 表示中定位于哪里。

图 1:映射到 RUP 规程和阶段上的我们的过程的三个关键步骤

图 1:映射到 RUP 规程和阶段上的我们的过程中的三个关键步骤

在 完整的再造工程的更广环境中,逆向工程项目之后将有一个针对部分或整体重新构建/重新设计/重新开发系统的正向工程项目。这就是要引入新范型的地方,例 如,面向服务的体系结构(SOA)。虽然本文着重于逆向工程部分,但是必须讨论潜在的未来平台或范型,用以评估再造工程项目的可行性。

估计再造工程项目的范围

在当今日益增多的业务灵活性和 IT 成本削减的趋势下,所有再造工程过程都应该试图优化软件资产和 IT 资源。如果再造工程选项与完整重写外包给远程的开发中心的系统竞争,这就尤其真实。

在 此最初步骤中,我们设置再造工程系统的业务范围和所期望的质量属性。通常,这些质量属性是预先设定的,并且重新构造系统以实现它们。然而,如果实际的代码 质量太差,那么可能不值得完全再造工程的工作。管理层可能决定只提取并再造工程某个关键组件。在最坏的情况下,当系统结构如此之坏,以至于没有可以复用的 有用代码,再造工程工作会局限于嵌入于老系统中的知识的提取,以帮助指定新的。此步骤是迭代的:我们对系统的实际结构知道的越多,我们越能够更好地评估系 统重新构造的经济相关性。

如同在任何项目中,首要的任务是为工作产品为前景文档的再造工程系统开发一个表示。特别地,这样的文档 应该阐明项目的基本原理、对再造工程系统的约束条件,以及技术选择。例如,前景文档会将目标架构描述为 SOA。根据项目的大小,前景中的信息可能在将会正确地分析项目的经济相关性的业务用例工作产品中进一步详细描述。这是项目管理规程中的开发业务用例任务 的输出。换句话说,再造工程系统的目标质量属性以及详细的技术约束可能记录在作为需求规程的找到角色和用例任务的输出的补充规范工作产品文档中。由于在逆 向工程项目中,这些规范应用于再造工程的系统中,所以实际的系统必须与这些规范相比较。然而,风险列表将记录没有达到此目标的风险,以及减轻这些风险的方 法。风险列表由项目管理规程的鉴别并估计风险任务生成的(图 2)。

图 2:估计项目的范围

图 2:估计项目的范围

注意到再造工程的系统的目标质量属性的规范不是专门对我们的工作的。例如,它位于 SEI 的 Horseshoe 模型的核心。 3 然而,项目风险的迭代评估似乎没有在少数公开的再造工程过程中得到明确地处理。

构建抽象模型

在 软件架构想法方面的困难是在大多数情况下,在代码层不是明确地表示出来。因此,如果关于系统的信息的唯一来源不在起码的源代码中,那么我们如何能够重新构 建其架构?事实上,软件描述的架构层是设计人员的主要工作,有时候,在技术文档中。当碰到某个未知的遗留系统的源代码时,工程师如何能够知道软件元素的什 么组合将生成某种有意义的架构描述?甚至可能的情况是本来没设计架构!

要例举该悖论,Kazman 和 Carrière 甚至谈到“共享的幻想”来描述遗留系统中软件架构的探索。 4 当然,行业尺寸的软件系统是非常复杂的工件。构建架构模型需要对系统本身的了解,因为其源代码没提供很多帮助。作为对系统了解的辅助,我们可以创建可能在 代码中发现的假设的架构。但是该架构必须足够抽象,以适应我们很可能遇到的大范围的设计。RUP 的系统分析模型可以实现此需求,因为分析类的原型(实体、边界和控制对象)代表我们将在几乎所有信息系统中找到的三个职责。

用户经常对遗留系统有很好的观察。虽然他们可能对程序的设计认识很短浅, 5 但是他们通常很好地意识到软件的业务环境和业务相关性。虽然他们一般不能解释软件的内部工作方式,但是他们通常了解他们使用的程序的目的,以及计算的业务 调整。他们通常知道哪种类型的信息必须输入到系统中,以及什么时候输入。通过从所有涉及的人那里收集系统使用信息,我们可以在业务层重新构造处理序列。总 之,我们可以构建系统打算支持的业务过程的表示,以及推测的领域模型。在 RUP 的术语中,我们重新构建业务用例及其业务分析模型。这是通过 RUP 的业务建模规程的详述业务用例、找到业务工人和实体,及详述业务实体的任务来完成的(参见图 3),但是从带有业务角色和实体的业务过程的实际实现开始的。

图 3:编制所支持的业务过程和领域模型

图 3:编制所支持的业务过程和领域模型

为了帮助找到领域模型,必须分析实际的数据库表并将它们记录在数据模型工作产品中。这是非标准的 RUP 一部分的新的数据库分析任务的结果,但接近于分析和设计规程中数据库设计任务的逆向工程部分(参见图 4)。

图 4:分析实际的数据库架构

图 4:分析实际的数据库架构

与此同时,在执行它们的业务任务时,鉴别出用户执行的系统用例。这令我们通过需求规程的找到角色和用例任务重新构建系统用例模型(图 5)。

图 5:构建用例模型

图 5:构建用例模型

图 6 概括了迄今为止我们重新构建的初始模型。顶端是实际的用户(系统角色),以及我们已经重新构建的用例。这些角色相当于业务分析模型里的业务工人。同时,这 些业务工人执行的任务代表软件支持的业务过程的步骤。在图的底部是重新编制的数据库表格。它们中的一部分相当于业务分析模型的业务实体。

图 6:最初的重构建模型

图 6:最初的重构建模型

在 继续用例的详细内容之前,我们必须根据风险列表和业务用例安排工作。然后,在需求规程的将用例排列优先级的任务中将逆向工程需求(用例)排列优先级,来生 成逆向工程需求属性工作产品,这类似于 RUP 的需求属性存储库(图 7)。如同在传统的 RUP 中一样,在我们评估当前的迭代和所遇到的困难之后更新风险列表(由项目管理规程的评估迭代任务输出的迭代评估工作产品)。

图 7:将用例划分优先级并更新风险列表

图 7:将用例划分优先级并更新风险列表

下一个任务是详述用例(来自于需求规程)来生成所选用例的事件流。然而,由于用例是从用户而不是开发人员恢复回来的,所以它们不太可能完整。但它们仍然代 表系统功能的主要部分。一旦详细描述了某些用例,那么我们就通过 RUP 的分析和设计规程中的标准用例分析任务来构建分析模型(图 8)。

图8:用例细节及分析

图8:用例细节及分析

在 此分析活动中,我们使用 RUP 中编制的映射技术,特别是试探法来从系统用例中找到分析对象。基本上,业务实体成为系统实体,对角色的接口(例如,应用程序的屏幕显示)成为边界对象,并 且协调用例的职责表示为控制对象。图 9 表现出模型元素之间的可溯性链接。该分析模型工作产品代表系统的假设架构。这是我们在这里及时拥有的关于系统架构的最佳猜测。在实际的源代码中,我们可以 期望找到以一种或另一种形式实现边界对象和实体对象的职责的软件元素。然而,控制对象的职责很可能分散在许多软件元素中。总之,此分析模型用于记录我们在 软件中期望找到的内容,只要涉及元素的职责。

图 9

图 9:用例分析模型,及其到其他模型元素的可追溯性链接。这些链接是利用标准的 RUP 试探法构建的。

恢复软件的架构

在 所恢复的遗留系统的抽象结构中(与系统用例相关联的分析模型),我们现在必须找到实现它的信息系统的组件。问题是创建高层的分析模型元素和低层的软件组件 之间的可追溯性链接。我们的方法是“领域驱动”—— 也就是,我们根据所支持的业务任务和功能聚集软件元素。此步骤是一个与传统的 RUP 实践很大不同的步骤,尽管可能,我们将与 RUP 进行一些比较。

此步骤包含以下任务:

  • 分析实现模型
  • 运行用例
  • 分析调用图
  • 将功能映射到实现模型上
  • 验证假设架构
  • 重构高层次架构

分析实现模型

软件架构的重构建的首要任务是编制系统的实现模型。在此阶段,不可能显示模型的元素之间的所有依赖关系。只能表示目录、库、文件、类,和包之间的包含关系。图 10 显示了面向对象的系统的简单结构。在过程程序的情况下,此图将显示文件、库,和目录。

图 10:部分实现模型

图 10:部分实现模型

在标准的 RUP 中,实现模型工作产品是实现规程的实现模型任务结构的输出(图 11)。然而,在我们的过程中,软件架构师回退到代码,以此任务由此得名。该模型将由过程中随后出现的任务补充。

图 11:构造实现模型

图 11:构造实现模型

运行用例

在 此任务中,我们开始鉴别实现用例的代码。首先,我们必须选择业务任务和相关的用例来根据我们设置的优先级列表。由于我们不能用所有可能的输入值运行用例, 所以我们必须只局限于系统用户所建议的典型值。后者在来自于定义执行详情任务的执行用例工作产品中记录。它指定用例的输入参数和执行条件(此工作产品和任 务是类比 RUP 的测试用例和定义测试详情命名的)。然后,我们运行所选择的用例并记录软件的执行轨迹 —— 也就是,执行的功能或方法序列。图 12 表示业务工人及其相应的系统用例。当执行该用例时,记录执行轨迹。这可以通过操作代码、使用调试器,或操作执行环境来完成。 6 这些任务由一个新的角色执行:用例分析员(图 13)。

图 12:用例的执行踪迹被记录了

图 12:用例的执行踪迹被记录了

图 13:执行用例

图 13:执行用例

分析调用图

如 早先提到的,从与用户的交互那里重新获得的用例的事件流不太可能完整。我们当然不应该期望另一种事件流是无移漏的。因此,这样的用例的执行轨迹将不会执行 实际地实现该用例的所有功能。要补充它们,我们必须找到所有由轨迹的功能调用的功能。然后,我们由轨迹的功能开始执行代码的静态分析来构建上下文敏感的调 用图。 7 这样的调用图是配对的(N,R),集合 N 中的节点是功能,R 是“调用”关系,也就是,在功能 f1 和 f2 之间有一条边,如果 f1 的实现包含对 f2 的调用,不论这种调用的条件是什么。要重新获得的功能集合 —— 用例功能的扩展集合 —— 是在运行所有可能的用例场景时可能执行的功能。事实上,功能扩展集合工作产品很可能比严格必需的包含更多功能。在一定程度上,这可以通过关联所有用例的扩展功能集合来分类。

图 14 表示包含了用例的扩展功能集合的调用图。红色的功能是轨迹上的功能,黄色的功能是由前者调用的功能。在下面的文字中,扩展功能集合会由这样一张图表示。该任务由一个新的角色执行,实现分析员(图 15)。

图 14:调用图表示扩展的功能集

图 14:调用图表示扩展的功能集

图 15:分析与所跟踪的方法相关的调用图

图 15:分析与所跟踪的方法相关的调用图

将功能映射到实现模型上

一 旦记录下已知的用例的扩展功能集合,我们就必须将这些功能映射到所恢复的实现模型中。基本上,所有功能都必须是在模型中识别出的某个类或文件中的一部分。 该映射将令我们找到已知业务任务的用例实现中所涉及的实现模型的元素。在图 16 中,所有黄色的类和包都参与了用例 1 的实现,也就是,用户 1 执行的业务任务。

图 16:从可扩展的功能集映射到实现模型中

图 16:从可扩展的功能集映射到实现模型中

在非面向对象的软件中,该图中的类会由文件代替。该任务的输出记录在一个更新的软件架构文档中。此任务由实现分析员执行(图 17)。

图 17:分析从功能到实现模型的映射

图 17:分析从功能到实现模型的映射

验证假设架构

在 过程中的此处,我们知道了用例的实现中所涉及的功能/程序/类/文件/包。现在我们必须使用该知识来验证我们在先前步骤中假设的代码假设架构(分析模 型)。首先,为了任意表格或文件的访问搜索扩展功能集合的源代码。这代表在用例执行过程中实际(或潜在地)被访问的数据结构。其次,一旦找到了这些表格或 文件,包含访问它们的功能的类或文件与分析模型中所期望的相比较。如果必要,必须相应地纠正模型。根据被分析的遗留系统,这些表或文件可能要在程序代码外 面(例如,在 IBM MVS 下运行的 COBOL 程序中,所访问的文件用作业控制语言声明)和/或直接在内部声明。重新获得此信息的技术高度具体到系统,但它通常是可行的,就如每种语言拥有具体到 I/O 的语句用于在代码中搜索。图 18 表示实体对象的验证。一方面,扩展功能集合让我们找到所访问的数据库表格。另一方面,这些 I/O 功能(方法)包含于实现类中。然而后者是与所期望的实体对象对应匹配的。

图 18:验证实体对象

图 18:验证实体对象

接 下来,我们继续边界对象(屏幕显示和接口)。在这种情况下,为所有与屏幕显示相关联的功能搜索扩展功能集合的源代码。然后,将包含类或文件与分析模型中所 期望的内容进行比较,并且,如果必要的话,纠正模型。这些与屏幕显示相关的功能是高度具体到所考虑的程序设计环境和程序设计语言的。通常,它们很好地写在 程序设计手册中,而且它们的识别不应该太难。图 19 表示边界对象的验证。在右边,利用程序设计环境的文档为与屏幕显示相关的功能搜索扩展的功能集合。然后识别出包含的类。这些类与所期望的边界对象(左边) 对应匹配的。

图 19

图 19:验证边界对象

作为第一次猜测,剩余的类(从扩展功能集合到实现模型的映射)是与控制对象相关联的,如图 20 的概要图中显示的。虚线表示从分析模型到实现模型的恢复的可追溯性链接。该任务的输出记录在更新的软件架构文档中。该任务由实现分析员执行(图 21)。

图 20:分析类到实现类的映射

图 20:分析类到实现类的映射

图 21:验证假设架构

图 21:验证假设架构

重构高层次架构

在此活动中,我们必须具体到每个用例的代码分类,并重新构建代码相应的高层架构。首先,我们必须处理类和文件层。然后我们深入到代码中。让我们获得已经逆向工程的用例的集合 UC UC= {UC1...UC2}并让我们定义以下三个功能:

  • classes(UCi):返回与用例 UCi相关的类的集合。这些是包含用例扩展功能集合的类。
  • specific(UCi):返回具体到包含只属于该用例扩展功能集合的功能的用例 UCi的类集合。
  • common({UC1...UCk}):返回对用例 {UC1...UCk} 集合通用的类集合。

然后我们有:

公式 1

用例集合的公共类集合仅仅简单地定义为:

公式 2

这 令我们绘制出用例集合的实现中所涉及的高层元素的图表。图 22 表示对已知用例唯一的元素(与用例颜色一致),及公共元素(绿色)。包含具体到用例的元素的包与用例是一样的颜色。那些包含公共元素的被染成绿色。请注意 这些颜色只与逆向工程的当前状态有关。很可能的是,随着更多用例加入分析中,颜色将会改变。

图 22:分析用例之中具体的和公共的实现类

图 22:分析用例之中具体的和公共的实现类

当 属于目标业务任务的所有用例都得到处理时,我们必须根据它们实现的用例将类(文件)分组,并记录到分析对象的可能映射。一旦对所有用例都完成了,我们就分 析代码的实现模型来检查某些类(文件)的逻辑分组是否已经在代码中存在。例如,这些小组会对应包和/或目录。在可能的分组范型中我们有:

  • 按分析对象类型分组(实例:实现边界的类)
  • 按用例分组(实例:实现已知用例的类分为一组)
  • 按信息来源分组(实例:访问已知数据库的类)
  • 按角色分组(实例:实现了与某个用户角色交互的类)

此外,已知的结构可以同时依据若干标准。由于此步骤,我们可以根据所发现的分 组拟定出代码的高层结构。例如,图 23 表示根据用例的分组,对于 UseCase1 和 UseCase2(Subfunction Use Case 1)的公共子功能用例将已经分析了。然而,该图还显示出一些公共代码可能不能很好地属于子功能用例 (UC-common 1-2) 的实现。

图 23:根据用例将实现类分组

图 23:根据用例将实现类分组

图 24 通过显示与分析对象的一致性将先前的架构表示溶合在一起。该结构可能在代码中找不到并且显示出只用来例举至今为止所恢复的信息。

图 24:根据用例合职责将实现类分组

图 24:根据用例合职责将实现类分组

很重要的是,要注意到即使在程序最初开始时做出某种逻辑分组,也可能出现的情况是,这些分组在系统维护的过程中也不会被考虑。 8 在这种情况下,一些显然的分组可能包含不考虑标准的类。该任务的输出记录在更新的软件架构文档中。此逆向构架任务由软件架构师执行(图 25)。

图 25:重新构建高层架构

图 25:重新构建高层架构

我们的过程总结

表 格 1 概括了我们的过程的主要任务合工作产品。绿色的元素与 RUP 中定义的一样。因为我们的过程的第三个步骤处理实际的代码分析,所以在 RUP 中没有等价的规程。因此,新的数据库分析任务与分析合涉及规程相关。另一方面,由用例的执行重新构造高层架构与实现规程相关。这导致我们在过程中定义两个 新角色:用例分析人员和实现分析人员,以及七个新任务。

表 1:我们的过程的主要任务合工作产品

表 1

本过程中的里程碑

再造工程项目的目标是重新构造遗留软件系统,以便提高一些质量属性。 9 该重构造会暗示技术框架中的变更,例如,到 SOA 框架的移植。不论技术是什么,逆向工程项目应该评估重构造的可行性。事实上,即使逆向工程的目标是对系统重新建模,那么它也必须将某个关键组件的移植定型为新的架构以检查其是可能的。

初 始阶段目的是评估项目的可行性。特别地,项目经理应该检查可以访问并询问足够多的用户,当前的数据库表格合源代码是可访问的,并且了解合适的工具和可用性 (例如,为了记录执行轨迹)。然后,应该将系统的一些关键部分逆向工程,并且验证到新平台的移植路径。最后,必须了解主要的风险。在初始阶段的末尾,可以 做出进行或不进行的决策。

详细描述阶段目的是将系统的关键部分逆向工程,并且重新编制它们的高层架构。特别地,遗留代码的类(文件)的实际分组范型,如果有,应该是知道的。此外,逆向工程环境合工具应该就位。在详细描述阶段的末尾,应该编制出要逆向工程的关键部分的架构。

在构建阶段,将项目范围内的所有组件都逆向工程。然后,在构建阶段的末尾,将系统完整地重新编制。

在转换阶段,将遗留系统的模型合文档传递到将正向工程新系统的团队。

结束语

我 已经介绍了在我们的逆向工程过程中需要的大部分任务和工作产品在 RUP 工具箱中找到或接近它们。值得提到的是在此工作中的用例模型所扮演的重要角色与在任何基于 RUP 的软件开发项目中一样。第一,用例帮助我们重新编制软件所支持的业务过程模型。第二,用例帮助我们构建遗留系统的假设架构。第三,用例是要运行来收集系统 的执行轨迹场景的来源。在某种意义上,用例模型让我们链接了高层业务功能和实现这些功能的低层代码。

将遗留软件系统逆向工程中的关键问题之一是了解代码并构建其架构表示。然而,这两个任务互相依赖,并且问题总是:如何开始?通过 RUP 对 UML 模型重新构造,我已经说明了一个解决方案。

注释

1 参见 IEEE Sorftware 1990 年 1 月的 E.J. Chikofsky 和 J.H. Cross 的“Reverse Engineering and Design Recovery: A Taxonomy”。

2 与 Comm. of the ACM,CACM 37(5),1994 年 5 月的 T.J. Biggerstaff Mitbander 和 D.E. Webster 的“Program Understanding and the Concept Assignment Problem”中描述的一样。

3 参见 J. Bergey 等人的“Options Analysis for Reengineering (OAR): Issues and Conceptual Approach”,Software Engineering Institute, Carnegie Mellon University,Tech。标记 CMU/SEI-99-TN-014,1999 年 9 月。

4 R. Kazman 和 J. Carrière,“Playing Detective: Reconstructing Software Architecture from Available Evidence”,Software Engineering Institute, Carnegie Mellon University,Tech Report CMU/SEI-97-TR-010。1997 年 10 月。

5 F. Abbattista、F. Lanubile,和 G. Visaggio,“Recovering Conceptual Data Models is Human-Intensive,”5th International Conference on Software Engineering and Knowledge Engineering,1993 年。

6 A. Hamou-Lhadj 和 T. Lethbridge,“A Survey of Trace Exploration Tools and Techniques,”Proc. of the 14th Annual IBM Centers for Advanced Studies Conferences (CASCON),IBM Press,多伦多,加拿大,2004 年 10 月。

7 参见 D. Grove 和 C. Chambers,“A Framework for Call Graph Construction Algorithms,”ACM Transactions on Programming Languages and Systems 23(6),2001 年 11 月。

8 P. Tonella 和 A. Potrich,Reverse-Engineering of Object Oriented Code。Springer 2005 年。

9 参见 J. Bergey 等人,前面引用的书。



参考资料



关于作者

author photo

Philippe Dugerdil 是瑞士日内瓦应用科学大学 HEG(Haute école de gestion)的软件工程教授。在这之前,他在软件行业工作了十五年,主要致力于银行业软件部分。他拥有计算机科学的博士学位,以及工商管理硕士学位。 您可以通过 philippe.dugerdil@hesge.ch 联系他。

基于统一场景的设计: 从概念到实践

基于统一场景的设计(USBD)的 UML 扩展和工具

developerWorks


级别: 中级

Alex Donatelli, 高级技术人员, IBM Tivoli Software
Rosario Gangemi, IBM Tivoli Configuration Manager Architect, IBM Tivoli Software
Claudio Marinelli, IBM Tivoli Configuration Manager Designer, IBM Tivoli Software
Roberto Longobardi, 交互解决方案设计人员, IBM Tivoli Software

2008 年 8 月 07 日

这篇文章是本系列文章的 完结篇,它描述了用于方法学的 UML 扩展和支持工具。本文将关注点放在支持 USBD (基于统一场景的设计)的工具上面,也就是将用于 IBM® Rational® Software Architect 版本 7 以及后续版本的 IBM® WebSphere® Business Modeler 集成特性,以及一组 UML 2.0 的扩展放置到一组 UML 规范之中。这其中包括一个 UML 2.0 规范以及一个帮助创建 Business Model、Business Analysis Model、Use Case Model 和 User eXperience Model 的模型模板。

入门简介

本系列前面的几篇文章中,我们已经描述了一个基于基于场景的设计(Scenario Based Design,SBD) 和 Outside-In Design (OID) 的一个有效的统一设计方法论。该方法论被称作 基于统一场景的设计 (USBD)。它的关注点在于产品所处的点对点的业务环境,而不是仅仅描述围绕在单一产品周围的业务场景。通过描述业务需要和软件执行之间的链接方式,这 些文章大致描绘出了通过处理过程路线图、目标和类图表捕获业务处理过程的方式,以及如何根据实际执行来跟踪他们。本系列文章还描述了一种用户接口同系统分 析相链接的正式的表示法。

本文将关注点放在支持 USBD (基于统一场景的设计)的工具上面,也就是:

  • 用于 IBM® Rational® Software Architect 版本 7 及其后续版本的 IBM® WebSphere® Business Modeler 综合特性。
  • 被捕获到一组 UML 规范中的一组 UML 2.0 扩展。

WebSphere Business Modeler 综合特性是同 Rational Software Architect 相伴而来的,并且被用作讲一个在 WebSphere Business Modeler 中被开发的的业务模型导入到 Rational Software Architect 之中。这一特性还包括一个被称作 IBM® WebSphere® Business Integration Modeler Nav Tree Profile 的 UML 规范,它提供了能够自动被应用于在导入期间被转换的 UML 类、接口和其他元素的 UML 模板。

Rational Software Architect 包括另一个被称作 Business Modeling Profile 的 UML 规范,它提供了进一步加强业务模型的其余一组 UML 模板。

为 了通过特定于 USBD (基于统一场景的设计)方法论的概念来补足这两个规范,IBM 开发了另外一个规范,即用于 USBD 的 UML 2.0 规范。它定义了另外一组模板,当它们被应用到类时,接口以及其他的模型元素都根据 USBD 概念来表现它们。该规范将和 IBM® Rational® Software Delivery Platform (例如:IBM® Rational Software Modeler 或者 Rational Software Architect)一起被使用。

下一小节将讨论 USBD (基于统一场景的设计)的概念,在后面的小节中,我们将描述如何通过前面所提到的三种规范来刻画这些概念。





回页首


USBD (基于统一场景的设计)元模型

本小节将通过一个元模型帮助您更好地理解 USBD 方法论。这个模型描述了您使用 USBD 方法论在软件设计(包含业务、用户和系统)及其相互关系中将会捕获到的概念。该模型包括 USBD 的分类法和存在论。

用户、目标、处理过程、用户接口面板等概念都被放到一起,它们之间的关系通过一个模型来确定和描述。该元模型描述了实际的模型将如何使用 USBD 方法论。下一小节描述了被用来支持这些概念建模以及 USBD 模型结构的实际的 UML 扩展。

图 1 和图 2 分别显示了完整的元模型图表的左右两个部分。


图 1:对业务处理过程进行建模。
对业务处理过程进行建模

图 2: 根据业务上下文环境获得系统的需求和行为。
根据业务上下文环境获得系统的需求和行为

关于这些图表,正如在本系列的前几篇文章中我们所看到的:

  • 一个 Business Process Map (业务处理过程路线图)包括一组 Business Processes (业务处理过程)。
  • Business Processes (业务处理过程)同 Business Actors (业务活动者)所开启的 Business Use Cases (业务用例)是一一对应的。
  • Business Event (业务事件)是一种特殊的 Business Actor (业务活动者),它也能够开启 Business Use Cases (业务用例)。
  • 一个特定的 Business Process Realization (业务处理过程实现)就是 Business Roles (业务角色)执行一组 Business Process Activities (业务处理过程活动)。

在一个更低的层次上,重复着同样的逻辑结构(或者结构模式):

  • 业务处理过程活动同业务角色所开启的业务处理用例是一一对应的。
  • 业务处理用例的存在支持业务目标。
  • 业务目标是由您的客户来制定的,并且可以通过测量来被评价。
  • 一个特定的业务处理活动实现就是业务工作者执行一组业务处理任务(生产、消费、交换业务实体等)。
  • 业务实体同样在一个更高层次上作为实体在业务处理实现之间被交换。
  • 由业务工作者所完成的任何一个这样的实现都是一种真实描述一个业务场景的交互作用。

在业务层和系统层之间,有两条链接。

  • 业 务工作者在一个场景中所执行的某些活动,甚至是所有的活动,都能够被自动地执行。USBD 最佳实践建议:每一项在业务处理过程活动实现中被自动执行的操作都确定了一个系统活动者(即调用该操作的一方)以及一个系统(即操作提供者),并且能够被 映射到一个相应的用例实现上。
    因此,每一个被选中为自动执行的业务工作者操作,都映射到系统层上面一个相应的用例实现。当然,这个用例实现链接到它所实现的用例上面。
  • 与此同时,一个用户(一个特定类型的系统活动者)扮演一个业务角色(或者该场景中的业务工作者),并且使用一个系统来执行相应的操作。

您能够在图 1 和图 2 中看到业务工作者(及其操作)和业务角色,并且他们表现了业务层和系统层之间的链接。

但是当系统活动者是一个真实的用户的时候,还有系统设计的另一个方面开始活动。

  • 进入用户经验的领域,您希望以有目标的角色的形式捕获到用户原型。
  • 除此之外,您还需要设计用户接口,图 2 显示了如何做。
  • 用例情节串联模板提供了另外一种描述用例实现的方式。情节串联模板描述了实现用例的用户接口元素的导航,从而支持相应的用户目标。




回页首


UML 2.0 扩展

表 1 描述了被引入到 UML 2.0 中的支持 USBD (基于统一场景的设计)概念建模的扩展。Business Modeling UML 2.0 规范是由 Rational Software Architect 的版本 7 引入的,与此同时,WebSphere Business Integration Modeler Nav Tree Profile 同 WebSphere Business Modeler 集成在了一起。

下面各小节将向您展示如何向模型中添加所有需要的规范。


表 1:UML 2.0 扩展以及它们到元模型中概念上的映射。
元模型类UML 元类使用UML 原型应用UML 概要文件用于协作的图
参与者参与者-

业务参与者参与者业务建模
业务实体业务建模
业务事件信号业务建模
业务目标业务建模
业务过程协作 | | | WBI Modeler Nav Tree Profile | USBD活动图
业务过程活动调用行为活动USBD
业务过程活动实现协作USBD时序图
业务过程路线图协作USBD活动图
业务过程实现协作USBD活动图
业务过程任务消息, 操作N.A. (针对消息), | (针对操作)USBD | 业务建模
业务过程用例用例USBD
业务角色类, 活动划分 (针对类), N.A. (针对活动划分, 使用 "Represents")USBD
业务用例用例业务建模
业务执行者接口业务建模
客户涉众参与者USBD
度量属性USBD
操作操作-

人物类型 | USBD
用例用例-

用例实现协作标准活动图
用例情节板协作USBD状态机图|时序图
用户参与者USBD
用户目标USBD
用户接口元素类, 状态USBD





回页首


用于基于统一场景设计的 UML 2.0 规范

图 3 显示了用于 USBD (基于统一场景的设计)的 UML 2.0 规范的新模板。表 1中 并没有列出所有的模板。这些仅仅是当您将模型中的元素组织到不同包之中时除了由 WebSphere Business Integration Modeler Nav Tree Profile 所提供的模板之外的其他可选的模板。正如示例模型将要说明的那样,用更加具有描述性的包组织一个模型将大大增强它的可用性。


图 3:UML 规范。
UML 规范

为了能够在规范中使用模板,您需要将其安装到 Rational Software Architect 之中。

安装用于 USBD (基于统一场景的设计)的 UML 2.0 规范

您应当首先在 下载 一节中下载档案文件,并且将其解压缩到本地。然后,您就能够使用通常的操作步骤来安装规范,从而将插件程序安装到 Eclipse 开发平台之上了。

具体的操作步骤如下所示:

  1. 打开 Help 菜单,并且选择 Software Updates > Find and Install
  2. 下一步,选择 Search for New Features to Install,然后点击 New Local Site
  3. 定位到档案文件被解压缩的目录(即 site.xml 文件所在的目录)。
  4. 在下一个对话框中,将其命名为 USBD Profile Site
  5. 点击 Finish
  6. 在下一个对话框中,展开 USBD Profile Site 节点,并且选择 Unified Scenario Based Design feature 1.2.0 特性。
  7. 继续完成向导所示的剩余步骤,安装 UML 规范。

在下一小节中,您将看到如何将一个业务处理过程(它在 WebSphere Business Modeler Advanced Edition 中被建模的)导入到 Rational Software Architect 之中,从而得到处理过程的自动部分的需求。





回页首


从“业务”到“代码”

基于统一场景的设计提供了一种从业务处理过程中得到软件需求的方法论,并且确保该软件同时满足业务和用户的目标。假设您的公司拥有一支业务分析和设计团队,他们负责建造通过 WebSphere Business Modeler 建模的业务处理过程的一个资产。

这些也许是您所在的公司所采用的的业务处理过程,或者是您的客户所采用的业务处理过程。 在前一种情况中,您可能会希望自动完成处理过程的部分操作,从而提高公司的效率。在后一种情况中,您可能会成为一个面对这样一项业务的软件公司:提出一种自动完成客户的处理过程的部分操作的软件解决方案。

图 4 显示了 WebSphere Business Modeler 中的示例业务处理过程模型的内容。


图 4:WebSphere Business Modeler 中的业务处理过程模型的内容。
WebSphere Business Modeler 中的业务处理过程模型的内容

特别地,图 5 显示了一个示例 Batch 和 Schedule Development 的业务处理过程。为了更好的描述在 WebSphere Business Modeler 中建模的可能性,并且理解每一项是如何被转化到 UML 的,这个例子显示了如下内容:

  • 用于收集 Scheduling 需求和收集 Batch 需求的简单任务。
  • 一个用于 Batch Development 的目标任务。
  • 用于 Schedule Developmen 和 Program Development 的全局处理过程。

我们还将描述全局知识库 Schedule Definitions、Batch Definitions 和 Program Library 将如何在转换中被处理。


图 5:WebSphere Business Modeler 中的 Batch 和 Schedule Development 业务处理过程。
WebSphere Business Modeler 中的 Batch 和 Schedule Development 业务处理过程

图 6 展开了 Schedule Development 全局处理过程的细节,这些细节将在下一小节中被选为自动处理。处于简单性的考虑,其中只包括一个活动。


图 6:WebSphere Business Modeler 中的 Schedule Development 业务处理过程的细节。
single element in model

您 可以通过将 WebSphere Business Modeler 模型导入到 Rational Software Architect 之中,将知识传递到您的开发团队,从而提高业务处理过程资产的价值。在 Rational Software Architect 中,您能够通过 USBD 方法论的额外的语义学来补足知识。除此之外,在模型元素之间的路线关系将为您提供一幅关于问题的业务、系统和用户经验方面的全景图。

将一个 WebSphere Business Modeler 处理过程模型导入到 Rational Software Architect 之中

在 开始之前,请确保您已将将 WebSphere Business Modeler 综合添加到您的 Rational Software Architect 安装之中。通常,您是在安装 Rational Software Architect 时指定这个选项的。如果您并没有这么做的话,那么您能够在稍后使用 IBM Installation Manager 从 Rational Software Architect 安装媒体中将其添加。

在本小节中,您将看到如何导入一个用于“富裕公司”的示例业务处理 过程模型,接着前文中所给出的“工作量安排处理过程”的例子。我们在一个新的工作区中启动一个 Rational Software Architect,并且将其切换到建模视图。我们现在将 WebSphere Business Modeler 模型导入作为一个现已存在的项目:

  1. File 菜单中选中 Import。弹出导入对话框,如图 7 中所示。

    图 7:导入 WebSphere Business Modeler 项目。
    导入 WebSphere Business Modeler 项目

  2. 在 General 文件夹中,选择 Existing Projects into Workspace,并且点击 Next
  3. 接下来,指定业务处理过程项目所在的 WebSphere Business Modeler 工作区目录。
  4. 在图 8 中所示的对话框中,选择您希望导入的项目,以及其内容是应当被复制到 Rational Software Architect 工作区中,还是被引用到 WebSphere Business Modeler 中。

    图 8:选择要导入的 WebSphere Business Modeler 项目。
    选择要导入的 WebSphere Business Modeler 项目

  5. 点击 Finish。业务处理过程模型被转换到 UML,并且被导入到 Rational Software Architect 工作区中。图 9 显示了操作结果。


    图 9:在 UML 中被转换的被导入的项目。
    在 UML 中被转换的被导入的项目

同步模型的版本

请注意,您当前所看到的是原始模型的一个不同的表示法。这个“UML 表示”实际上是只读的,也就是说您不能够改变 UML 模型,也不能够通过这些改变来影响原始的 WebSphere Business Modeler 业务模型。

在实践中,您实际操作的是一个内存中的 UML 模型,它在工作区中并没有一个副本文件。第一件要做的事情就是将模型保存到一个文件中,以便您能够将 UML 模型的任何改变保存下来。

当 然,这就意味着如果您将 UML 模型保存到另一个文件中的话,您就需要负责使其同原始的 WebSphere Business Modeler 业务模型相一致。在您保存模型的同时,应当关闭原始的 WebSphere Business Modeler 模型(实际上就是 resource.xmi 文件),并且打开新的 .emx 文件继续进行操作。

请注意,在 WebSphere Business Modeler 中所定义的业务模型元素已经被转换到 UML 元素中,并且没有创建任何图表。为了创建图表,需要我们创建一组图表,并且将被转换的元素放至其中。首先,创建一个自由格式的图表,然后将 Business ItemsProcesses 包中的所有条目拖动到该图表之中。图 10 显示了布局改造后的结果。


图 10:由此得到的 UML 项目元素。
由此得到的 UML 项目元素

请 注意,每一个处理过程都被转换为两个条目:一个 和一个 ,第一个条目是一个 UML 用例,而第二个条目是一个 UML 协作。每一个业务条目都被转换为一个 ,而每一个角色都被转换为一个

根据 USBD (基于统一场景的设计)概念补足业务知识

至 此,您已经将相关的业务处理过程的知识导入到 Rational Software Architect 之中,并且您希望通过那些 WebSphere Business Modeler 不打算捕获的概念来增强这些知识。为了能够在我们的模型中使用 USBD (基于统一场景的设计)模板,您首先需要做的就是将用于 USBD 的 UML 2.0 规范添加到这个模型之中。

  1. 在左侧的资源树中,选择 UML 模型,然后在透视图中选择 Profiles 标签。
  2. 点击 Add Profile 按钮。弹出如图 11 中所示的对话框,从中您能够选择 USBD 规范。

图 11:将用于 USBD 的 UML 2.0 规范添加到模型之中。
将用于 USBD 的 UML 2.0 规范添加到模型之中

您将首先对业务目标进行建模,尤其是那些对您已经描述过的业务处理过程产生影响的目标。

  1. 首先在您的 UML 模型的顶部创建一个包,并且将其命名为 Business Goals (业务目标)。
  2. 接下来,通过 USBD 规范中的 模板对其进行刻画。
  3. 然后,在该包中打开图表,并且创建两个类以反映两个业务目标,并且将它们模板化为
  4. 然后,您就能够为这些目标添加方法,作为相应的类属性,并且将它们模板化为
  5. 至此,您需要对建立这些目标的人进行建模,这是因为这是这些人希望收到关于公司如何实现这些目标的报告。您可以通过向处理过程包中添加一个新的 来完成这一操作。同时,也要将 模板添加进去。

其结果如图 12 中所示。


图 12:业务目标。
业务目标

您现在就可以在导入的业务处理过程上进行业务分析,进一步指定处理过程活动。这将允许您决定希望哪些活动被自动执行,从而得出用于相应的软件系统的需求。

  1. 您 首先希望检查 Batch 和 Schedule 开发业务处理过程。因此,展开 包,然后是 Batch 和 Schedule Development —— 即模板化的 UML 协作,然后是其中的 UML 活动。
  2. 您需要创建一个图表来查看该活动,右键双击活动结点,然后选择 Add Diagram > Activity Diagram
  3. 这个新图表中自动加载了 UML 活动。打开该图表,如图 13 所示,您将注意到原始的业务处理过程已经被转换为如下内容:
  • 在原始处理过程中被调用的每一个简单任务、全局任务和全局处理过程,都成为新的处理形式中的一个调用操作活动。
  • 每一个这样的调用操作活动都被放置到一个泳道中,用来表现执行原始任务或者全局处理过程的原始活动者。每一个泳道都对应一个相应的业务活动者。
  • 原始任务或者全局处理过程的输入和输出都被正确无误地转移到相应的调用操作活动中。

图 13:被转换的业务处理过程的摘录。
被转换的业务处理过程的摘录

这 个例子将关注 Schedule Development 全局处理过程,而图 14 显示了在您以同样的方法添加相应的活动图表之后的情况。出于简单性的考虑,这个子处理过程只包含一个任务,此处被转化到一个被称为“为 Batch 创建一个 Schedule 定义”的 Call Operation Action (调用操作活动)。


图 14:Schedule Development 业务处理过程。
Schedule Development 业务处理过程

您希望进一步分析这个活动及其子任务。您将通过开发一个 (一个在 表 1 中被显示的 UML 协作)来完成这一操作。

  1. 在进行这一操作之前,您需要分配一个适当的包来包含这些实现,所以我们创建另一个顶层包,并且通过 模板来对其进行刻画。
  2. 此时,您将在一个 Sequence Diagram (序列图表)中描述“为 Batch 创建一个 Schedule 定义”活动所需要的任务流程,如图 15 中所示。

处理过程中一个活动的实现是由相应的业务活动者发起的,并且由一组业务工作者执行。将各种协作工作者从模型树中拖动到图表中,从而描述实现该处理过程活动的任务序列。


图 15:为 Batch 活动实现创建一个 Schedule Definition。
SequenceDiagram1 tab

您将注意到一个被称为 Workload Scheduler 的新工作者的出现。您已经在 包中显示的创建了这个工作者,这是由于您发现了一个参与到这个活动的实现中的新的活动者。正是在此处,您将业务的上下文环境传递到系统的上下文环境:假定 您已经决定自动执行这个 Workload Scheduler 工作者。请您执行下列步骤:

  1. 首先,将 模板添加到这个类中。
  2. 现 在,您应当理解同这个工作者的每一次交互作用都定义了相应系统的一个用例,例如:一个交互作用成为了在序列图表中所描述的一个消息,而该序列图表对应于业 务工作者类中的一个操作。随后,您还能够创建系统活动者来对应那些同新系统向连接的工作者(活动者),并且将 或者 模板添加到它们之中。
  3. 图 16 中显示的用例模型来自于 Workload Scheduler 工作者的引入消息,您可以在模型中所开发的所有活动实现中找到这些工作者。
  4. 您还能够看到一个系统活动者,它是一个符合 Schedule Developer Business Actor 的 。您可以通过创建一个结点,将这个用例模型直接链接到序列图表上面,并且将该用例图表从模型树中拖动到这个结点之下。
  5. 除此之外,您能够将这些用例打包到一个顶层包中,并且使用 模板对其进行刻画。

图 16:工作量 Scheduler 用例模型。
工作量 Scheduler 用例模型

现 在,我们希望这些用户对这个系统拥有一个成功和愉快的体验。USBD (基于统一场景的设计)方法论允许您设计这样一个系统,该系统将用户整合到业务处理过程之中,这应当肯定地说是一个成功的体验。然而,您可能还想将人为的 因素考虑进来,从而提供一个有效的、简单的并且舒适的交互作用。

一种方法就是执行 Interaction Design (IaD),它最终定义了 Personas (角色)并且捕获了 User Goals (用户目标)。图 17 中显示了您如何描述模型中的用户目标,并且将系统的用例绑定到这些目标上。尽管这个例子并没有对其加以讨论,但是角色还可以通过使用 USBD 模板被描述和刻画,正如 表 1 中所描述的那样。


图 17:用户目标。
用户目标

最后,由于用户和系统之间的交互作用将会通过一个用户接口被建立,所以您能够为每一个相关的用例开发一个用例情节串联图板,根据参与的用户接口元素来描述这个交互作用将会如何发生,以及它们将如何被导航。

用例情节串联图板是用例的另一个 ,就像您在 Analysis 模型中所描述的通常实现一样。但是,它并没有定义用例如何通过系统被内在的实现,而是定义了用例如何通过其用户接口被外在的实现。图 18 中显示了您如何通过使用由一个状态机所描述的 UML 协作来建模一个用例情节串联图板。

您 可以将协作和状态机都模板化为 ,状态集中的每一个状态都是一个 。表现用户接口面板以及它们之间转换的各个状态,反映了和用户在面板上的活动相对应的定位路径。情节串联图板也被证明 在设计用于用户接口的测试实例时是有效的。再一次说明,您能够将情节串联图板打包到一个顶层包之中,您可以使用 模板来刻画它。


图 18:创建 Schedule 用例的情节串联图板。
创建 Schedule 用例的情节串联图板


图 19:业务处理过程路线图。
业务处理过程路线图




回页首


总结

这篇文章是本系列的完结篇,它总结了在 IBM Rome 开发实验室中被成功实践的需求聚集和设计的方法论。

本 文描述了关注于点对点的业务环境(即产品所存在的地方)的基于统一场景的设计(USBD)方法背后的原因,并且提供了将其链接到自动执行业务的系统的上下 文环境中的强有力手段。通过解释如何将业务需要链接到软件执行,本文描述了通过处理过程路线图、目标和类图表来捕获业务处理过程的方式,以及如何通过系统 执行来跟踪它们。本文还讨论了一种用户接口同系统分析相链接的正式的表示法。

本文所关注的重点在于帮助您将 USBD 方法论投入实践的那些工具。本文提供了一个新颖的规范,当您在 IBM Rational Software Architect 版本 7 及其后续版本中将它同 IBM WebSphere Business Modeler 综合特性一起使用时,这个规范允许您以一种正式的方式捕获和描述所有和业务、系统、用户经验层相关的概念。






回页首


下载

描述名字大小下载方法
UML 2.0 Profile for USBDusbdprofile_1.2.zip101KBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术

讨论


作者简介

Alex Donatelli's photo

Alex Donatelli 是 IBM 的一名高级技术人员。他是在意大利罗马的 Tivoli Laboratory 的主架构师,以及 Rome Central Architectural Team 的经理。他一直与罗马的 Tivoli 人员和整个技术社区一起,改进产品的质量。统一基于场景的设计工作是众多工作之一。


Rosario Gangemi

Rosario 是意大利罗马的 Tivoli Laboratory 中的一名高级软件工程师。他是 IBM Tivoli Configuration Manager 的主架构师,在软件开发方面有十五年的经验,担任过软件工程师,市场经理和人员经理。在他之前的工作中,他一直从事于复杂企业级应用程序的架构,设计,发 起人以及驱动实施。他经常与合作伙伴和客户工作在一起,有着大量的经验,将业务需要转化产品和解决方案需求。他获得过 Messina 大学物理学硕士。


Claudio Marinelli

Claudio 目前是一名高级软件工程师,也是IBM Tivoli Configuration Manager 的主设计师,有14年多的经验在系统管理区域进行开发和理想状况。他是在 RUP 和 基础上的。他被认为是在 RUP 和 UPS 方面的一个核心专家,他目前主要关注于软件工程最佳实践和模型驱动架构。


Roberto Longobardi

Roberto Longobardi 是 IBM 的一名 Interaction Solution Designer。他从事过多个 Tivoli 开发项目,包括性能和可用性以及负荷管理方面。最近他正在尝试为 IBM Tivoli Workload Scheduler 界面提供一个重新设计基础,他寻求通过更接近其业务和运营环境来极大改善解决方案能力。统一的基于场景的设计是与罗马的 Central Architectural Team 的经验结合的结果。