计算机应用研究
APPLICATION RESEARCH OF COMPUTERS
2000 Vol.17 No.3 P.48-51




异质可复用软构件属性模型
徐正权　骆婷
摘　要：提出了一个五元组软构件属性模型，讨论了与之相关的方法和语言，并用BNF刻画了所提出的模型，还介绍了软构件操作原语。
关键词：软构件描述 属性模型 操作原语
l　引言
　　软构件是为复用而选定的软件单元。直观上讲，软构件就像建筑上的预制板，而构件类同生产预制板的模子相似。然而，软构件的概念和种类一般是变化的。它通常可以是软件系统模型、体系结构、被封装的对象类、功能模块、程序(源代码、目标代码，等等)、文档(规格说明、设计文档、测试证明，等等)，以及测试程序和数据。按规模分，构件可以是语句、分程序、模块、任务、命令和系统；按形式分，有程序代码、微体系结构、宏体系结构和系统模型；按功能用途分，有系统构件、支撑构件和领域构件；按用法分，有黑盒构件、灰盒构件、模式/骨架构件和白盒构件；按类型分，有处理类型的构件、数据类型的构件、对象类型的构件和面向对象的构件；按结构分，有原子构件和组合构件；按应用的范围分，有专用构件、面向领域的构件和通用构件；按复用时状态分，有动态构件和静态构件。
　　储备软构件可使软件开发任务标准化和简单化。用软构件制作新的软件，就是从软构件集合中选择构件，通过组装和控制来实现。反复利用软构件可以提高软件生产率。复用优质软构件能够提高软件质量。将系统环境变化局部于软构件的变化可为软件的修改带来方便。
　　可是，软构件的组装并非像预制板组合那样简单，要进行无缝插接，组合成优质的可应用软件系统，需要特殊的机制。首当其冲，软构件及其相互之间的关系应当有适当的描述。这样才能够有效表示、开发、理解、修改和复用软构件。另一方面，适当地描述对软构件的分类、编目、存储和检索起关键性的作用，是软构件组织和管理的基础和核心。因此，我们通过对软构件属性的研究，提出一种描述机制，以促进软件复用。
　　软构件的描述涉及模型、方法和语言三个方面的内容。
2　软构件属性模型
　　模型是方法和语言的基础，给出软构件描述的抽象对象，即What to describe。软构件属性模型刻画那些影响软构件可复用性因素，规定构件与构件之间的接口和交互机制。目前，已有多种软构件模型出现，代表性的有3C模型和REBOOT模型。
　　3C是一个指导性软构件属性模型。它由概念、内容、环境三部分组成。概念(Concept)是软构件的抽象描述。它给出软构件的内部属性，通过接口描述及操作语义描述刻画软构件的功能；内容(Content)是直接可复用的软构件本体，实现概念所刻画的功能；环境(Context)是软构件属性的附加描述，通过显式定义和描述软构件概念环境(软构件相互之间接口和语义关系)、操作环境(操作数据的特性，如类型、可用的操作等)和实现环境(一个软构件实现时对其它软构件的依赖关系，如软构件间的调用关系)，给出软构件的外部属性。
　　REBOOT是基于已有软构件的一种分面分类和检索模型。从各个角度，即分面(Facet，如软构件的操作、操作的对象等等)刻画软构件属性。函数型或过程型的软构件用三元组(Function，Object，Medium/Agent)刻画所提供的操作、操作对象以及与其它构件间的关系。面向对象(O-O)的构件用四元组(Abstraction，Operations，OperatesOn，Dependencies)刻画对象、所提供的操作、操作对象以及与其它构件间的关系。3C模型和REBOOT模型在许多方面是等同的。
　　3C的概念对应于REBOOT的分面；环境与OperatesOn和Dependencies分面一致，描述软构件的外部属性(即一个构件与其它构件间的关系)和数据特性。但这两个模型也有不同之处。基于3C模型的软构件描述语言允许刻画类属构件属性，更适合于形式化的描述方法和语言，而REBOOT模型只允许按照给定的分面框架结构描述已有的软构件，因而适合于非形式化的方法。此外，REBOOT模型没有对应于3C模型中的内容的分面。
　　3C和REBOOT是两个通用软构件抽象描述模型。它们为软构件描述提供了一个抽象模板。没有给出特定应用领域中的软构件的特定属性，因而适合于所有应用领域。
　　与3C和REBOOT不同，我们通过对软构件的研究，抽象、概括出其基本的属性框架，提出一种五元组的软构件描述模型，用基本属性、分类属性、配合属性、联系属性和处境描述软构件，即
<comp_basis, comp_taxonomy, comp_cooperate, comp_link, comp_situation>
　　基本属性描述软构件的名称、关键码、功能、制作者、制作时间、版本号、版权和使用频率。分类属性概括软构件与编目、存储、检索和使用有关的特性，如抽象层、规模、种类、使用方式、应用范围。配合属性描述软构件与合成有关的特性，包括连接子、插头和插座。联系属性刻画软构件之间的依赖关系，如层次关系、朋友关系、继承关系、引用关系。层次关系是多种形式的软构件制品各层次输出之间的关系，如需求文档与详细设计文档间的关系，总体设计与各模块间的关系等；主要表现为父子和兄弟关系。朋友关系指构件间输入输出可匹配的关系，比如说，一个构件的输出和另一个的输入类型和个数完全匹配，从形式上两者可以进行合成。继承关系指类体系中继承性。引用关系指同一项目不同层次软构件间控制动作上的关联。这个属性是为了方便在检索时进行构件合成。处境指明软构件制品及其存放位置和执行环境；存放位置指定所属构件库的名称，执行环境说明执行时所要求的程序设计环境。
　　软构件描述模型指出了软构件的抽象对象。根据以上模型，扩充描述具体的软构件，可以产生不同的构件描述模板。不同的描述模板概念上相当于不同的构件类。由不同的构件类，可以产生出具体构件的描述，表示不同领域不同层次构件的信息。该描述模板亦是建立可复用软构件库的基础，为了储备软构件的目的，具体构件的描述可以某种规则进入构件库。因此说它是一个异质软构件属性模型。注意：可复用软构件库的组织和管理不仅仅是简单的描述问题，还涉及到检索、合成等诸多问题；不过，软构件库的效率以及功能的充分发挥有赖于软构件属性模型。
　　通过模型描述，用户能够从各个方面去了解软构件。如果要描述和刻画某一领域的软构件，需要对上述模型进行扩充。通过对模板的扩充和具体化，可以建立自己的软构件属性模型。根据此属性模型可以开发出相应的构件描述语言和操作语言，支持构件的各种动作。
3　软构件描述方法
　　方法是描述的依据，亦是语言的设计基础，指出如何描述软构件模型，即How to describe。软构件描述方法是指运用某种表示法描绘软构件的抽象特征。为此，人们提出了多种形式化和非形式化方法。
　　与描述语言紧密相关的是形式化方法。
　　形式化方法是用形式化的规格说明语言描述软构件。规格说明语言指明软构件的抽象而不考虑实现细节。形式化方法避免了语义的二义性、模糊性；软件系统的形式化规格说明为系统原型的快速开发奠定基础。典型的软构件形式化描述方法有代数规格说明方法、多形式体系方法和多层次规格说明方法。
　　代数规格说明S=(T，F，A)描述可复用软构件的核心思想是通过类型T和函数集F描述软构件功能，T的元素作为F中函数的输入/输出集，公理集A描述了函数的功能。它的语义允许一些类型可见，一些不可见；对代数规格说明可进行三个方面的扩充：增加操作，参数化，附加接口描述。所以可以从不同的抽象层次和不同的角度来描述软构件。
　　多形式体系方法核心是从多个角度来描述软构件。
　　多层次规格说明方法允许每个高层规格说明对低层规格说明施加一些约束。在垂直方向，设计实例的规格说明必须继承父对象的规格说明；在水平方向，设计实例的规格说明可以继承设计框架的规格说明，设计框架的规格说明必须继承领域模型的规格说明。这种方法可以提供不同抽象层次的规格说明，适用于大型软构件复用。
　　非形式化方法包括超文本方法、人工智能方法、库与信息科学方法等。
　　超文本是一种数据结构，节点表示软构件，连线表示节点间的关系。它允许用户在文本内通过链接来回移动查找所需构件。
　　人工智能方法采用基于知识的表示方法来有效地表达构件间的关系，而且能够帮助用户理解这种关系。常用的有语义网、规则和框架。语义网是一个有向图，结点表示对象，弧表示对象间的关系。它有较好的表示能力，但基本语义网的试探能力差，可增加一阶谓词逻辑来增强其推理能力。规则是已知的最好知识表示机制，通常用规则对软构件进行分类。框架是一种数据结构，包括槽和填充值。通常将构件的框架描述存放在知识库里，一个框架对应一种构件，槽表示构件类型，填充值表示具体的构件。
　　常用的库与信息科学方法有分类表示法和关键词表示法。分类表示法常用有限个术语描述构件，构件库按术语分类，形成层次结构或网络结构。层次结构简单灵活，易于理解，但不利于修改和扩充；网络结构易于修改、扩充，但是随着构件库的扩大，构件的检索和维护会越来越困难。关键词表示法使用各种术语描述软构件的特性，如用动词描述软构件提供的操作，用名词描述操作对象，用形容词修饰对象特征。它由语法和语义两部分组成，语法部分描述不同词性术语的组合规则，语义体现在各术语的意义上。关键词表示法直观、简捷、表达能力强，易于用户理解和描述，便于工具的组织和检索，因而能有效地提高用户的复用意愿。但该方法对软构件的描述不够精确，易有二义性，不能自动解决一词多义、多词同义，为此应该用词汇表列出术语的同义词和术语间的概念关系，便于术语语义匹配和构件的检索。
　　软构件描述方法影响可复用构件的生成、检索和修改。在选择描述方法时，要考虑以下几个问题：对象或系统的结构、需要描述的操作类型、描述的一致性、可理解性、可表达性、构件的可集成性，以及描述方法对描述语言的影响。另一方面，衡量描述方法好坏的两个因素是表示充分性和试探能力。表示充分性指某个表示法描述了多少信息，试探能力描述了表示法的推理能力。
　　我们采用传统的库与信息方法和关键词方法相结合的非形式化方法对软构件进行描述。出于面向领域的考虑，我们结合分面分类方法和枚举方法来组织构件，因此，将构件依照其某种共同特征(分面)，如应用领域，组织在一起，便于查询和使用，所属构件库名就是指明其所属哪一类。不过，在不同标准下，枚举各种类中的构件会带来信息冗余。
4　软构件描述语言
　　语言是软构件描述的工具，即With what to describe，可以对模型加以描述和刻画，建立在属性模型的基础之上，软构件描述语言以一种严格而又易于理解的方式为复用者提供全面准确的信息。它是从70年代的模块互连语言、80年代的构件描述语言和90年代的体系结构描述语言发展而来的。较有影响的构件描述语言有LIL、CDL、CIDER和Resolve。
　　库互连语言LIL是为开发大型软件系统设计的构件描述语言，支持代码复用和经验复用。允许软构件的垂直合成(不同抽象层次间软构件的组合)和水平合成(同一抽象层次构件间的修改和组合)。
　　CDL是基于对象结构范型(Object-structured paradigm)的构件描述语言。其基本思想是将软构件看作黑盒，通过接口的语法和语义描述向外界提供结构和行为信息，使复用者不必关心其内部细节。构件包括两部分：构件接口和构件本体。构件接口描述构件的输出以及与其它构件的关系；构件本体用类-Ada符号描述，实现接口部分所体现的思想。CDL语言是设计级语言，可通过本身工具箱将CDL转换为实现语言。
　　CIDER具有面向对象语言的特点，是一种面向对象的构件描述语言，允许构件继承、输入和实例化。构件由接口和本体组成。接口定义方式可以是显式或隐式的。Resolve语言用基于方法的数学模型表达构件的形式化规格说明。它给出构件的类型、操作所满足的前置条件和后置条件、实现、构件模型和表示法的对应关系。
　　Resolve用数学模型描述构件的接口需求、接口需求与一个可能的实现间的关系，适合于可复用构件的设计。但是，Resolve语言无法用抽象的数学模型描述两个构件概念间的继承关系。因此，从一个构件产生另一个构件就会显露出很多弱点。
　　此外，CORBA IDL、DCOM ODL和IDL等接口定义(或描述)语言都能够刻画软构件接口的语法，并且具备编译和浏览工具的支持。然而，现有的接口描述语言在刻画软构件接口语义和构件相互之间复杂的交互协议方面却缺乏进一步的支持。
5　资用软构件属性模型
　　如第2节所述，软构件的属性包括基本属性、分类属性、配合属性、联系属性和处境。通过模型描述，用户能够从各个方面去了解软构件。
5.1　软构件描述
　　语法上，我们采用BNF表示法描述软构件。软构件属性描述如下：
<component>::=<comp_basis>　　　　　　 基本属性
　　<comp_taxonomy>　　　　　　　　　　分类属性
　　<comp_cooperate>　　　　　　　　　　配合属性
　　<comp_link>　　　　　　　　　　　　联系属性
　　<comp_situation)　　　　　　　　　　处境
<comp_basis>::=<comp_name>　　　　　　　构件名称
　　<comp_key>　　　　　　　　　　　　　关键码
　　<comp_function>　　　　　　　　　　功能描述
　　<comp_maker>　　　　　　　　　　　制作者
　　<act_time>　　　　　　　　　　　　制作时间
　　<comp_version>　　　　　　　　　　版本号
　　<comp_copyrights>　　　　　　　　版权
　　<use_frequency)　　　　　　　　　使用频率
<comp_name)::=<identifier>
<identifier>::=letter{letter|digital|'_'}*
<comp_key>::=integer
<comp_function>::=string
<comp_maker>::=string
<act_time>::=<create_time><modify_time>
<create_time>::=datetime
<modify_time>::=datetime
<comp_version>::=integer
<comp_copyrights>::=commercial|freeware|public_domain|shareware
<use_frequency>::=integer
<comp_taxonomy>::=<comp_level)　　　　　　抽象层
　　<comp_size>　　　　　　　　　　　　　　规模
　　<comp_usage>　　　　　　　　　　　　　使用方式
　　<comp_scope>　　　　　　　　　　　　　应用范围
　　<comp_category)　　　　　　　　　　　　种类
<comp_level>::=requirment|specification|architecture|design|source|executable
<comp_size>::=statement|block|module|task|command|system
<comp_usage>::=black_box|gray_box|skelten|white_box
<comp_scope>::=dedicated|domain_oriented|general_purpose
<comp_category>::=system_software|application_software
<system_software>::=language_processor|utility|operating_systems
<application_software>::=financial|database|desktop_accessory 
　　|word_processing|communication|desktop_publishing 
　　|entertainment|educational|development|graphics
　　|spreadsheets|integrated
<comp_cooperate>::={<connector>{<plug> | <socket>}*}*连接子
<connector>::=<identifier>
<plug>::=!<param_declaration>
<param_declaration>::=<param_type><data_type>
<param_type>::=val_param|var_param
<data_type>::=<simple_type> | <compund_type> | <pointer>
<simple_type>::=integer|boolean|char|real|datetime
<compound_type>::=string|subrange|array|record|enumeratedtype|set|union
<pointer>::= '*' <data_type>
<socket>::=?<param_declaration>
<comp_link>::=<hierarchy_r>　　　　　层次关系
　　[<friend_r>]　　　　　　　　　　　朋友关系
　　[<inherit_r>]　　　　　　　　　　继承关系
　　[<reference_r>]　　　　　　　　　引用关系
<hierarchy_r>::=<child>[<brother>]
<child>::=<comp_key>
<brother>::=<comp_key>
<friend_r>::=[<input_friend>][<output_friend>]
<input_friend>::=<first_friend><next_friend>
<output_friend>::=<first_friend><next_friend>
<first_friend>::=<comp_key>
<next_friend>::=<comp_key>
<inherit_r>::={<supercomp>;}*
<supercomp>::=<comp_key>
<reference_r>::={<ref_comp>;}*
<ref_comp>::=<comp_key>
<comp_situation>::=<comp_artifacts>　　　　　制品
　　<comp_location>　　　　　　　　　　　　　所属构件库
　　<run_environment>　　　　　　　　　　　　执行环境
<comp_artifacts>::=processing|data|object|object_oriented|document|figure
<comp_location>::=<lib_name>
<lib_name>::=<identifier>
<run_environment>::=<operating_systems><programming_env>
<operating_systems>::=dos|win31|win95|winnt|unix|aix|...
<programming_env>::=delphi|c|pascal|vc|bc|vb|pb|...
5.2　软构件操作原语
　　软构件的操作基于属性模型，包括构件的生成、删除、检索等，涉及软构件的动态特性，但某些接口将依赖于一些静态属性，如
　　Create (生成形式，参数集)
　　软构件的生成即为构件类的实例化过程。将实例化后的构件入库。由于软构件制品粒度是不定的，可以是软件开发任何一个阶段的产品，所以实例化有多种形式，如
　　．变量说明：变量类型和变量的关系，这是最一般的生成方式；
　　．对象类和实例：对象类是对象实例的样板，例如C++中类和实例的关系，生成的对象实例共享对象类所定义的数据和操作特征，但各实例的初始化状态不同；
　　．宏替换和预处理：在构件类中可以有宏定义和预处理定义，对其进行宏替换和预处理即生成构件；
　　．文件描述：构件类也可以由一个文件的内容来描述，通过生成工具将文件描述的内容转换为构件，如在Informix-4GL中，可以通过屏幕表格说明文件来描述表格，然后用屏幕表格生成工具生成最终的屏幕表格；
　　．规则生成工具：构件类中含有规则的描述，通过相应的生成工具来生成构件，例如，Unix中的Lex和Yacc就是由规则表达式生成程序的两个生成工具。
　　Delete(构件类，关键码)
　　软构件的删除即将某构件类的实例删除出库。每一个构件在所属类(共一个描述模板)中都有一个关键码与之相对应。删除动作既可以直接通过给出构件的关键码来完成，也可以在浏览(或检索)的过程中完成。
　　Search(构件类，检索属性集)
　　在属性模型中，含有与检索有关的属性，例如构件名称、关键码等。对构件的合成也包含着检索的过程。这种检索不同于一般数据库检索，它位于开发中，还存在匹配问题，多个构件的组合需要进行参数的配合。参数的配合依赖于软构件与合成有关的属性，如模板和连接子。
6　结论
　　本文在介绍软构件的概念之后，介绍了现有的软构件描述模型、方法和语言，并提出了一个新的软构件属性模型，使用五元组<comp_basis，comp_ taxonomy，comp_cooperate，comp_link，comp_situation)描述软构件，并用BNF刻画了五元组属性模型的软构件属性，对构件的操作原语也进行了简单的讨论。
本课题获国家高性能计算基金资助
徐正权(华中理工大学计算机学院 武汉 430074)
骆婷(华中理工大学计算机学院 武汉 430074)
参考文献
1 T. Biggerstaff & C. Richter, Reusability Framework, Assessment and Directions, IEEE Software, Vol.4, No.2, Mar. 1987
2 T. C. Jones, Reusability in Programming: A Survey of the State of the Art, IEEE Trans. on Software Engineering, Vol. SE-10, No.5, September l984
3 丁忠俊, 徐正权. 软件重用技术与方法. 小型微型计算机系统, 1998年第19卷第11期第24～31页
4 李留英等. 软部件描述: 模型、方法和语言. 计算机科学, 1997年第24卷第1期
5 骆 婷, 徐正权. 基于复用的软件开发模型. 计算机应用研究, 1998年
6 R. Prieto-Diaz, Status Report: Software Reusability, IEEE Software, May l993
7 R. Prieto-Diaz ＆P. Freeman, Classifying Software for Reusability, IEEE Software, Vol.4, No.1, 1987
8 徐家福, 陈道蓄, 吕 建, 王志坚. 软件自动化. 北京：清华大学出版社, 南宁：广西科学技术出版社, 1996
9 徐正权. 软件生产线方法. 小型微型计算机系统, 1999
10 徐正权. 软件复用方法与技术. 武汉：华中理工大学出版社, 1998
收稿日期：1999年7月7日
