基于构件的开发

10.1 构件与软件重用

构件(component,又称组件)是一个功能相对独立的、具有可重用价值的软件单元。在面向对象方法中,一个构件由一组对象构成,包含了一些协作的类的集合,它们共同工作来提供一种系统功能。

10.1.1 软件重用

可重用性(可复用性)是指系统和(或)其组成部分能在其他系统中重复使用的程度。软件开发的全生命周期都有可重用的价值,包括项目的组织、软件需求、设计、文档、实现、测试方法和测试用例,都是可以被重复利用和借鉴的有效资源。可重用性体现在软件的各个层次,通用的、可重用性高的软件模块往往已经由操作系统或开发工具提供,如通用库、标准组件和标准模板库等,它们并不需要程序员重新开发。

软件重用(软件复用)是使用已有的软件产品(如设计、代码、文档等)来开发新的软件系统的过程。软件重用的形式大体可分为垂直式重用和水平式重用。水平式重用是重用不同应用领域中的软件元素,如数据结构、排序算法、人机界面构件等。标准函数库是一种典型的原始的水平式重用机制。垂直式重用是在一类具有较多公共性的应用领域之间重用软件构件。由于在两个截然不同的应用领域之间进行软件重用潜力不大,所以垂直式重用受到广泛关注。

垂直式重用活动的主要关键点在于领域分析∶根据应用领域的特征和相似性,预测软件构件的可重用性。一旦根据领域分析确认了软件构件的可重用价值,即可进行软件构件的开发,并对具有可重用价值的软件构件做一般化处理,使它们能够适应新的类似的应用领域。然后将软件构件和它们的文档存入可重用构件库,成为可供未来开发项目使用的可重用资源。

软件重用的范围不仅涉及源程序代码,Caper Jones 定义了10种可能重用的软件要素,分别是项目计划、成本估计、架构、需求模型和规格说明、设计、源程序代码、用户文档和技术文档、用户界面、数据结构和测试用例。

有一个组织叫做基于面向对象技术的重用(Reuse Based on Object-Oriented Techniques,REBOOT)开发了支持重用的两种过程模型,分别是为重用开发和利用重用进行开发。该组织还开发了一系列工具,称为REBOOT环境。他们强调的一个原则是”未来重用者的需求,就是对可重用构件的信心”。开发者的倾向是抵制重用,因为他们缺乏这种信心。为了克服这种状态,REBOOT推荐一种文档结构,包括测试信息和重用者的经验。

美国国防部的一项称为可适应、可靠性的软件技术(Software Technology for Adaptable,Reliable Softeware,STARS)关注过程、架构和重用三者的集成。STARS 认为软件产品线开发的软件周期应该包括过程驱动、软件架构、领域工程、可重用构件库这4个概念。

系统的软件重用由可重用的资产(构件)的开发、管理、支持和重用4个过程组成。工作在重用资产开发过程中的是构件开发者和领域工程师,工作在应用项目开发过程中的是应用工程师。如果要系统地实施软件重用,需要遵循以下原则∶

(1)需要高层领导的支持,并需要有长期的经费支持。

(2)为了渐进地推行系统的重用,需要规划和调整系统的架构、开发过程、组织结构,并以小规模的先行项目为典型示范,而后再铺开。

(3)为了重用,先规划架构及其逐步实施的过程。

(4)过渡到明确的重用组织机构,将可重用构件的创建工作与重用工作分离开,并且提供明确的支持职能。

(5)在真实的环境中,进行可重用构件的创建和改进工作。

(6)要将应用系统和可重用构件作为一个经济核算的产品整体进行管理,应当注重公用构件在应用系统及其子系统领域中的高盈利作用。

(7)要认识到单独的对象技术或者单独的构件技术都是不够的。

(8)采用竞赛和更换负责人的办法,进行开发单位的文化建设和演化。

(9)对基础设施、重用教育、技巧培训,要投资和持续地改进。

(10)要采用度量方法测量重用过程,并要优化重用程序。

10.1.2 构件标准

构件是软件系统可替换的、物理的组成部分,它封装了实现体(实现某个职能),并提供了一组接口的实现方法。可以认为构件是一个封装的代码模块或大粒度的运行时模块,也可以将构件理解为具有一定功能、能够独立工作或与其他构件组合起来协调工作的对象。

对于构件,应当按可重用的要求进行设计、实现、打包、编写文档。构件应当是内聚的,并具有相当稳定的、公开的接口。为了使构件更切合实际、更有效地被重用,构件应当具备可变性,以提高其通用性。构件应向重用者提供一些公共特性,另一方面还要提供可变的特性。针对不同的应用系统,只需对其可变部分进行适当的调整,重用者要根据重用的具体需要,改造构件的可变特性,即客户化。需要进行客户化的构件称为抽象构件,而可以直接重用的构件称为具体构件。通用性越好,其被重用的面就越广。可变性越好,构件就越易于调整,以便适用于具体的应用环境。

为了将不同软件生产商在不同软硬件平台上开发的构件组装成一个应用系统,必须解决异构平台各构件间的互操作问题,目前已出现了一些支持互操作的构件标准,3个主要流派为OMG(Object Management Group,对象管理集团)的CORBA(Common Object Request Broker Architecture,公共对象请求代理)、Microsoft的COM(Component Object Model,构件对象模型)/DCOM(Distributed Component Object Model,分布式构件对象模型)和Sun的EJB(Enterprise JavaBean,企业 JavaBean)。

CORBA 是由OMG 制定的一个工业标准,其主要目标是提供一种机制,使得对象可以透明地发出请求和获得应答,从而建立起一个异质的分布式应用环境。CORBA 技术规范的主要内容包括接口定义语言、接口池、动态调用接口、对象适配器等。

EJB是用于开发和部署多层结构的、分布式的、面向对象的Java 应用系统的跨平台的构建架构。使用EJB编写的应用程序具有可扩展性、交互性,以及多用户安全的特性。这些应用只需要写一次,就可以发布到任何支持EJB规范的服务器平台上。有3种类型的EJB,分别是会话 Bean、实体 Bean和消息驱动Bean。

Microsof的分布式DCOM扩展了COM,使其能够支持在局域网、广域网甚至Intemet 上不同计算机的对象之间的通信。使用DCOM,应用程序就可以在位置上达到分布性,从而满足客户和应用的需求。因为DCOM是COM的无缝扩展,所以可以将基于COM 的应用、构件、工具,以及知识转移到标准化的分布式计算领域中来。在做分布式计算时,DCOM处理网络协议的低层次细节问题,从而使我们能够集中精力解决用户所要求的问题。DCOM具有语言无关性。任何语言都可以用来创建COM构件,并且这些构件可以使用更多的语言和工具。

10.1.3 构件获取

存在大量可重用构件是有效地使用重用技术的前提。通过对可重用信息与领域的分析,可以得到∶

(1)可重用信息具有领域特定性,即可重用性不是信息的一种孤立属性,它依赖于特定问题和特定问题解决方法。为此,在识别、获取和表示可重用信息时,应采用面向领域的策略。

(2)领域具有内聚性和稳定性,即关于领域的解决方法是充分内聚和充分稳定的。一个领域的规约和实现知识的内聚性,使得可以通过一组有限的、相对较少的可重用信息来解决大量问题。领域的稳定性使得获取的信息可以在较长的时间内多次重用。领域是一组具有相似或相近软件需求的应用系统所覆盖的功能区域,领域工程是一组相似或相近系统的应用工程建立基本能力和必备基础的过程。领域工程过程可划分为领域分析、领域设计和领域实现等多个活动,其中的活动与结果如图10-1所示。

在建立基于构件的软件开发中,构件获取可以有多种不同的途径∶

(1)从现有构件中获得符合要求的构件,直接使用或作适应性(flexibility)修改,得到可重用构件。

(2)通过遗留工程(legacy engineering),将具有潜在重用价值的构件提取出来,得到可重用构件。

(3)从市场上购买现成的商业构件,即COTS(Commercial OF-The-Shll)构件。

(4)开发新的符合要求的构件。

一个组织在进行以上决策时,必须考虑到不同方式获取构件的一次性成本和以后的维护成本(直接成木和间接成本),然后做出最优的选择。

10.1.4 构件管理

对大量的构件进行有效的管理,以方便构件的存储、检索和提取,是成功重用构件的必要保证。构件管理的内容包括构件描述、构件分类、构件库组织、人员及权限管理和用户意见反馈等。

构件模型是对构件本质的抽象描述,主要是为构件的开发与构件的重用提供依据∶从管理角度出发,也需要对构件进行描述,例如,实现方式、实现体、注释、生产者、生产日期、大小、价格、版本和关联构件等信息,它们与构件模型共同组成了对构件的完整描述。

1.构件的组织

为了给使用者在查询构件时提供方便,同时也为了更好地重用构件,我们必须对收集和开发的构件进行分类,并置于构件库的适当位置。构件的分类方法及相应的库结构对构件的检索和理解有极为深刻的影响。因此,构件库的组织应方便构件的存储和检索。

可重用技术对构件库组织方法的要求是∶

(1)支持构件库的各种维护动作,如增加、删除以及修改构件,尽量不要影响构件库的结构。

(2)不仅要支持精确匹配,还要支持相似构件的查找。

(3)不仅能进行简单的语法匹配,而且能够查找在功能或行为方面等价或相似的构件。

(4)对应用领域具有较强的描述能力和较好的描述精度。

(5)库管理员和用户容易使用。

目前,已有的构件分类方法可以归纳为三大类,分别是关键字分类法、刻面分类法和超文本组织方法。

(1)关键字分类法(keyword classification)∶根据领域分析的结果将应用领域的概念按照从抽象到具体的顺序逐次分解为树形或有向无回路图结构。每个概念用一个描述性关键字表示。不可分解的原子级关键字包含隶属于它的某些构件。当加入构件时,库管理员必须对构件的功能或行为进行分析,在浏览上述关键字分类结构的同时,将构件置于最合适的原子级关键字之下。如果无法找到构件的属主关键字,可以扩充现有的关键字分类结构,引进新的关键字。但库管理员必须保证新关键字有相同的领域分析结果
作为支持。

(2)刻面分类法(faceted clasification)∶定义若干用于刻画构件特征的”面”(facet),每个面包含若干概念,这些概念描述构件在面上的特征。刻面可以描述构件执行的功能、被操作的数据、构件应用的语境或任意其他特征。描述构件的刻面的集合称为刻面描述符(facet dscriptor),通常,刻面描述被限定不超过7或8个刻面。

关键字分类法和刻面分类法都是以数据库系统作为实现背景的。尽管关系数据库可供选用,但面向对象数据库更适于实现构件库,因为其中的复合对象、多重继承等机制与表格相比更适合描述构件及其相互关系。

(3)超文本方法(hypertext clssification))∶与基于数据库系统的构件库组织方法不同,它基于全文检索技术。其主要思想是∶所有构件必须辅以详尽的功能或行为说明文档;说明中出现的重要概念或构件以网状链接方式相互连接;检索者在阅读文档的过程中可按照人类的联想思维方式任意跳转到包含相关概念或构件的文档;全文检索系统将用户给出的关键字与说明文档中的文字进行匹配,实现构件的浏览式检索。超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联想式关联。超文本组织方法为构造构件和重用构件提供了友好、直观的多媒体方式。由于网状结构比较自由、松散,因此,超文本方法比前两种方法更易于修改构件库的结构。

2.构件分类

如果把软件系统看成构件的集合,那么从构件的外部形态来看,构成一个系统的构件可分为5类∶

(1)独立而成熟的构件。独立而成熟的构件得到了实际运行环境的多次检验,该类构件隐藏了所有接口,用户只需用规定好的命令进行使用。例如,数据库管理系统和操作系统等。

(2)有限制的构件。有限制的构件提供了接口,指出了使用的条件和前提,这种构件在装配时,会产生资源冲突、覆盖等影响,在使用时需要加以测试。例如,各种面向对象程序设计语言中的基础类库等。

(3)适应性构件。适应性构件进行了包装或使用了接口技术,处理了不兼容性、资源冲突等,可以直接使用。这种构件可以不加修改地使用在各种环境中,例如ActiveX等。

(4)装配的构件。装配的构件在安装时,已经装配在操作系统、数据库管理系统或信息系统不同层次上,使用胶水代码(glue code)就可以进行连接使用。目前一些软件商提供的大多数软件产品都属这一类。

(5)可修改的构件。可修改的构件可以进行版本替换。如果对原构件修改错误、增加新功能,可以利用重新”包装”或写接口来实现构件的替换。这种构件在应用系统开发中使用得比较多。

3.人员及权限管理

构件库系统是一个开放的公共构件共享机制,任何使用者都可以通过网络访问构件库,这在为使用者带来便利的同时,也给系统的安全性带来了一定的风险,因此有必要对不同使用者的访问权限作出适当的限制,以保证数据安全。

一般来讲,构件库系统可包括5类用户,即注册用户、公共用户、构件提交者、一般系统管理员和超级系统管理员。他们对构件库分别有不同的职责和权限,这些人员相互协作,共同维护着构件库系统的正常运作。同时,系统为每一种操作定义一个权限,包括提交构件、管理构件、查询构件及下载构件。每一用户可被赋予一项或多项操作权限,这些操作权限组合形成该人员的权限,从而支持对操作的分工,为权限分配提供了灵活性。

10.1.5 构件重用

构件开发的目的是重用,为了让构件在新的软件项目中发挥作用,库的使用者必须完成以下工作∶检索与提取构件,理解与评价构件、修改构件,最后将构件组装到新的软件产品中。

  1. 检索与提取构件

构件库的检索方法与组织方式密切相关,因此,我们针对10.1.4节介绍的关键字分类法、刻面分类法和超文本组织方法分别讨论相应的检索方法。

(1)基于关键字的检索。系统在图形用户界面上将构件库的关键字树形结构直观地展示给用户;用户通过对树形结构的逐级浏览寻找需要的关键字并提取相应的构件。当然,用户也可直接给出关键字(其中可含通配符),由系统自动给出合适的候选构件清单。这种方法的优点是简单、易于实现,但在某些场合没有应用价值,因为用户往往无法用构件库中已有的关键字描述期望的构件功能或行为,对库的浏览也容易使用户迷失方向。

(2)刻面检索法。该方法基于刻面分类法,由3个步骤构成,分别是构造查询、检索构件、对构件进行排序。这种方法的优点是它易于实现相似构件的查找,但用户在构造查询时比较麻烦。

(3)超文本检索法。用户首先给出一个或数个关键字,系统在构件的说明文档中进行精确或模糊的语法匹配,匹配成功后,向用户列出相应的构件说明。这种方法的优点是用户界面友好,但在某些情况下用户难以在超文本浏览过程中正确选取构件。

(4)其他检索方法。上述检索方法基于语法(syntax)匹配,要求使用者对构件库中出现的众多词汇有较全面的把握、较精确的理解。理论的检索方法是语义(semantic)匹配∶构件库的用户以形式化手段描述所需要的构件的功能或行为语义,系统通过定理证明及基于知识的推理过程寻找语义上等价或相近的构件。遗憾的是,这种基于语义的检索方法涉及许多人工智能难题,目前尚难于支持大型构件库的工程实现。

  1. 理解与评价构件

要使库中的构件在当前的开发项目中发挥作用,准确地理解构件是至关重要的。当开发人员需要对构件进行某些修改时,情况更是如此。考虑到设计信息对于理解构件的必要性以及构件的用户逆向发掘设计信息的困难性,必须要求构件的开发过程遵循公共软件工程规范,并且在构件库的文档中,全面、准确地说明构件的功能与行为、相关的领域知识、可适应性约束条件与例外情形、可以预见的修改部分及修改方法。

但是,如果软件开发人员希望重用以前并非专为重用而设计的构件,上述假设则不能成立。此时开发人员必须借助于CASE 工具对候选构件进行分析。这种CASE工具对构件进行扫描,将各类信息存入某种浏览数据库,然后回答构件用户的各类查询,进而帮助理解。

逆向工程是理解构件的另一种重要手段。它试图通过对构件的分析,结合领域知识,半自动地生成相应的设计信息,然后借助设计信息完成对构件的理解和修改。

对构件可重用的评价,是通过收集并分析构件的用户在实际重用该构件的历史过程中的各种反馈信息来完成的。这些信息包括∶重用成功的次数,对构件的修改量,构件的健壮性度量,性能度量等。

3.修改构件

理想的情形是对构件库中的构件不作修改而直接用于新的软件项目。但是,在大多数情况下,必须对构件进行或多或少的修改,以适应新的需求。为了减少构件修改的工作量,要求开发人员尽量使构件的功能、行为和接口设计更为抽象化、通用化和参数化。这样,构件的用户即可通过对实参的选取来调整构件的功能或行为。如果这种调整仍不足以使构件适用于新的软件项目,用户就必须借助设计信息和文档来理解、修改构件。所以,与构件有关的文档和抽象层次更高的设计信息对于构件的修改至关重要。例如,如果需要将C 语言书写的构件改写为Java语言形式,构件的算法描述就十分重要。

4.构件组装

构件组装是指将库中的构件经适当修改后相互连接,或者将它们与当前开发项目中的软件元素相连接,最终构成新的目标软件。构件组装技术大致可分为基于功能的组装技术、基于数据的组装技术和面向对象的组装技术。

(1)基于功能的组装技术。基于功能的组装技术采用子程序调用和参数传递的方式将构件组装起来。它要求库中的构件以子程序/过程/函数的形式出现,并且接口说明必须清晰。当使用这种组装技术进行软件开发时,开发人员首先应对目标软件系统进行功能分解,将系统分解为强内聚、松耦合的功能模块。然后根据各模块的功能需求提取构件,对它进行适应性修改后再挂接在上述功能分解框架(framework)中。

(2)基于数据的组装技术。基于数据的组装技术首先根据当前软件问题的核心数据结构设计出一个框架,然后根据框架中各结点的需求提取构件并进行适应性修改,再将构件逐个分配至框架中的适当位置。此后,构件的组装方式仍然是传统的子程序调用与参数传递。这种组装技术也要求库中构件以子程序形式出现,但它所依赖的软件设计方法不再是将功能分解,而是面向数据的设计方法,例如Jackson系统开发方法。

(3)面向对象的组装技术。由于封装和继承特征,面向对象方法比其他软件开发方法更适合支持软件重用。在面向对象的软件开发方法中,如果从类库中检索出来的基类能够完全满足新软件项目的需求,则可以直接应用∶否则,必须以类库中的基类为父类采用构造法或子类法生成子类。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇