关于软件复用领域中一些词的定义
程学先
在代码类软件复用领域中有子程序、宏、函数、类、方法、软构件、软部件、组件等等名词,关于它们的定义有许多不同的说法。
一、百度词条或当前各类文献中的定义
1 类
1)类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。类具有更高的抽象性,类中的数据具有隐藏性,类还具有封装性。类的结构(也即类的组成)是用来确定一类对象的行为的,而这些行为是通过类的内部数据结构和相关的操作来确定的。这些行为是通过一种操作接口来描述的(也即平时我们所看到的类的成员函数),使用者只关心的是接口的功能(也就是我们只关心类的各个成员函数的功能),对它是如何实现的并不感兴趣。而操作接口又被称为这类对象向其他对象所提供的服务。类的定义格式一般地分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明。成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来对成员函数的定义。概括说来,说明部分将告诉使用者“干什么”,而实现部分是告诉使用者“怎么干”。
2)类是对一群有共同特征的事物或事件的集合。而类对象就是类的实例化。一个类的所有对象对应同一个类对象。如现实世界中的动物是一种类,植物也是一种类,可以理解人就是动物类的一种对象,草是植物类的一种对象。类对象的生成过程,包括对象的声明、实例化和初始化。实例化一个对象就是通过new运算符为对象分配空间(类属于复合数据类型,在声明对象时,系统并没有为对象分配空间,用户需要应用new完成分配空间的任务)。既可以在声明对象时实例化(创建)对象,也可以先声明对象,然后再创建。
2 软部件
1) 概念或功能相对独立的一个或一组相关模块定义为一个软部件。可重用的软部件有的可以不加修改直接使用,有的需要修改后再用。可重用软部件应具有清晰的结构和注解,应具有正确的编码和较低的时/空开销。各种可重用软部件还可以按照某种规则存放在软部件库中,供软件工程师选用。
2)计算机软件部件CSU(Computer SoftwareComponent)是计算机软件单元(Computer SoftwareUnit)。例如,操作系统是一种控制计算机不同部件运行的软件。
3 软构件
1) 构件(component)是可复用的软件组成成份,可被用来构造其他软件。构件具有相对独立的功能和可复用价值。它可以是被封装的对象类、类树、一些功能模块、软件框架 (framwork)、软件构架(或体系结构Architectural)、文档、分析文件、设计模式 (Pattern)等。构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件。
2)软件成分包括程序代码、测试用例、设计文档、设计过程、需求分析文档、软件构件的可信×××、甚至领域知识,通常把这种可复用的软件成分称为软件构件,简称软构件或者构件。
3)将现有系统模块封装起来,等到有新的类似需求时可以不必重复开发,可以把事先封装好的系统模块直接组装进去,这样封装的、易于复用的软件称为构件。要达到这一目的就必须进行域分析,以确定软件的体系结构、框架和构件,从而快速实例化出一系列适应性很强的软件产品族(Product Family),在特定领域进行软件复用相对容易取得成功。这是由特定领域本身的相对内聚性和稳定性所决定的。内聚性保证了领域有足够的共性,可以通过分析、抽象这种共性;稳定性保证了领城工程的投资可以获得足够的回报。领城工程就是创建可复用构件的活动,并在领城中寻求共性和变化性,然后将其表示出来,在设计和实现构件时加以利用,来支持新应用系统的建立。
这一定义的典型例如青鸟工程,青鸟领域工程方法是在青鸟工程的研究和开发工作的基础上,吸收当前领域工程的研究和实践活动中的一些成果而形成的。它是一种面向对象的领城工程方法,描述了领域工程中各个阶段的活动和产品,并给出了相应的指南,其中强调了对领域范围的确定、结合设计模式进行领城设计、组织特定领域的可复用构件库等方面的问题。
青鸟领域工程分为三个主要的阶段。即领域分析、领域设计和领城实现。领域分析的主要产品是领域分析模型,它包括领城豁求定义、领城面向对象分析棋型(领城OOA模型)、领城术语字典三个部分。领域设计的主要产品是特定领域的软件体系结构(DSSA), DSSA表示为面向对象设计棋型(OOD模型)。领域实现的主要产品是特定于领城的可复用构件库。在各个阶段的产品之间存在可追踪性。
4)其他定义
(1)1996年ECOOP(European Conference on object--Oriented Programming) 将软件构件定义为:一个具有规范接口和确定的上下文依赖的组装单元,它能够被独立部署或被第三方组装。
(2)美国卡内基。梅隆大学的软件工程研究所的构件定义:“构件是一个不透明的功能实体,能够被第三方组织,且符合一个构件模型”。
(3)Szyperski将构件定义为:可单独生产、获取、部署的二进制单元,它们之间可以相互作用构成一个功能系统。
(4)CMU/SEI把构件定义为:一个不透明的功能实现;能够被第三方组装;还符合一个构件模型。
(5)从编写程序代码这个狭义的角度来描述一个构件:构件是一些二进制代码,它隐藏了内部的实现细节。它们是二进制代码的形式,但都符合一种模型--构件模型,且具有可插拔性。
(6)从使用侧面给出定义:一个软件构件是可执行软件的一个可分离的单元;只能通过构件的接口来访问它的服务;可以与其他构件实现互操作;为了能与其他构件一同工作,必须能得到其接口的细节;该构件的应用需要某种环境的支持。
(7)构件是为了复用目的而针对性开发的软件实体,是一个独立发布的功能部分,可以通过它的接口访问它的服务。它体现了包装、服务、完整性等观点。利用软构件技术开发应用系统,一般是先构筑系统的总体框架,然后构造各个构件,并依次把构件安装到系统中去。大部分应用系统,在功能上有类似之处,因而利用软件的复用技术就可以把开发过程大大简化。在开发之初就应该准备软件构件类集合,如可以搜集一些已经开发出的应用系统的总体设计、规范、局部流程以及某些人机界面、通用功能模块、简化开发工具。采用构件软件不需要重新编译,也不需要源代码并且不局限于某一种编程语言。该过程叫做二进制复用(Binary Reuse),因为它是建立在接口而不是源代码级别的复用之上的。虽然软件构件必须遵守一致的接口,但是它们的内部实现是完全自动的。因此,可以用过程语言和面向对象语言创建构件。
由于构件技术是由基于面向对象技术而发展起来的,与面向对象的设计中的对象相类似,它们都是针对软件复用,都是被封装的代码,但它们之间仍存在很大差异。在纯面向对象的设计中,对象(类)、封装和继承三者缺一不可,但对构件可以没有继承性,只要实现封装即可;从构件和对象的生成方式上,对象生成属于实例化的过程,比较单一,而生成构件的方式较多;构件是设计的概念,与具体编程语言无关,不像对象属于编程中的概念,要依赖于具体的编程语言;在对构件操作时不允许直接操作构件中的数据,数据真正被封装了。而对象的操作通过公共接口部分,这样数据是可能被访问操作的;对象对软件复用是通过继承实现的,构件对软件复用不仅可以通过继承还可以通过组装时的引用来实现。因此,构件不是对象,只是与对象类似。
4、组件
1)组件就是对象。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。组件是对数据和方法的简单封装。C++Builder中,一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。
对象管理小组(ObjectManagementGroup,OMG)的“建模语言规范”中将组件定义为:“系统中一种物理的、可代替的部件、它封装了实现并提供了一系列可用的接口。一个组件代表一个系统中实现的物理部分,包括软件代码(源代码,二进制代码,可执行代码)或者一些类似内容,如脚本或者命令文件。”
自己开发的组件通常有三种类型:复合组件(CompositeControls),扩展组件(Extended Controls),自定义组件(Custom Controls)。
复合组件:将现有的各种组件组合起来,形成一个新的组件,将集中组件的性能集中起来。
扩展组件:在现有组件的组件的基础上派生出一个新的组件,为原有组件增加新的性能或者更改原有组件的控能。
自定义组件:直接从System.作windows.Forms.Control类派生出来。Control类提供组件所需要的所有入门性能,包括键盘和鼠标的事件处理。
组件与构件之间有细致的区别。组件是封装粒度小的构件。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。组件是对数据和方法的简单封装。C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。VCL和CLX组件是C++Builder系统的核心。
2)来自卡耐基梅隆大学的定义:组件是一个不透明的功能实体,能够被第三方组装,且符合一个构件模型。
3)计算机百科全书:组件是软件系统中具有相对独立功能、接口由契约指定、和语境有明显依赖关系、可独立部署、可组装的软件实体。
4)软件构件著作中定义组件是一个组装单元,它具有约定式规范的接口,以及明确的依赖环境。构建可以被独立的部署,由第三方组装。它是对逻辑的封装,不限于图形元素。即我们可以把if做成组件、把一个倒计时做成组件、把一段动画做成组件、把路由做成组件、把数据架构做成组件,而这些并不能称为控件。
组件具备单个可移植性,即“随加载随用”,不需要为其准备复杂的基础条件(如引入样式、引入框架等)。然而这一点现有那些所谓组件库做得并不好,技术上也不大现实
组件是声明式定义的,而非命令式。
组件与传统开发框架的最大区别就是统一了图形元素与非图形元素。在这个概念下,包括router、ajax、module loader、timer、animation、interval等都是组件,共享统一的生命周期管理和对外接口,且都是声明式地进行组合。
5)软件组件开发主要是开发与维护系统构造过程中用到的组件。将软件组件作为一个单独的过程,目的是将组件作为构造软件的“零部件”。随着软件技术的不断发展及软件工程的不断完善,软件组件将会作为一种独立的软件产品出现在市场上,供应用开发人员在构造应用系统时选用。
6)从软件模型的角度考虑,
人们希望把庞大的应用程序分割成为多个模块,每个模块完成独立的功能,模块之间协同工作。这样的模块我们称为组件。这些组件可以进行单独开发、单独编译、单独测试;把所有的组件组合在一起得到了完整的系统。许多人都认为,未来的应用程序都将利用组件实现。一个组件可以实现多个组件接口,而一个特定的组件接口也可以被多个组件来实现。 组件接口必须是能够自我描述的。这意味着组件接口应该不依赖于具体的实现
从以上分析可以看出,以上定义十分繁杂,彼此存在交叉或矛盾,定义不够清晰,对于学习与使用不利。
二、中文字义
从1989辞海缩印本可以查到关于某些词的和上面某些定义有关的解释。
1、类:把相类的事物概括为一类。
2、对象:观察或思考的客体,也指行动的目标。
3、函数:简述如下:当自变量改变时函数有确定的值与之对应。
4、构件:1)机构的组成单元,如滑块机构中的曲柄、连杆、滑块和机架。构件是研究机械运动时经过抽象和概括而形成的概念,它是一个和其相邻构件有相对运动的刚体。2)结构物的组成单元。如梁、柱、板、大型板材等。
5、部件:机器中的一个组成部分,由若干零件装配而成。
6、组:结合、构成。
组装:把零件组合起来构成部件,或把部件与零件组合起来构成器诫或装置。
在2002现代汉语词典中解释构件1)是组成机构的单元,可以是一个零件,也可以是许多零件构成的刚体。2)是组成建筑物某一结构的单元,例如梁、柱。
从这些名词的中文解释可见,组件是一个大的笼统的概念,可以是零件的组合、可以是构件的组合、也可以是部件的组合,涵盖构件与部件;构件也是较为笼统的概念,可以是零件、可以是多个零件、可以是零件与部件的组合,涵盖部件的概念;而部件是比较明确的概念,就是零件组合而成的机器的组成部分。
为适应软件生产工业化等应用的需要,为方便学习与讨论,建议站在程序员角度对这些名词进行统一的定义,要求尽量一词一意,在借用中文词汇时,不妨作适当限定,形成软件复用领域的专用词汇。
三、站在程序员角度进行定义。
1、语句
语句是组成具有一定功能的程序的基本单位,其主要内容由某具体语言的指令和操作数构成,指令说明做什么,操作数说明怎样做并向操作提供所需要的信息。
2、子程序
子程序是能被其他程序调用,在实现某种功能后能自动返回到调用程序去的程序。它由多条语句构成,按固定的格式写成,可在主程序中用指令调用执行,执行时程序指针转移到子程序执行,其最后一条指令一定是返回指令,使能保证重新返回到调用它的程序中去。可约定若干变量传递参数,当参数不同时,子程序的功能及运行结果可不相同。
可以建立子程序库,存放多个子程序,应用时在不同程序中打开子程序库,应用转子语句及子程序名可调用子程序,重复执行其中语句。
3、函数
函数是允许设置固定的参数的子程序,其格式包括函数头与括号括起的参数描述。在定义时的参数称为形式参数,调用时直接用函数名调用,并给出具体参数值,称为实际参数。当实际参数不同时,函数的功能及运行结果可不相同。
可以建立函数库,在不同程序中打开函数库,应用函数名调用并执行函数程序,重复执行其中语句。
4、宏
宏是能被其他程序调用的程序,由多条语句按固定的格式写成,在主程序中调用时宏名相当于指令,在预编译时根据预定义的规则将宏中的语句等内容转换成对应的内容嵌入到主程序调用处,之后在执行程序时可以复用宏中的内容。在宏定义时可以按格式定义形式参数,在调用时以实际参数替代形式参变量,使每次执行的功能、结果不同。
5、方法
类似于子程序,在“类”中定义,调用时用类名或对象名加点加方法名调用。方法可以有自己的参数,可以没有。如果方法有自己的参数(变量),在调用时系统会分配一定的空间给予这些变量,并带入实际参数值,此时的表现与格式与函数相似。
6、类
类是可被复用的程序,由一到多个方法组合而成,在每个类中可以定义多个变量,在运行时会被分配一定的空间。类被集中到类库中保存,在应用时只要打开类库就可复用类的方法与变量,在JAVA语言环境下,类以CLASS文件形式保存,类库实际上是文件夹。
在程序中可以复用类中的方法与变量,复用时采用的一种方法是以类名加方法名调用类的方法,类似于子程序执行过程,其中变量按某约定范围使用。另一种方法是复制类的定义在内存中,用另外的名字命名,称为对象,同时为变量另外分配空间。可以用对象名加点加方法名或对象名加点加变量名进行访问,实现复用,运行结束时释放在内存中所占用的空间。
可以在程序中对类局部进行修改后形成一个子类,所依据的类称为父类。在程序中可以访问新定义的方法与变量,也可访问未被修改的父类中的方法与变量,称为继承。(采用某种方法也能访问在子类中被修改了的原来的父类中的方法与变量。)
7、控件
是一种包括界面设计与实现的特殊的类,是对数据和方法的封装,提供了一系列可用的接口。它可以有自己的属性和方法。属性是控件数据的简单访问者,方法则是控件的一些简单而可见的功能。
8、软部件
软部件将一到多个类及若干语句组合为可执行程序文件,可被应用系统控制器直接调用,成为应用系统组成部分。在编译时部件的全部内容被编译到系统中。在调用时可以定义不同的参数,在编译时根据参数内容选用其中不同的功能并表现出不同的性能,使得同一软部件在使用不同参数被调用时有不同的程序表现。在执行时常被分配一个进程,安排一定空间。
通用软部件可简称为软部件,是实现软件生产工业化、建立软件生产线的基本单位。采用从上而下方式设计,首先对所知的一切实际应用系统进行需求分析,设计不同的但数量有限的软部件程序覆盖全部应用。每个部件程序集成多个功能与多种性能,相当于多道程序,可以通过实际参数值使被编译时实现不同功能、表现不同性能。
软部件可存放到部件库中,部件库实际上只是一个文件夹,在其中存放了多个部件程序文档。
应用软部件技术开发应用系统,可先将部件库中所需要的软部件文件拷贝到系统文件夹中,设计并建立数据模型,选择不同部件,设置必要的参数,构筑系统的控制器,就能全自动地建立应用系统。
可以对软部件文件进行修改,修改后成为完全独立的部件文档,存放到部件库中,与原部件文件不存在逻辑、继承关系,可以与原部件并行地被使用。
9、软构件
软构件将一到多个类及若干语句组合封装为软件实体,是一个独立发布的功能部分,可以通过它的接口访问它的服务。它体现了包装、服务、完整性等观点。利用软构件技术开发应用系统,一般是先构筑系统的总体框架,然后构造各个构件,并依次把构件安装到系统中去, 通过组装时的引用实现复用。
可将领域构件称为软构件。领域构件采用自下而上方式设计,首先对某一领域进行分析,归纳与综合该域中一到多个应用程序设计为一个软构件。
10、组件
组件是不被称为软构件和软部件的将一到多个类及若干语句组合封装而成的软件实体。
四、结束语
以上定义是我们的初步设想,希望广泛接受批评意见并修改后能得到大家认可,并形成最终定义。