4.5 设计模型
在软件设计过程中,包含体系结构、接口、构件级和部署表示的设计模型是主要的工作产品。随着每个元素的开发,逐渐形成更全面的设计视图。体系结构元素使用各种信息以获得软件、软件子系统和构件的完整的结构表示,这些信息来自应用域、需求模型,以及模式与风格的分类。接口设计元素为外部和内部的接口,以及用户接口建模。构件级元素定义体系结构中的每一个模块(构件)。最后,部署级设计元素划分体系结构、构件和容纳软件的物理配置的接口。
可以从两个维度观察设计模型,如图4-3所示。过程维度表示设计模型的演化,设计任务作为软件过程的一部分被执行。抽象维度表示详细级别,分析模型的每个元素转化为一个等价的设计,然后迭代求精。图中,虚线表示分析模型和设计模型之间的边界。在某些情况下,分析模型和设计模型之间可能存在明显的差别;而在有些情况下,分析模型慢慢地融入设计模型而没有明显的差别。设计模型的元素使用了很多UML图,有些UML图在分析模型中也使用了。差别在于这些图被求精和细化为设计的一部分,并且提供了更多具体的实施细节,突出了体系结构的结构和风格、体系结构中的构件,以及构件之间、构件和外界之间的接口。
然而,沿横轴表示的模型元素并不总是顺序开发的。大多数情况下,初步的体系结构设计是基础,随后是接口设计和构件级设计(并行进行)。通常直到设计全部完成后才开始部署模型的工作。在设计过程中的任何地方都可以应用设计模式。这些模式能够使设计人员将设计知识应用到他人已经遇到并解决了的特定领域问题。
图4-3 设计模型的维度
4.5.1 数据设计元素
和其他软件工程活动一样,数据设计(有时也称为数据体系结构)创建在高抽象级上(以客户或用户的数据观点)表示的数据模型和(或)信息模型之后,数据模型被逐步求精为特定于实现的表示,亦即基于计算机的系统能够处理的表示。在很多软件应用中,数据体系结构对必须处理该数据的软件的体系结构有深远的影响。
数据结构通常是软件设计的重要部分。在程序构件级,数据结构设计及处理这些数据的相关算法对创建高质量的应用程序而言是至关重要的。在应用级,数据模型(源于需求工程)到数据库的转变是实现系统业务目标的关键。在业务级,收集存储在不同数据库中的信息并重新组织为“数据仓库”要使用数据挖掘或知识发现技术,这些技术影响业务本身的成功。在每一种情况下,数据设计都发挥了重要作用。
4.5.2 体系结构设计元素
软件的体系结构设计好比房屋的平面图。平面图描绘了房间的整体布局,包括各房间的尺寸、形状、相互之间的联系,以及房间的门窗。平面图提供了房屋的整体视图,而体系结构设计元素提供了软件的整体视图。
体系结构模型从以下3个来源获得:①关于将要构建的软件的应用域信息;②特定的需求模型元素,如数据流图或分析类、现有问题中它们的关系和协作;③体系结构风格和模式的可获得性。
体系结构设计元素通常描述为一组相互联系的子系统,并且常常从需求模型的分析包中派生出来。每个子系统有自己的体系结构(例如,图形用户接口可能根据之前存在的用户接口体系结构进行了结构化)。
4.5.3 接口设计元素
软件的接口设计相当于一组房屋的门、窗和外部设施的详细绘图(以及规格说明)。这些绘图描绘了门窗的尺寸和形状、门窗的工作方式、设施(例如水、电、气和电话)连接入室的方式,以及平面图上描绘的在室内的分布方式。图纸可以告诉人们门铃在哪、是否使用内部通信以通知有客来访,以及如何安装保安系统。门、窗、外部设施的详细图纸(以及规格说明)作为平面图的一部分,大体上告诉人们事件和信息如何流入和流出住宅,以及如何在平面图的房间内流动。软件接口设计元素描述了信息如何流入和流出系统,以及被定义为体系结构一部分的构件之间是如何通信的。
接口设计有3个重要的元素:①用户界面(UI);②其他系统、设备、网络或其他信息生成者或使用者的外部接口;③各种设计构件之间的内部接口。这些接口设计元素能够使软件进行外部通信,还能使软件体系结构中的构件之间进行内部通信和协作。
UI设计(越来越多地被称为可用性设计)是软件工程中的主要活动。可用性设计包含美学元素(例如,布局、颜色、图形、交互机制)、人机工程元素(例如,信息布局、隐喻、UI导航)和技术元素(例如,UI模式、可复用构件)。
外部接口设计需要关于发送和接收信息的实体的确定信息。在所有情况下,这些信息都要在需求工程中收集,并且一旦开始进行接口设计,还要检验这些信息。外部接口设计应包括错误检查和(在必要时)适当的安全特征检查。
内部接口设计和构件级设计紧密相关。分析类的设计实现表示了所有操作和消息传递模式,使得不同类的操作之间能够进行通信和协作。每个消息的设计必须提供必不可少的信息传递和已被请求操作的特定功能需求。如果选择经典的“输入处理输出”设计方法,每个软件构件接口就基于数据流表示和处理过程说明中描述的功能进行设计。
在有些情况下,接口建模的方式和类所用的方式几乎一样。在UML中接口定义如下:“接口是类、构件或其他分类符(包括子系统)的外部可见的(公共的)操作说明,而没有内部结构的规格说明。”更简单地说,接口是一组描述类的部分行为的操作,并提供了那些操作的访问方法。例如,SafeHome安全功能使用控制面板,控制面板允许户主控制安全功能的某些方面。在系统的高级版本中,控制面板的功能可能会通过无线PDA或移动电话实现。
4.5.4 构件级设计元素
软件的构件级设计相当于一个房屋中每个房间的一组详图(以及规格说明)。这些图描绘了每个房间内的布线和管道、电器插座和墙上开关、水龙头、水池、淋浴、浴盆、下水道、壁橱和储藏室的位置,还说明了所使用的地板、装饰,以及和房间相关的任何细节。软件的构件级设计完整地描述了每个软件构件的内部细节。为此,构件级设计为所有局部数据对象定义数据结构,为所有在构件内发生的处理定义算法细节,并定义了允许访问所有构件操作(行为)的接口。
在面向对象的软件工程中,使用UML图表现的一个构件如图4-4所示。图中表示的构件名为SensorManagerment(SafeHome安全功能的一部分)。虚线箭头连接了构件和名为Sensor的类。SensorManagement构件完成所有和SafeHome传感器相关的功能,包括监测和配置传感器。
构件的设计细节可以在很多抽象级别建模。UML活动图可用来表示处理逻辑,构件详细的过程流可以使用伪代码表示,也可以使用一些图形(如流程图或盒图)来表示。算法结构遵守结构化编程的规则(即一套约束程序构造)。对于基于待处理的数据对象的特性所选择的数据结构,在实现中通常使用伪代码或程序语言建模。
4.5.5 部署级设计元素
部署级设计元素指明软件功能和子系统将如何在支持软件的物理计算环境内分布。例如,SafeHome产品元素被配置在3种主要的计算环境内运行——基于住宅的PC、SafeHome控制面板和位于CPI公司的服务器(提供基于因特网的系统访问)。
在设计过程中,开发的UML部署图及随后的精化如图4-4所示。图中显示了3种计算环境(实际上,还可能包括传感器、摄像头和其他的环境)。图中标识出了每个计算元素中还有子系统(功能)。例如,个人计算机中有完成安全、监视、住宅管理和通信功能的子系统。此外,还设计了一个外部访问子系统以管理外界资源对SafeHome系统的访问。每个子系统需要进行细化,用以说明该子系统所实现的构件。
图4-5所示的图使用了描述符形式,这意味着部署图显示了计算环境,但并没有明确地说明配置细节。例如,“个人计算机”并没有进一步地明确它是一台MacPC还是一台WindowsPC、SUN工作站或Linux系统。在后面的阶段或构建开始时,需要用实例形式重新为部署图提供这些细节,明确每个实例的部署(专用的称为硬件配置)。
图4-4 UML构件图
图4-5 UML部署图