1
 软件工程
1.4.3.4 2.3.4 专用过程模型

2.3.4 专用过程模型

1.基于构件的开发模型

1)软件构件的功能及要素

基于构件的软件开发(Component-Based Software Development,CBSD)是指使用可复用构件来开发应用软件。基于构件的软件工程(Component-Based Software Engineering,CBSE)是以面向对象的方法为基础,实现软件重用,构造新系统的过程。

软件构件是软件系统中具有相对独立功能,可以明确标识,接口由规约指定,与语境有明显依赖关系,可独立部署,且多由第三方提供的可组装软件实体。软件构件须承载有用的功能,并遵循某种构件模型。可复用构件是指具有可复用价值的构件。Commercial offthe-shelf(COTS)是指由第三方开发的、满足一定构件标准的、可组装的软件构件。构件的要素如下:

①规格说明,建立在接口概念之上,作为服务提供方与客户方之间的契约;

②一个或多个实现;

③受约束的构件标准;

④包装方法;

⑤部署方法。

2)开发过程

基于构件的软件工程不是针对某个特定的软件系统,而是针对一类软件系统的共同特征、知识和需求而构建的。基于构件的软件开发过程包括两个并发的子过程,一个是领域工程,一个是应用系统工程。领域工程完成一组可复用构件的标识、构造、分类和传播;应用系统工程使用可复用构件构造新的软件系统。基于构件的开发过程如图2-7所示。

img11

图2-7 基于构件的开发过程

(1)领域工程的步骤。

①领域分析:首先要进行领域分析,收集领域中有代表性的应用样本,分析应用中的公共部分或相似部分,抽取该领域的应用体系结构。

②建立领域特定的基准体系结构模型:在领域分析的基础上,构造领域基准体系结构,这个领域基准体系结构应是可以裁剪和扩充的,并可供该领域的应用复用。

③标识候选构件:在领域分析和领域基准体系结构模型的基础上标识该领域的候选构件。

④泛化(Generalization)和可变性(Variability)分析:提高其通用性,同时寻找候选构件在不同应用中的变化点(Variation Point),设置参数、继承或其他手段,使可变部分局部化。

⑤重建构件:在泛化和可变性分析的基础上,重建构件,使它成为可复用构件。

⑥构件的测试:对于重建的可复用的构件,要严格测试,以提高其可靠性。

⑦构件的包装:经测试的构件应根据构件库的要求,对它进行包装,以便构件库对它分类储存和检索。

⑧构件入库:包装后的构件即可存入构件库。

(2)应用系统工程的步骤。

①建立应用系统的体系结构模型:可以使用构件生产者提供的领域特定的基准体系结构经裁剪或扩充而获得。

②寻找候选构件:根据应用系统的体系结构模型,从构件库或其他可利用的构件源中寻找候选构件。

③评价和选择合适的构件:评价候选构件以判断是否适合于待开发的软件。

④构件的修改(Modify)和特化(Specialize):在复用时对构件进行特化以满足特定应用的需要。

⑤开发未被复用的部分:对新系统中未复用的部分进行开发。

⑥构件的组装:将特化和修改后的可复用构件和新开发的部分组装成一个新的软件系统。

⑦集成测试:对组装后的软件系统进行集成测试。

⑧评价被复用的构件,并推荐可能的新构件。

3)CBSD对质量、生产率和成本的影响

(1)对质量的影响:随着长期的测试和使用,构件能够保证很高的质量,因此可以使系统开发的质量得到保证。

(2)对生产率的影响:一般来说,30%~50%的复用可使生产率提高25%~40%。

(3)对成本的影响:与复用相关的成本应由多个采用复用技术的项目来分担;通常要经过2~3个采用复用的生产周期(3年左右)复用才能带来显著的效益。

2.形式化方法模型

1)形式化方法定义

形式化方法(Formal Methods)在逻辑科学中是指分析、研究思维形式结构的方法。它把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出其中各个部分相互联结的方式,如命题中包含概念彼此间的联结,推理中则是各个命题之间的联结,抽取出它们共同的形式结构;再引入表达形式结构的符号语言,用符号与符号之间的联系表达命题或推理的形式结构。

用于开发计算机系统的形式化方法是描述系统性质的基于数学的方法,这样的形式化方法提供了一个框架,可以在框架中以系统的而不是特别的方式刻画、开发和验证系统。如果一种方法有良好的数学基础,那么它就是形式化的,典型地以形式化规约语言给出。这个基础提供一系列精确定义的概念,如一致性和完整性,以及定义规范的实现和正确性。形式化方法的本质是基于数学的方法来描述目标软件系统属性的一种技术。

根据说明目标软件系统的方式,形式化方法可以分为如下两类。

(1)面向模型的形式化方法通过构造一个数学模型来说明系统的行为。

(2)面向属性的形式化方法通过描述目标软件系统的各种属性来间接定义系统行为。

2)非形式化的缺点和形式化的优点

(1)非形式化的缺点。

用自然语言书写的系统规格说明书,可能存在矛盾、二义性、含糊性、不完整性及抽象层次混乱等问题。

①矛盾:指一组相互冲突的陈述。

②二义性:指用户可以用不同方式理解的陈述。

③含糊性:系统规格说明书庞大,易出现含糊性。

④不完整性:遗漏了用户的一些需求。

⑤抽象层次混乱:指在非常抽象的陈述中混进了一些关于细节的低层次陈述。

(2)形式化的优点。

形式化的方法更像是一种规则,描述了系统的性质。正因为它像是一种规则,所以具有严密、统一和简洁的特性。

①简洁、准确地描述物理现象、对象或动作的结果。

②适合于表示状态,表示“做什么”。

③数学规格说明,可以用数学方法验证。

3)形式化方法语言

不同的形式化方法的数学基础是不同的,有的以集合论和一阶谓词演算为基础(如Z语言和VDM语言),有的则以时态逻辑为基础。形式化方法语言需要形式化规约说明语言的支持。

(1)将事物的状态和行为用数学符号形式化表达的语言,为编写计算机程序和验证计算机程序的正确性提供依据,是软件工程编码之前的规格说明语言。

Z语言是一种以一阶谓词演算为主要理论基础的规约语言,是一种功能性语言。Z语言是著名数学家Zermelo提出的,它是目前使用最广泛的一种形式化描述语言,在软件产业的一些大型项目中已经获得成功的应用,Z语言以一阶谓词逻辑ZF(Zermelo-Fraenkel)公理集合论为主要数学基础。

在Z语言中有两种语言:数学语言和模式语言。数学语言用于描述系统的各种特征:对象及其之间的关系。模式语言是一种半图形化的语言,它用于构造、组织形式化说明的描述、整理、封装信息块并对其命名以便可以重用这些信息块。通常,形式化说明的可读性都不太好,但由于Z语言是采用半图形化的模式语言,能用一种比较直观、有条理的方式来表达形式化说明,这就改善了可读性。

(2)VDM语言,是1973年由IBM公司维也纳实验室提出的。通过一阶谓词逻辑和已建立的抽象数据类型来严格描述每个运算和函数的功能,体现了用形式语言来刻画语言功能的思想。

3.面向方面的软件开发模型

早在20世纪90年代初,人们就已经注意到面向对象软件开发方法的局限性。这种软件设计技术可以很好地解决软件系统中角色划分的问题。然而,它却没有彻底解决软件开发中的维护和复用问题。类与类之间的关系通常是错综复杂的,面向对象的思想只表达了类的纵向关系——继承,而类与类的横向关系往往会被忽略,或是将这种多维的关系转化为一维来解决,结果导致软件系统类之间的一些共同属性散乱地分布在各个类中,出现了逻辑业务代码和横切关注点(Crosscutting Concerns)的“纠缠”现象,这样的设计必然会给软件的维护和复用带来沉重的负担。

1)面向方面的程序设计技术的定义

面向方面的程序设计(Aspect-Oriented Programming,AOP)技术是一种将类之间的横切关注点分离出来,并将其模块化的技术。关注点是指一个特定的目的、一个感兴趣的区域或一组逻辑行为,也可以理解为满足用户或系统需求、有关软件实现的多种事项。一个关注点就是软件要解决的一个问题。例如,电子商务系统要实现的订单管理、商品管理、权限检查等功能,都是它的关注点。

软件的关注点主要分为两大类:核心关注点和横切关注点。核心关注点就是该系统要实现的主要的功能部分,如电子商务中的订单管理、商品管理等;而横切关注点要跨越多个业务逻辑类或模块,如密码验证和日志记录。

AOP的本质就是要将系统的横切关注点和核心关注点分开,将横切关注点再封装成一个模块,即方面(Aspect),从而避免横切关注点散乱分布在系统的多个类中。

AOP大体要包括三个部分:组件语言(Component Language)、方面语言(Aspect Language)和编织器(Weaver)。组件语言主要负责核心关注点,方面语言主要负责的是横切关注点,而两种语言的并行与合作,即“编织”,由编织器来完成。

方面语言中一些元素的概念可归纳如下。

(1)连接点(Joint Point),AOP中最基本的元素,表示程序控制流中的某些点,如函数调用、类对象初始化、异常处理等,表示了软件系统中的横切关注点。AspectJ就是在特定的连接点处织入代码调用模块化的横切点。

(2)通知(Advice),和类中的方法比较相似,类似函数的一种结构,定义了在连接点的执行代码,即横切关注点的功能定义。可以说,AOP的一个关键组成部分就是传达消息,它允许定义多个模块的行为,并且透明地将这些通知应用到现有的对象模型中,一般分为Before Advice、After Advice和Around Advice三种类型。

(3)切入点(Pointcut),连接点的集合,通过切点指示器明确定义了要收集的连接点和有关参数值,它能够告诉AOP框架,哪些通知绑定到哪些类,什么样的元数据将应用到哪些类中或是哪一个导言被传入到哪一个类中。总而言之,它就是连接方面和类的桥梁。

(4)元数据(Metadata),是在静态或是运行的时间绑定到一个类的附加信息,更强大的一方面,是能够动态地绑定元数据到一个给定的对象实例。当我们在编写能够应用任何对象的一般方面,而逻辑需要知道制定类的信息时,元数据就显得非常强大。

(5)导言(Introduction),也称为类型间的声明,允许程序员去修改当前类的显示接口或添加类的属性,引入了一个能够实现新接口和属性的混合类。导言允许将多继承引入到一般的Java类。

(6)方面,这是AOP中最重要的概念之一,相当OOP设计中的类,主要的功能是将类之间的横切关注点封装在一起,形成一个模块单元。通过方面,AOP允许编程人员使用一种松散耦合的方法,以独立实体的姿态对一个横切关注点进行书写、查看、编辑。

2)AOP实现方式

AOP用方面描述系统的横切关注点,用传统程序设计语言描述系统的核心关注点,使用编织器来实现横切关注点与核心关注点的交融。AOP的编织器实现方式有两种:静态织入和动态织入。

(1)静态织入。静态织入技术是指在程序编译期间,在业务功能代码的适当位置,织入方面代码,从而形成目标软件系统的混合程序代码的技术。这一技术的特点是能在软件系统运行前实现方面代码和业务代码两者的交融。

(2)动态织入。动态织入技术是指在程序运行期间,根据程序运行的上、下文,通过截取对象消息的方式,在业务执行流程的适当位置执行方面的程序代码,从而实现方面代码和业务代码两者交融的技术。

静态织入的效率要高于动态织入的效率,但动态织入的在灵活性方面要比静态织入的要强。AOP过程模型如图2-8所示。

img12

图2-8 AOP过程模型

3)AOP的优点

(1)系统容易扩展。由于方面模块根本不知道横切关注点,所以很容易通过建立新的方面加入新的功能。另外,当往系统加入新的模块时,已有的方面自动横切进来,使系统容易扩展。

(2)更好的代码重用性。AOP把每个方面视为独立的模块,模块之间是松散耦合的。这就意味着拥有更好的代码重用性。

(3)代码集中,易于理解。解决了由于OOP跨模块造成的代码混乱和分散。

(4)模块化横切关注点。AOP会用最小的耦合来处理每个关注点,使得即使是横切关注点也是模块化的。这样的话,系统代码冗余小,系统也容易理解和维护。