IBM RSA 建模:第 8 章可重用模型
开发一个好模型并不是一件轻而易举的事情,当我们有了一个好用的模型后,怎样才能最大程度地发挥它的效用呢?答案就是重用!
重用可能是软件行业最重要的思想之一。多数开发人员都有过这样的经历,在新的软件开发中复制自己曾经写过的代码,这就是最普遍最简单的重用形式。根据重用的层次不同,我们大致可以把软件行业中的重用分为以下一些类型。
1)代码级的重用。
每一个开发人员可能都有复制代码的经历。在软件开发生涯中,很多开发人员都逐步积累出了自己的经典代码。当你开发一个新项目时,这些稳定可靠的代码会成倍的提高你的工作效率。
当然,重用代码的时候必须确认被重用的代码是获得了版权许可的。想想大软件公司之间无休止的版权官司吧。
2)模块级的重用。
对于调用库函数,从C和C++时代过来的人肯定不会陌生。
而面向对象的语言和方法的流行,更是把重用带到了软件设计的核心思想之中。一个设计良好的对象总是能够被多个模块重用,并且可以被安全的继承扩展。
模块化设计是软件的重要发展方向,需要什么模块就安装什么模块,同样的模块可以被不同的软件产品重用。这是软件公司提高生产效率,降低成本的最有效方法之一。
3)设计的重用。
软件架构师们也在试图寻找更高效的工作方式,于是他们也想到了重用设计。良好的设计总是可以重复的使用来解决同样的行业问题,或者稍稍改动即可适应新需求。
现在,当我们需要开发一个J2EE应用,大多数人首先想到的是用什么Framework,有太多可选了,经典的Struts,灵活的WebWork,全面的Spring。当你使用这些Framework时,就是在重用被反复验证了的良好设计。
我们很快会提到的模型重用也属于设计上的重用。
4)文档的重用。
一个正规的商业软件,文档工作占了相当大的比例,重用文档具有和重用代码、设计相同的重要性。
5)系统级的重用。
曾经,已有(老)系统是开发人员最害怕接触的东西,那是一个没有文档,无法理解,无法改动,一团糟的黑洞。SOA思想的出现终于把重用推向了系统级别。通过服务的方式来定义系统接口,通过开放标准来暴露系统接口,人们可以不再关心具体的实现方式而关注于系统所能提供的业务功能。虽然在实践中SOA还不是万能的,但是这种思想还是为我们指明了软件发展的一个方向。从软件危机被提出到现在,软件行业又经历了将近40年的发展,而复杂度的问题似乎总是难以解决,或许系统级的重用将会是一种有效的方法。
6)过程的重用。
软件开发早已告别了英雄的时代,过程和方法开始决定软件的质量。当一个软件企业可以重复他的成功经验,通过过程的重用来不断开发出成功的项目或产品时,我们就认为这是个成熟的软件企业。
IBM的RUP就是一套从实践中总结出来的,并且以方法的形式固定下来的可重用的软件开发过程。通过采用RUP过程,软件开发团队可以方便地采取行业的最佳实践,有效地组织软件开发。
软件重用给我们带来的好处包括。
7)提高生产效率。
必须说明的是重用并不是免费的午餐,重用也有一定的成本。比如说开发一个能被重用的模块往往比开发一个仅仅具有功能的模块更费事。但是总的来说重用是可以提高生产效率的。并且,随着重用的次数增多,边际成本降低,而边际收益会很高。
8)减少开发时间,跟上市场节奏。
效率的提高也意味着可以用更少的开发时间开发出同样的产品。在竞争激烈的市场环境下,能比竞争对手早上市一天往往意味着胜出。
9)减少开发成本和维护成本。
开发成本的减少是显而易见的。一个软件的大部分生命周期都处于维护中,维护成本是软件整体成本的重要组成部分。一个组件不论它被重用到多少产品中,都只需要一个团队来维护它,相比每个产品拥有一套自己的功能部件,成本的节约是明显的。
10)提高质量。
被重用的模块都是经过反复测试的,或者在多个项目中被证明是可用的。使用这样的部件会比重新开发具有更高的稳定性和更好的质量。
模型的重用属于软件设计的重用。RSA提供了强大的功能来支持模型重用,你甚至可以把你的模型发布成RSA的一个新功能。
1.基于模式的开发
模式本质上是一种可重用的设计模型。模式一旦被设计出来并且被证明有用后,就可以反复的使用于同一类中。这是一种非常有效的设计重用。
在RSA中,模式被打包成RAS组件以便共享。一个模式应当包括良好的文档来描述所涉及的问题及解决问题的设计思想。在设计模型的时候,选择合适的模式可以大大提高设计的效率。
2.使用RAS规范来打包可重用组件
可重用组件规范,Reusable Assets Specification(RAS)提供了一种标准而有效的方法来打包可重用的组件,并且与其他开发人员,开发团队共享。RAS规范为基于组件的开发提供了一种基本框架。
在RSA中可以通过导出功能创建一个符合RAS规范的组件。导出功能可以确保所有被引用到的资源都被打包到RAS组件中,包括模型、项目、文档、源代码及任何软件项目中的资源。在这里,我们最关心的是模型资源。
RAS组件被打包好后就可以非常容易地与其他开发人员共享或者在一个小组中共享。你还可以把它注册到RAS资源库中供他人下载使用,同时你也可以下载RAS资源库中可用的组件。RAS组件可大可小,这仅仅取决于你对该组件的设计。
在下面的章节中,我们会详细介绍怎样导入导出RAS组件,怎样把我们的模型打包成RAS元素来共享。
不记得《设计模式(Design Pattern)》这本书已经重印第几次了。但是很多年来,它总是被摆在计算机书店的最显眼处。使用模式几乎已经成为了良好设计的代名词。
我们这里提到的模式是一种软件开发中重用设计的方式,而不再是特指某一种模式,比如著名的GoF模式(Gang of Four是指《设计模式》这本书的四位作者Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides,我们有时候也译为四人帮模式),IBM的电子商务模式,J2EE模式等。虽然大多数人是从GoF设计模式开始接触和了解模式,但是跳出具体的设计模式来看模式的概念,有助于我们从更高层次来理解基于模式的开发。
模式为某一类常见的问题提供一个解决方案。
模式是比代码或模块更高级的重用方式,但是比系统级的重用要低。可以理解为模式是解决方案在模型,或者设计级别的重用。
模式有助于理解,沟通关键的设计思想或者开发概念。
模式是可以在软件开发工具中使用的。
模式是从经典的解决方案中抽象出来的,产生模式的解决方案往往是业界公认的对于该类问题的最优方案,或者是最佳实践。
模式规范是一种用来描述模式的文档格式,用规范的文档来描述模式的各个方面有利于模式的重用。在后面的章节会介绍模式规范的具体内容。
开发工具可以提供对模式的支持,这会使得模式重用变得非常容易。RSA就是这样一个工具,它提供了良好的对基于模式开发的支持。
很多时候,我们可以使用一些固定的模式组合来解决一个比较复杂的领域问题。这就像是组合几个模式构成一个更复杂的模式。
1.模式规范
最初的时候,模式仅仅作为一种解决问题的方法存在于开发人员的头脑中,或者作为最佳实践在不同的项目中被使用。直到我们开始提炼这些最佳实践,并且用模式规范来把它描述出来,模式才真正的在开发中开始扮演重要角色。很多时候,开发人员印象中的模式往往是指用模式规范书写下来的模式。
模式规范包含这些基本的要素用来描述模式。
模式名称(pattern name):一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基于一个模式词汇表,我们自己及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当的模式名也是我们设计模式编目工作的难点之一。
问题(problem):描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
解决方案(solution):描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
效果(consequences):描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
2.模式的应用
理解模式是一回事,在特定的环境中应用模式又是另一回事了。模式往往是比较抽象的设计思想,要在一种具体的开发设计环境中应用模式,则有很多具体的细节要考虑,比如编程语言是否能支持模式的实现。而一个对模式使用提供良好支持的建模工具,无疑是模式使用者最希望看到的东西。
建模工具可以在以下方面提供对模式应用的支持
内建常用的模式。
能够在集成开发环境中自动地应用模式。
支持定义新的模式。
支持共享模式。
1.打开模式浏览器
在RSA的建模透视图中可以打开模式浏览器视图,模式浏览器视图中会列出所有装入工作空间的模式。
注意:
模式浏览器视图在默认情况下并不显示,使用者需要首先打开该视图。
打开模式浏览器视图的步骤
- 选择菜单“窗口”→“显示视图”→“其他”。
- 在弹出的对话框中,选择“建模”→“模式浏览器”,单击“确定”完成,如图8.1所示。
图8.1 模式浏览器
小技巧:
可以把模式浏览器视图添为快速视图以便于快速打开和关闭。
快速视图是以快速视图栏(即最初位于“工作台”窗口左下方的水平工具栏)上的工具栏按钮表示的。当单击工具栏按钮以显示快速视图时,该视图会暂时在当前透视图中打开。单击该视图之外的地方,它就会再次隐藏起来。快速视图栏也可以停放在工作台窗口的右边和左边。
要创建快速视图,步骤如下。
单击想要的视图的标题栏,按下鼠标左键
将视图拖至快速视图栏,然后放开鼠标左键。默认情况下,快捷方式栏位于窗口的左下角
此外,也可以单击快速视图栏左边的按钮,这将显示视图选项,如图8.2所示。选中其中一个视图,将立即把该视图添加至快速视图栏。
图8.2 显示视图选项
2.在模式浏览器中浏览模式
模式浏览器会列出所有装入工作空间的模式。RAS内置了GoF的23个经典设计模式,他们被放在“Design Pattern”中。这些模式又被分类到三个组中,分别是Behavioral(行为),Creational(生成)和Structural(结构)。
选中工厂方法模式,在下面的“简短描述”窗口(图8.3)中会出现关于工厂方法模式的文字描述,你还可以选中构成工厂方法模式的各个元素来查看关于他们的描述。“概述”窗口以图形化的方式显示构成模式的各个元素之间的关系,如图8.4所示。
图8.3 模式浏览器 简短描述
图8.4 模式浏览器 概述
3.用组来组织模式
模式被组织成不同的组以便于查找使用,如图8.4中的Behavioral(行为)组,Creational(生成)组和Structural(结构)组。一个模式可以被放到不同的组中。随着新的模式不断被添加到工作空间中,你可以创建自己的组来更好地管理模式。
在选定的组上右键点击,在弹出菜单中选择“新建组”可以建立一个新的组。新的组会被作为下一层的组显示在选定的组中。你可以建立任意多个组和任意多层嵌套。
右键点击模式,弹出菜单中提供了复制和移动选项。你可以使用复制和移动在组之间重新放置模式。
在模式浏览器视图工具栏中点击下拉箭头 ,并选择“恢复缺省组”菜单项,你可以把组恢复到原始状态。
4.搜索模式
在模式浏览器视图中可以搜索模式,默认情况下搜索的是所有安装到工作空间的模式,可以通过修改搜索参数来搜索其他模式库中的模式。
在模式浏览器视图中搜索模式的步骤
- 在模式浏览器视图工具栏中单击搜索按钮 打开搜索对话框。
- 输入关键字或通配符搜索。
- 通过改变“范围”可以在不同的模式库中进行搜索。
- 在搜索结果中右键单击模式,在弹出菜单中选择“显示在”→“模式浏览器”,如图8.5所示可以在模式浏览器中打开选中的模式。
图8.5 搜索模式
5.准备模式应用环境
模式是作为一种设计元素而被应用到模型中的,所以在开始应用模式之前,必须准备好建模环境。以下关于模式的操作需要以一个打开的UML模型及一个类图或者自由格式图为应用环境。经过前面章节的学习,你应该已经熟悉创建新的UML建模项目并添加类图或自由格式图的步骤。
6.创建一个模式实例
我们已经学会怎样浏览可用的模式,并且已经打开了需要应用模式的模型。接下来就要开始应用模式。应用模式的第一步是在目标模型中创建一个模式实例。
有两种方法可以创建模式实例,使用创建模式向导或者通过拖拽的方式。
创建模式向导能够帮助你创建模式实例和选择模式参数。在开始一些步骤前请首先准备好UML模型和UML图。
使用创建模式向导创建模式实例的步骤
- 在模式浏览器视图中,右键单击模式并选择“应用模式”,应用模式向导会打开,并列出工作空间中所有打开的模型。
- 在位置列表中选择作为模式容器的模型。注意,只有可以包含该模式的模型会显示在列表中。
- 选择创建模式的图,或者使用默认的图。
- 点击“下一步”显示模式参数页。
- 可以使用以下方法来为参数添加值,首先选择参数,单击“值”输入域,
- a)点击“…”按钮打开“为参数选择值”对话框并选择合适的值;
- b)直接输入新名称来创建一个新的元素;
- c)输入一个已经存在于模型中的元素的名称,注意该元素必须和参数是同一种UML 2.0类型或是其子类型;
- d)如果参数是可以接受简单值的UML 2.0类型,可以直接输入符合条件的值(比如整数、字符串等);
- e)对于具有可选值的UML 2.0类型,直接从下拉列表中选择值(比如对于布尔类型,从下拉列表中选择True或者False)。
- 对于允许多值的参数,可以通过点击“添加值”按钮添加多于一个的值。
- 点击“完成”你可以看到新的模式实例已经在模型中创建起来。
- 在创建完模式实例后,如果你还需要修改参数或者添加更多的参数值,可以在项目资源管理器视图中右键点击该模式实例,并从弹出菜单中选择“模式”→“参数”。更直接的方法是通过拖拽的方式创建模式实例。
使用拖拽的方式创建模式实例的步骤
- 从模式浏览器视图中拖拽所需的模式到打开的UML图中,会看到模式实例在图中和模型同时被创建起来。
- 也可以拖拽一个模式到某个类型匹配的UML元素上,这会创建一个模式实例并以这个元素为参数值。比如拖拽Singleton模式到一个UML类上即可在该类上创建一个Singleton模式。注意,这种情况下模式实例只会添加到模型中,而不会出现在图中。
图8.6显示了一个Facade模式的实例。Facade模式是GoF的23个经典模式中的一个,它为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,屏蔽了子系统的内部结构,这个接口使得这一子系统更加容易使用。在下一节中我们将继续使用Facade模式的例子来介绍怎样绑定模型元素到模式实例。
图8.6 Façade模式的实例
7.绑定模型元素到模式实例
大多数模式需要多个UML元素协作完成一个任务,模式参数就是用来指定这些协作的参与者的。创建了模式实例后下一步就需要指定这些参数。根据建模需要的不同,可以创建新的元素作为模式参数,或者指定模型中已有的元素作为模式参数。在创建模式实例章节中,已经提到了怎样利用创建模式实例向导来指定参数值。本章将介绍模式实例创建后怎样在UML图中指定,修改参数绑定。
在类图和自由格式图中,可以使用动作条来添加新的模型元素。将鼠标移动到图的空白处,按空格键就会显示动作条。将鼠标移动到模式实例的参数上稍作停留,也会显示出动作条,这时的动作条上只会显示与这个模式参数相匹配的UML元素类型。
小技巧:
动作条在几秒种后会自动消失,如果想再显示动作条,只需按空格键。
我们以上一节中创建的Facade模式实例为例来介绍怎样绑定参数。
创建新的元素作为参数
- 在UML类图或自由格式图中将鼠标移动到Facade参数上稍做停留,动作条将会显示,输入自变量名称如图8.7所示。
- 点击 按钮并输入myFacade作为类的名称,以myFacade命名的新类会被创建并作为Facade参数值,如图8.8所示。
- 检查项目资源管理器可以发现新元素myFacade及它和Facade模式实例的关联都已经被建立起来,如图8.9所示。
图8.7 输入自变量名称
图8.8 Façade模式
图8.9 已经建立关联的Façade模式实例
选择已有的模型元素作为参数
- 点击 按钮,输入一个已有的模型元素的名称
- 你也可以从模型中拖拽已有元素到模式实例的参数上。如图8.11所示,拖拽SubSystem1类到Facade模式实例的SubSystem参数上。请对照图8.10~8.12查看使用Façade模式前后的不同。
图8.10 未选择SubSystem的参数
图8.11 拖拽SubSystem1作为参数
图8.12 MyFacade与SubSystem建立了关联
8.重新应用模式
如果在创建完模式之后,模式中的元素有所改变,比如添加了新的方法,则可以通过右键点击模式实例,选择“模式”→“重新应用”使模式意识到新的改动并应用改动过的元素。
|
本章我们回顾了如在 RSA 中进行重用。