体系结构的视图约束
体系结构[用户界面取决于订单框架];
体系结构[订单框架取决于存货系统];
体系结构[存货系统取决于网络];
体系结构[网络取决于订单仓库];
设计视图约束
设计[订单获取UI取决于订单框架];
设计[订单处理UI取决于订单框架];
设计[存货UI取决于存货系统];
设计[订单框架取决于存货系统];
设计[订单框架取决于网络];
设计[存货系统取决于网络];
设计[网络取决于订单仓库];
映射
设计[订单获取UI] 映射到 体系结构[用户界面]
设计[订单处理UI] 映射到 体系结构[用户界面]
设计[存货UI] 映射到 体系结构[用户界面]
设计[订单框架] 映射到 体系结构[订单框架]
设计[存货系统] 映射到 体系结构[存货系统]
设计[网络] 映射到 体系结构[网络]
设计[订单仓库] 映射到 体系结构[订单仓库]
完整性规则
对于所有体系结构的视图约束存在设计视图约束;
例如:
体系结构[用户界面取决于订单框架] =>
存在:设计[订单获取UI取决于订单框架] 或者
设计[订单处理UI取决于订单框架] 或者
设计[存货UI取决于订单框架]
一致性规则
对于所以设计视图约束存在体系结构约束;
例子:
设计[订单处理UI取决于订单框架] =>
存在:体系结构[用户界面取决于订单框架];
|
表格 3 描述产品订货系统的分层体系结构模式
产品订货系统
|
用户界面(订单获取UI,订单处理UI,存货UI) |
订单框架 |
存货系统 |
网络(LAN) |
订单仓库 |
建立这些约束是变换的责任,并且在这种情形下能够自动完成。例如,利用我们在表格 1 中的分层模式的知识我们可以自动导出层间的调用依赖关系。优点是模式的语义只需要定义一次并且可以在以后重用。视图的语义和符号也可以看作模式。这样,图
3 的包图带有一套预定义的相关约束。一旦定义,就可以对包图的不同实例导出设计约束。
表格 2 的映射部分定义了体系结构视图(表格 1 )和设计视图(图 3 )部件之间的关系。在这个例子中,用于映射的模式使用不是那么明显。我们将在后面讨论它们对于映射的使用。
表格 2 中最后两个部分是部分的分化活动。在那里,定义了两类规则,一个用于一致性,另一个用于完整性。如果体系结构定义的一些部件或连接器没有反映在设计中,就可能显示潜在的不完整。在另一方面,如果设计与体系结构抵触,那么这可能指出潜在的不一致性。另外,对于每套我们比较的视图,规则只需要定义一次;那些规则然后可以重用。在体系结构和设计实现之间确定不匹配现在是评估规则和约束的事情。这样揭示了没有完整性方面的不匹配情况,然而,有些不一致性方面的不匹配:
1) 存货UI部件对于存货系统的依赖与分层体系冲突,用户界面不允许不经过订单框架直接与存货系统进行交流。
2) 类似地,订单系统要求使用存货系统访问网络。

图 3 UML中的高层设计(包图和依赖)
确定这些不匹配并没有对他们的起因给出任何反馈。例如,是体系结构还是设计错误?表格 3 说明通过提升存货系统到订单框架同一个级别来解决上述所有不匹配而不会引入新的不匹配的可能方法。我们不相信实际的不匹配解决方法将彻底地自动完成。这种方法与先前的自我纠错源代码编译器的尝试相同,这种努力最后因为所包含的社会和技术的复杂性而失败了。可是,我们相信提供给设计者不仅仅使用(潜在的)不匹配,而且用关于怎样在处理不匹配以及理解它们这两者高度有利的情况下解决它们。此外,它可能对发现处理具有更好选择情形的技术非常有好处。我们将在[Egyed
1996]中更详细地讨论这种情形。
映射
图 4 表明我们系统的另一个视图,图 3 的一个精炼。另外,该视图可以对修订的体系结构和高层设计都能进行校验,然而,并没有发现不匹配。该视图用另外的设计模式例如模板【[2]】(Template)模式(通过<>构造型指定)和代理【[3]】(Proxy)模式(通过《Proxy》构造型指定)。我们将使用它们进一步探究模式在视图集成中的价值。

图 4 高层设计视图使用UML类和包的精炼

图 5 低层设计视图使用UML类图
图 5 描写了对应的低层实现,它不只是解决用于图 4 中的模式,而且也精炼其它的一些建模元素。顶部三个类对应用户界面层,存货系统可以通过存货代理来访问,仓库可以类似地通过仓库代理来访问。要找出该视图是否和先前的视图一致,我们可以运用几个集成技术。
首先,我们需要找出哪些模型元素互相对应(映射)。这有几种技术可以应用,例如名字的相似性等等。可是,在该例子中模式的广泛使用使我们能够开发关于它们用于映射的知识。通过图4中的高层设计我们明白几个事实:
模板模式用于订单行(OrderLine)
代理模式用于桥接订单行(OrderLine)(产品)与存货系统
代理模式用于使用Oracle 数据库桥接订单框架子系统
接口特征(例如,消费者类与订单、付款、和消费者UI接口)
图 6 结构化模式知识(改编自[Buschman et al. 1996])
虽然从技术上讲,最后一项并不是一个清楚定义的模式,然而它构成类配置的知识――这样,接口特征可以看作模式,即使它们大部分只是领域模式。关于领域的模式知识如同预定义的模式(参看图
6 )一样使我们现在可以推论建模信息的关系。映射图 4 和图 5 的任务被精简为使用如图 6 所论述的预定义结构化模式知识来确定上述模式和(接口)特征的位置。
用图 6 作为指导,我们可以容易地确定模板模式(产品,队列,以及产品队列对应于订单行(OrderLine))的对应。虽然,它也可以容易找到代理模式,怎样能够区分它们却不够清楚。注意到目标是使得计算机自动鉴别它们。要在后来做到这一点,我们可以使用上面讨论的接口特征(模式)。想法是,至少存在一些映射或者能够通过名称相似性来建立。使用该额外信息它可能自动从Oracle模式区分存货(Inventory)模式。
不幸的是,通过模式的映射仍然比上述例子可说明的要更困难一些。我们作了简化的假定,就是模式的结构和行为是静态的。虽然,通常模式不是那些精确定义的,并且我们需要它们更一般的描述。图
5 表明这样一个例子,仓库代理模式看上去不象定义的那样。然而,既然网络是部分代理类,它就可以合并到代理类中,并且代理类继承它所有的依赖关系(下一节的Rose/Architect将表达一个模型来这样做)。
该映射技术的另一个问题是模式,在识别的时候,有时可能只是粗糙地指出它们的位置。例如,对应于队列,产品,和产品队列,订单行队列(OrderLine
Queue)可以在低层框图中找到。虽然这也是正确的,但是它丢失了同时在低层框图中表示的组成订单行(OrderLine)。
变换
模式和抽象
单独的介于图 4 中的高层视图以及图 5 的低层视图之间的映射不足以确定不匹配。例如,在图 4 可以看到付款是消费者的一部分,然而在图
5 中这种关系更加复杂。为校验两个图是按相同的方法讨论关系,我们可以使用Rose/Architect概念。
Rose/Architect [Egyed-Kruchten 1999]认为模式分组为三类,并且使用及物关系替换为更简单的模式。在类图中,及物关系论述那些不直接连结的类之间的关系。然而一个关系可以通过其他类(例如helper类)存在,它在它们之间形成了一个桥(例如,假设上述例子中付款和消费者并不直接相连,但是它仍然通过helper(帮助者)类事务(transaction)和账目(account)类给出关系)。这样,如果发现某些公式,它们可以按有效精度导出及物关系,那么,可以按工具形式提供简化和抽象类图方面的自动支持。这将允许设计者通过删除“帮助者类”从现有的、更细节化的模型中抽象出重要的类,这样将使得它们更进一步描写和分析类之间中间关系,即使这些类分散在整个模型的不同位置(例如,不同的框图,或者在不同的包和名字空间中)。
RA提供这种机制而[Egyed-Kruchten 1999]详细地讨论了这种技术。当前,RA模型由大概80条抽象规则组成。例如规则4,论述了一个类被第二个类泛化(继承的反义词)并且父类是第三个类的聚集(部分)(参看图
7 )的情形。这种三类模式现在可以删除中间类来简化并创建一个从第一个类到第三个类的及物关系(在该例子中的一个聚集)。下面的RA模型讨论这些规则以及必须怎样应用它们来产出有效的结果。
图 7 表明我们的低层设计视图(图 5 )中的付款给消费者关系案例的RA精炼步骤。在应用两个规则(分别是规则4和规则17)之后我们得到一个具有两个类以及它们之间依赖关系的简化模式。如果这也可以对其他类以及在映射小节中讨论的模式【[4]】进行处理,我们就可以自动产生更高层次的类图(图
8 )。产生的这个抽象视图现在就可以与我们在图 4 中描写的原始的更高层次类图直接进行比较了。这样,通过模式的使用我们可以转换视图以便它以非常类似其它视图的方式表达信息。比较视图现在可以简单地使用一些图形比较算法(也可参看上面所说的分化)的形式来完成。图
8 也显示了可能的不一致性。例如,从付款到订单的聚集丢失了,存货系统对Oracle数据库的调用没有使用网络部件,以及一些链接是不同的(例如,使用关联链接而不是依赖链接)。在变换(抽象)之后,这些不匹配可以容易地识别。
必须注意的是抽象没有彻底地自动完成。虽然,模式有助于在某些建模信息之间确定映射和变换,它们不能完全自动化该过程。因此,需要一些手工辅助来导出图
8 。而且,RA工具当前只能对付如图 7 讨论的简单的三类模式而不能处理图 6 中讨论的更加高级的设计模式。这样,由于该作业的缘故,抽象设计模式(例如代理)由手工完成。然而,一旦更加复杂的设计模式概念体现到RA中,这种抽象可以是自动的。对此,设计模式需要按照它们的输入(源)和目的以及它们的访问点进行讨论。
图 7 通过Rose/Architect的模式抽象
当前,另外一个RA缺点是它只能用于抽象类图信息。虽然该技术也可以扩展到抽象其它类型的视图,但是当我们想要比较不同类型视图的建模元素时它仍然对我们没有帮助。下一小节将论述这种情况。
模式和转化
鉴于抽象处理简化视图的情形,转化处理在不同类型视图之间共享建模信息的情况。例如,上述讨论中,我们广泛使用类和类图,它们按结构化形式表达信息。既然结构视图在表示系统行为通常是不足的,那么行为视图例如序列图就要用来填补这个缺口。
例如,再考虑表格 1 中体系结构分层模式的约束(与高层设计视图的约束一起)。在那里体系结构的约束决没有覆盖全部分层体系结构的行为。一个分层的体系结构不只是限制哪些层允许互相对话,它也限制交互的方向。虽然结构框图比如类图可以描写某些方向性的依赖,但是它可能忽略其它的方面。
图 8 使用Rose/Architect和设计模式抽象的类图
图 9 关于新订单创建的序列图(对应于低层次框图)
图 9 显示了一个更加复杂的行为案例。一个UML序列图在这里用于描述创建一个新的消费者订单的可能场景。在某些用户输入被校验之后,它检验消费者是否存在。如果不存在,新的消费者被创建,在此之后,建立新的订单。该场景描写低层次设计视图(图
5 )某些行为方面。照此我们可以使用图 5 自动检验类(或对象)之间的调用依赖,在这种情况下没有揭示不匹配情况。该序列图也符合我们的体系结构,因为所有的层次约束都观察到了(两者都可以自动检验)。既然按照组件的行为结构视图具有高度二义性,我们可以再次利用我们的模式知识精炼行为的信息。
图 9 利用订单仓库代理,网络,和Oracle数据库以及在映射中我们发现的那些对应代理设计模式的类。如在[Buschman
et al 1996]中所发现的那样,图 10 显示代理模式结构的和行为的定义。效应上,行为定义是结构的一个转化。这样,我们可以使用该知识来检验图
9 的正确性。
因为在图 10 中的代理定义和图 9 中代理实例化之间的抽象级别并不相同,我们需要先抽象图 9 。基本上,我们可以使用Rose/Architect概念通过合并网络到订单仓库代理中来抽象网络(这是有效的,因为网络是代理的一部分)。此后,定义和实例化之间的直接比较是可能的。在该案例中没有发现不匹配。
图 10 代理模式的结构和行为
由于篇幅的限制,我们不可能进一步讨论这个过程更多的细节。请参考[Egyed 1999a]和[Egyed 1999b]得到更多信息。
相关的工作
视图集成的缺乏并不是新发现。相反,很多模型描述都谈论到保持视图一致的需求。有时,处理模型提供有关什么任务可以提升体系结构概念完整性的附加方针。例如,一个关于使用WinWin
Spiral Model(螺旋模型)[Boehm et al 1998]的案例研究建议在LCO(life-cycle objectives,
生命周期目标)和LCA(life-cycle architecture,生命周期体系结构)阶段之后使用体系结构复审板(Architecture
Review Boards)[AT&T 1993]来检验和证实分析和设计的完整性。类似的观点可以在其他多不胜数的研究工作中看到:
[Sage-Lynch 1998]讨论集成(企业范围)的不同方面。他们一再地强调“体系结构在系统集成中承担重要的角色。”他们针对三个主要的视图表达需求:企业视图,系统过程和管理视图以及技术实现视图――并且他们强调在这些视图之间保证一致性。
[Rechtin 1991]非常强烈地要求和接口定义同等地强调需求的有效性和一致性。他进一步促成问题检测和诊断的需要。
[IEEE 1998]体系结构评估演说。“评估的意图就是要确定一个体系结构的描述质量,以及通过它评定关联的体系结构的质量”。他们进一步陈述了确定哪种体系结构可以进行校验的评价准则需求。
[Nuseibeh 1995]写到“不一致性是一个复杂的、增量软件开发过程不可避免的部分”,还有“增量软件系统开发包括不一致性的检测和处理”。
[Perry0Wolf 1992]早就了解到软件体系结构的重要性,并且他们将它陈述为体系结构四个主要好处之一,它们是“用于依赖性和一致性分析的基础”。
[Shaw-Garlan 1996] 非常激奋地讨论体系结构,作为“系统设计的实质上的民间传说,很少具有一致性和精确性”。他进一步陈述“软件体系结构在框图和通俗散文中找到它的根基。不幸的是,框图和描述是高度二义性的。”
这些以及更多的参考文献,谈论到集成的需要(或缺失)。然而,他们通常不详细地讨论包含的活动(也有些例外)。有时这些工作并不是出于对集成逼近特别的喜爱。在另一方面,有时提议的技术经常只是打算让人们能够互相交流。例如,体系结构复审板[AT&T
1993]或者检查过程(Inspection Process)[NASA 1993]主要地应用于使大多数有能力的人们在一起工作,以便他们能够共享信息。这些技术可能遵循已定义好的过程(例如,检查单)并且可能出产有效的结果,但是实际上,确定和解决瑕疵的活动仍要手工完成,没有多少自动协助。
结论
本工作讨论了在UML视图中体系结构不匹配的原因以及说明了集成技术可以怎样按更自动化的方式应用于鉴别和解决它们。我们用统一建模语言(UML)的语境及其视图(框图)来表述本工作,并使用一个例子来引导视图集成的主要阶段。在本论文中表达的视图集成框架并不限制于UML。它也可以应用于其它模型和视图(例如体系结构描述语言)。
本工作进一步介绍了在分析软件系统模型概念完整性中的模式使用。既然模式是完好描述和文档化的,在结构和行为两方面,我们可以频繁地使用这些知识用于视图分析。照此,我们说明了关于模式的知识可以用于映射视图(相关建模信息的交叉引用),也可以从一个视图到另一个变换信息。后来我们说明了抽象(Rose/Architect)和变换技术。
虽然视图集成框架创建的意图是支持自动的视图分析,手工介入经常还是有必要的。既然本文只是集中于模式,其他集成技术也就没有讨论(也可参看[Egyed
1999b])。我们将发表的内容为:
发现(或开发)覆盖更加广泛视图范围的集成技术
处理可量化性
增加更多的精确性到UML中澄清二义性。
论述自动化支持的不匹配解决的情况(而不仅仅是不匹配的自动确定)
不管这些问题,我们已经取得在该领域广泛的进步并且我们感觉到使用集成技术的好处,例如在本文中所讨论的,是无限的。我们已经表明不匹配鉴别的任务自动化是可能的(至少部分可以),既然计算机在比较视图无疑更加有效率,这就意味着本质上节省了人工劳动。我们近似的另一个好处是不匹配可以在它们创建的时候就确定。每逢新的数据加入到模型中,工具就可以验证它们。
参考文献
AT&T (1993) “最佳趋势实践:软件体系结构确认,” AT&T, Murray Hill, NJ.
Egyed, A. (1999a) “UML中体系结构视图集成,” 提交给 ESEC/FSE’99, http://sunset.usc.edu/TechRpts/Papers/usccse99-511/usccse99-511.pdf.
Egyed, A. (1999b) “在UML中集成体系结构视图,” 资格报告, 技术报告,软件工程中心, 南加州大学,
USC-CSE-99-514, http://sunset.usc.edu/TechRpts/Papers/usccse99-514/usccse99-514.pdf.
Egyed, A. and Kruchten, P. (1999) “Rose/ 设计师:可视化软件体系工具”, 第三十二届系统科学会议年报议题
Booch, G., Jacobson, I., 和 Rumbaugh, J. (1997) “用于面向对象开发的统一建模语言,”
文集, 版本 1.0, 瑞理软件公司
Buschman, F., Meunier, R., Rohnert, H., Sommerlad, P., Stal,
M. (1996) “模式系统:面向模式的软件体系,” Wiley.
Boehm, B., Egyed, A., Kwan, J., and Madachy, R. (1998), “使用
WinWin 螺旋模型:案例研究,” IEEE 计算机, July, pp. 33-44.
Gamma, E., Helm, R., Johnson,R., Vlissides, J. (1994) “设计模式:可重用面向对象软件元素:,”
Addison-Wesley.
NASA (1993) “正式软件检验过程标准,” NASA-STD-2202-93.
Nuseibeh, B. (1995) “软件开发中的计算机辅助非一致性管理,” 技术报告 DoC 95/4, 计算系,
帝国大学, 伦敦 SW7 2BZ.
Rechtin, E. (1991) “系统体系,创建和建立复杂系统,” Prentice Hall, Englewood
Cliffs, NJ.
Perry, D. E. and Wolf, A. L. (1992) “软件体系结构研究基础,” ACM SIGSOFT
软件工程笔记, 十月号.
Sage, Andrew P., Lynch, Charles L. (1998) “系统集成和体系构造:原理概述,实践和远景,”
系统工程, 国际系统工程会议期刊, Wiley Publishers, 卷 1, 第 3, 176-226页。
Shaw, M. and Garlan, D. (1996) “软件体系结构:形成原理的透视,” Prentice Hall.
Siegfried, S. (1996) “理解面向对象软件工程,” IEEE Press.
----------------------------------------------------------------
[1] 注意我们如[Bushman et al 1996]所作,可互换地使用术语模式和风格。
[2] 对共同使用的模板隐藏源模板和类元
[3] 为其他对象提供一个代理限制对它的访问[Gamma et al 1994]
[4] 注意:我们可以用高层代理简化较低层次设计模式