| 分类: 软件工程学 |
软件体系结构
构件和软件重用
1 软件重用
软件重用是指在两次或多次不同的软件开发过程中重复使用相同或相近软件元素的过程。软件元素包括程序代码、测试用例、设计文档、设计过程、需求分析文档甚至领域知识。通常,把这种可重用的元素称作软构件,可重用的软件元素越大,我们就说重用的粒度越大。
使用软件重用技术可以减少软件开发活动中大量的重复性工作,这样就能提高软件生产率,降低开发成本,缩短开发周期。同时,由于软构件大都经过严格的质量认证,并在实际运行环境中得到校验,因此,重用软构件有助于改善软件质量。此外,大量使用软构件,软件的灵活性和标准化程度也可望得到提高。
在这里,我们只是为了后面的行文方便,简单地介绍了软件重用技术的概念和作用。软件重用本身是一门博大精深的技术,有兴趣的读者可以进一步查阅有关资料和书籍。
2 构件
一般认为,构件是指语义完整、语法正确和有可重用价值的单位软件,是软件重用过程中可以明确辩识的系统;结构上,它是语义描述、通讯接口和实现代码的复合体。简单地说,构件是具有一定的功能,能够独立工作或能同其它构件装配起来协调工作的程序体,构件的使用同他的开发、生产无关。从抽象程度来看,面向对象技术已达到了类级重用(代码重用),它以类为封装的单位。这样的重用粒度还太小,不足以解决异构互操作和效率更高的重用。构件将抽象的程度提到一个更高的层次,它是对一组类的组合进行封装,并代表完成一个或多个功能的特定服务,也为用户提供了多个接口。整个构件隐藏了具体的实现,只用接口提供服务。
近年来,构件技术发展迅速,已形成三个主要流派,分别是IBM的CORBA
、Sun的Java平台和Microsoft的COM+。
如果把软件系统看成是构件的集合,那么从构件的外部形态来看,构成一个系统的构件可分为5类:
(1)独立而成熟的构件。独立而成熟的构件得到了实际运行环境的多次检验,该类构件隐藏了所有接口,用户只需用规定好的命令进行使用。例如,数据库管理系统和操作系统等。
(2)有限制的构件。有限制的构件提供了接口,指出了使用的条件和前提,这种构件在装配时,会产生资源冲突、覆盖等影响,在使用时需要加以测试。例如,各种面向对象对象程序设计语言中的基础类库等。
(3)适应性构件。适应性构件进行了包装或使用了接口技术,把不兼容性、资源冲突等进行了处理,可以直接使用。这种构件可以不加修改地使用在各种环境中。例如ActiveX等。
(4)装配的构件。装配的构件在安装时,已经装配在操作系统、数据库管理系统或信息系统不同层次上,使用胶水代码(Blue Code)就可以进行连接使用。目前一些软件商提供的大多数软件产品都属这一类。
(5)可修改的构件。可修改的构件可以进行版本替换。如果对原构件修改错误、增加新功能,可以利用重新"包装"或写接口来实现构件的替换。这种构件在应用系统开发中使用得比较多。
基于构件的软件开发通常包括构件获取、构件分类和检索、构件评估、适应性修改以及将现有构件在新的语境下组装成新的系统。构件获取可以有多种不同的途径:
(1)从现有构件中获得符合要求的构件,直接使用或作适应性修改,得到可重用的构件;
(2)通过遗产工程,将具有潜在重用价值的构件提取出来,得到可重用的构件;
(3)从市场上购买现成的商业构件,即COTS构件;
(4)开发新的符合要求的构件。
一个企业或组织在进行以上决策时,必须考虑到不同方式获取构件的一次性成本和以后的维护成本,做出最优的选择。
三 软件体系结构
1 软件体系结构的兴起
六十年代的软件危机使得人们开始重视软件工程的研究。起初,人们把软件设计的重点放在数据结构和算法的选择上,随着软件系统规模越来越大、越来越复杂,整个系统的结构和规格说明显得越来越重要。软件危机的程度日益加剧,现有的软件工程方法对此显得力不从心。对于大规模的复杂软件系统来说,对总体的系统结构设计和规格说明比起对计算的算法和数据结构的选择已经变得明显重要得多。在此种背景下,人们认识到软件体系结构的重要性,并认为对软件体系结构的系统、深入的研究将会成为提高软件生产率和解决软件维护问题的新的最有希望的途径。
自从软件系统首次被分成许多模块,模块之间有相互作用,组合起来有整体的属性,就具有了体系结构。好的开发者常常会使用一些体系结构模式作为软件系统结构设计策略,但他们并没有规范地、明确地表达出来,这样就无法将他们的知识与别人交流。软件体系结构是设计抽象的进一步发展,满足了更好地理解软件系统,更方便地开发更大、更复杂的软件系统的需要。
事实上,软件总是有体系结构的,不存在没有体系结构的软件。体系结构(Architecture)一词在英文里就是"建筑"的意思。把软件比作一座楼房,从整体上讲,是因为它有基础、主体和装饰,即操作系统之上的基础设施软件、实现计算逻辑的主体应用程序、方便使用的用户界面程序。从细节上来看每一个程序也是有结构的。早期的结构化程序就是以语句组成模块,模块的聚集和嵌套形成层层调用的程序结构,也就是体系结构。结构化程序的程序(表达)结构和(计算的)逻辑结构的一致性及自顶向下开发方法自然而然地形成了体系结构。由于结构化程序设计时代程序规模不大,通过强调结构化程序设计方法学,自顶向下、逐步求精,并注意模块的耦合性就可以得到相对良好的结构,所以,并未特别研究软件体系结构。
我们可以作个简单的比喻,结构化程序设计时代是以砖、瓦、灰、沙、石、预制梁、柱、屋面板盖平房和小楼,而面向对象时代以整面墙、整间房、一层楼梯的预制件盖高楼大厦。构件怎样搭配才合理?体系结构怎样构造容易?重要构件有了更改后,如何保证整栋高楼不倒?每种应用领域需要什么构件(医院、工厂、旅馆)?有哪些实用、美观、强度、造价合理的构件骨架使建造出来的建筑(即体系结构)更能满足用户的需求?如同土木工程进入到现代建筑学一样,软件也从传统的软件工程进入到现代面向对象的软件工程,研究整个软件系统的体系结构,寻求建构最快、成本最低、质量最好的构造过程。
软件体系结构虽脱胎于软件工程,但其形成同时借鉴了计算机体系结构和网络体系结构中很多宝贵的思想和方法,最近几年软件体系结构研究已完全独立于软件工程的研究,成为计算机科学的一个最新的研究方向和独立学科分支。软件体系结构研究的主要内容涉及软件体系结构描述、软件体系结构风格、软件体系结构评价和软件体系结构的形式化方法等。解决好软件的重用、质量和维护问题,是研究软件体系结构的根本目的。
2 软件体系结构的定义
虽然软件体系结构已经在软件工程领域中有着广泛的应用,但迄今为止还没有一个被大家所公认的定义。许多专家学者从不同角度和不同侧面对软件体系结构进行了刻画,较为典型的定义有:
(1)Dewayne Perry和A1ex Wo1f曾这样定义:软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。
(2)Mary Shaw和David Garlan认为软件体系结构是软件设计过程中的一个层次,这一层次超越计算过程中的算法设计和数据结构设计。体系结构问题包括总体组织和全局控制、通讯协议、同步、数据存取,给设计元素分配特定功能,设计元素的组织,规模和性能,在各设计方案间进行选择等。软件体系结构处理算法与数据结构之上关于整体系统结构设计和描述方面的一些问题,如全局组织和全局控制结构、关于通讯、同步与数据存取的协议,设计构件功能定义,物理分布与合成,设计方案的选择、评估与实现等。
(3)Kruchten指出,软件体系结构有四个角度,它们从不同方面对系统进行描述:概念角度描述系统的主要构件及它们之间的关系;模块角度包含功能分解与层次结构;运行角度描述了一个系统的动态结构;代码角度描述了各种代码和库函数在开发环境中的组织。
(4)Hayes Roth则认为软件体系结构是一个抽象的系统规范,主要包括用其行为来描述的功能构件和构件之间的相互连接、接口和关系。
(5)David Garlan和Dewne Perry于1995年在IEEE软件工程学报上又采用如下的定义:软件体系结构是一个程序/系统各构件的结构、它们之间的相互关系以及进行设计的原则和随时间进化的指导方针。
(6)Barry Boehm和他的学生提出,一个软件体系结构包括一个软件和系统构件,互联及约束的集合;一个系统需求说明的集合;一个基本原理用以说明这一构件,互联和约束能够满足系统需求。
(7)1997年,Bass,Ctements和Kazman在《使用软件体系结构》一书中给出如下的定义:一个程序或计算机系统的软件体系结构包括一个或一组软件构件、软件构件的外部的可见特性及其相互关系。其中,"软件外部的可见特性"是指软件构件提供的服务、性能、特性、错误处理、共享资源使用等。
总之,软件体系结构的研究正在发展,软件体系结构的定义也必然随之完善。在以后的文章里,如果不特别指出,我们将使用软件体系结构的下列定义:
软件体系结构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。软件体系结构不仅指定了系统的组织结构和拓扑结构,并且显示了系统需求和构成系统的元素之间的对应关系,提供了一些设计决策的基本原理。
软件体系结构的知识提纲
1 软件体系结构的描述语言:ADL(Architecture Description Language)
2 软件体系结构的表示与构造:
表示:用软件体系结构描述语言对体系结构进行说明的结果称为软件体系结构的表示。
构造:描述软件体系结构的过程,称为软件体系结构的构造。
Booch从UML的角度给出一种由设计视图、过程视图、实现视图、部署视图、用例视图构成的描述模型。
IEEE P1471:软件体系结构描述框架标准。
Rational ADS(Architecture Description Specification):从资产重组的角度提出的软件体系结构的描述规格说明框架。
3 软件体系结构的分析、设计与验证
软件体系结构本身需要分析与测试,以确定这样的体系结构是否满足需求。
分析包括:
§ 结构分析
§ 功能分析
§ 非功能分析
设计包括:
§ 过程驱动 (使用范围广,易于裁剪,通用性与实践性强)
§ 问题列表驱动(基本思想:枚举设计空间,并设计枚举维的相关性,以此选择体系结构的风格,适用于特定领域,静态,可以实现量化体系结构设计空间。如Allen认为用户界面类的量化设计空间有19个功能维,26个结构维,622条设计规则。)
设计研究的重点:模式(风格)。 模式:在本质上反映了一些特定的元素、按照特定的方式组成一个特定的结构,该结构应有利于特定上下文环境(context)下的特定问题的解决。
分为两类:
§ 固定术语类:如管道过滤器、客户/服务器、面向对象、黑板、分层、对等模式、状态转换。
§ 参考模型:与特定领域相关,如编译器的顺序参考模型和并行参考模型、信息系统的参考模型、航空模拟环境系统的参考模型。
§ 单元
§ 子系统
§ 集成
§ 验收
4 基于体系结构的软件开发方法问题定义
软件需求 (抽象)软件体系结构 软件设计 软件实现
5 特定领域的体系结构 DSSA(Domain Specific Software Architecture)
鉴于特定领域的应用具有相似的特征,因而经过严格的设计,并将直觉的成分降到最低,可以有效地实现重用,并可借鉴领域中已经成熟的体系结构。常见的DSSA有:CASE体系结构、CAD软件的参考模型、信息系统的参考体系结构、网络体系结构、机场信息系统的体系结构和信息处理DSSA。
6 体系结构的支持工具
7 软件产品线体系结构
软件体系结构可以用于大型的软件系统的开发,同时可以用于软件产品线的开发。这种开发,基于同一个软件体系结构,可以创建具有不同功能的都个系统,在软件产品族之间共享体系结构和一组可重用的构件。
8 软件体系结构的评价方法
§ Architecture Tradeoff Analysis Method,ATAM
§ Software Architecture Analysis Method,SAAM
§ Active Reviews for Intermedia Design,ARID
软件体系结构的形式化描述的方法
1、随着软件系统规模和复杂性的不断增大,软件设计的核心已从“算法+数据结构=程序”的传统计算模式转向系统的总体结构,即软件体系结构的设计和规范。
着眼于软件系统的全局组织形式,在更高层次上把握系统各组件之间的内在联系,并且从全局的、整体的角度去理解和分析整个系统的行为和特性,有助于解决当前开发复杂的大型软件所存在的困难。
一个系统的软件体系结构通常可以用方框和线条图描述。这种方框和线条图可以对系统进行结构化。
软件体系结构提高了系统的抽象级别,使开发人员可以对系统进行推理。
一个系统的体系结构所提供的模型,其目的不在于系统的实现细节,而是要提高系统构件的独立性,使各种事件本地化。
2、体系结构的两个重要方面:体系结构的交互和体系结构的风格
(1)体系结构的交互
体系结构的一个关键问题是系统的组成。当一个系统被分解成多个构件时,它们必须可以重构成一个完整的系统的结构。
一个重要的组成类是基于离散行为的构件交互。
交互可以是非常简单的。
交互可以是非常复杂的。
每个构件都可以初始化通信、产生消息和响应其它构件的消息,并且需要考虑缓冲、可靠性和构件之间传递信息的认证问题。
同时,在一个给定的系统中,交互的特定模式通过不同但类似的系统总是会重现的。
不同的构件不断使用相同的交互行为而组成一个功能系统。
(2)体系结构的风格
软件体系结构的另一个重要方面是充分利用系统共性设计的扩展部分。
开发人员使用在所工作的领域里,最有效的特定模式和习惯用语。这些模式和习惯用语约束着设计空间,允许开发者忽略与系统无关的复杂方面。这样,开发者就可以进行最有效的选择,并且可以更容易地确定最好的解决方案。这些特定的模式和习惯用语就称为体系结构的风格。
如果一种体系结构的风格可以保证持有一个属性集合,那么它就可以具有通用体系结构所允许的更强大的分析能力。
3、软件体系结构描述存在的问题
许多软件体系结构是从体系结构的设计开始的,特别是大型的软件系统必须先进行体系结构的设计,且好的体系结构的设计是决定一个软件系统的关键因素。
通常使用非形式化的方框和线条图描述体系结构的配置,仅仅提供了诸如实际计算、接口和交互等极小量的信息。
开发者试图为体系结构提供更加精确描述的一个途径,是使用诸如对象或者共享的通讯机制等实现结构。
缺乏对一个层次中交互的抽象定义,意味着很难分析对一个体系结构的整体行为的描述,必须从底层基础中的许多细节中提取抽象的行为,只有这样才可以全面地考虑系统的行为。
如果对构件交互的描述是非形式化的,那么在其它系统中重用高层设计是很困难的。
有时,一个特定的符号可以支持一种风格。这些符号包括:从构件组成系统的方式或者指定一个构件或者连接器。
对于单一的风格,开放人员在结合支持体系结构级的符号和工具上取得了一定的进展。
但是风格在体系结构级上的实现缺乏精确的特征描述,这意味着与其它风格的交互变得困难。
通常,只有风格的建立者对风格有着深刻的理解。
缺乏对风格的形式化基础还限制了对风格的分析,而且不能肯定一个系统的实现是否对应于一个非形式化的体系结构的描述。
4、软件体系结构描述的部分解决方案
第一种解决方案是把现存的形式化方法应用到体系结构的设计中;
第二种方案是开发体系结构描述语言,用于代替非形式化的方框和线条图。
体系结构描述语言(Architecture Description Language,ADL)。
ADL根据结构配置方式分:
(1)隐式配置语言(Implicit Configuration Language)、
(2)嵌入式配置语言(Inline Configuration Languages)、
(3)显示配置语言(Explicit Configuration Languages)。
根据各ADL的研究范围,分为:
(1)研究软件体系结构配置结构的描述语言;
(2)研究软件体系结构实例的描述语言;
(3)研究软件体系结构风格的描述语言。
根据ADL与实现细节的关系,可分为:
(1)实现无关语言(Implementation Independent Languages);
(2)实现相关语言(Implementation Constraining Languages)。
5、体系结构描述的形式化基础——形式化与ADL的结合
两种各有优缺点。形式化方法提供了强有力的分析能力、抽象和与实现的细节无关性,但是形式化方法不能直接提供基本的体系结构的抽象和结构。ADL为构件和连接器定义了一系列符号,可以应用于实际的复杂系统的描述。
6、体系结构描述和分析的要求
(1)体系结构配置的描述
(2)体系结构风格的描述
(3)属性分析
(4)在实际问题中的应用
7、WRIGHT体系结构描述语言
(1)实现与交互
在系统设计级上,模块间的“实现”关系是指一个特定的模块在其它模块提供的功能上定义。
模块间的“交互”关系是指模块之间的通讯,系统描述成一系列计算组件和组件间的连接。
交互关系通常用Client/Server、管道过滤器组织或事件广播通讯等术语描述。
基于“实现”关系和基于“交互”关系的系统描述有三点不同:
(1.1)系统的推理方式;
(1.2)抽象要求;
(1.3)一致性检查。
(2)体系结构描述的WRIGHT模型
(3)体系结构描述的推理
8、软件体系结构的形式化语义基础——CSP语义学简介
(1)CSP模型:字母表、迹和拒绝集
CSP是基于字母表、迹和拒绝集的概念。从形式上看,CSP进程可以用一个3元组(A,F,D)表示,A表示字母表Alphabet,F表示失败Failures,D表示偏差Divergences。
进程的字母表是进程所参与的事件的集合。
进程的失败是迹与拒绝集组成的对。
每个迹表示事件的有限序列,每个拒绝集是一个事件集。
进程的迹是进程所允许的事件序列。
事件的拒绝集可以用进程的失败对表示。
一个失败是一个迹与一个事件集。
CSP进程的最后一个元素是偏差。
(2)细化
CSP进程描述了行为的模式,如果进程匹配某个行为模式,那么就可以用该行为替换原有的行为。
(3)符号和“;”操作符
9、软件体系结构的形式化描述的验证
一致性问题
(1)端口/计算一致性
(2)无死锁连接器
(3)无死锁角色
(4)单一激发器
(5)参数替换
(6)范围测试
(7)兼容性
(8)风格约束
(9)风格的一致性
(10)连接的完备性
二、软件体系结构的设计空间及规则
1、软件体系结构的设计开始于对事务所要满足的一系列属性和行为的特定描述。
当设计者能够向用户描述一个构件的集合、构件之间的联系以及使用模式的时候,该设计任务就完成了。
2、软件构件和框架的重用
体系结构的设计将蕴含在构件之间的依赖关系和框架的实现中,这对软件的重用至关重要。
3、设计空间的概念
4、扩展的设计空间
5、以体系为中心的软件开发

加载中…