标题：可重用软件
可重用软件概述
软件重用性一般可从抽象层次、剪裁方法和重用条件3方面进行描述。抽象层次指重用的级别。一般可分为代码重用、设计重用、规范重用和概念重用。设计重用指使用在不同环境下构造的设计。此时应考虑环境中硬件或性能约束带来的影响，从相同的设计可以得到不同的代码。规范重用有同设计重用相似的特征。但从相同的规范可得出不同的设计和不同的代码。代码重用有非常明显的效益，它能大量节省程序设计人员的时间，因此为一般人所接受。但代码重用的问题只能发生在编码阶段，在软件开发过程的早期阶段无法确定是否要重用以及重用带来的影响。
另一个困难在于很难找到无需修改即可重用的代码段，其原因是代码一般与其运行环境有着紧密的依赖关系。由于规范和设计尚未考虑表示细节，因此其潜在的重用性是巨大的。另外，重用应在软件开发的前期阶段考虑，所以只有将规范重用、设计重用和代码重用三者结合起来才能真正达到节省软件开发费用，提高软件生产效率的目的。概念重用指在决定采用软件重用技术之前，应对应用领域进行分析，找出软件可重用的概念。此项工作称为域分析。仅当找出的概念满足下列条件（即具有较好的模块化结构、较强适应能力的界面和适当的功能）时，软件成分才可能成为可重用部件。剪裁方法软件重用还涉及如何剪裁和修改可重用部件以适应新的要求。
采用的剪裁方法有：
①根本不剪裁
如程序设计语言所带的库函数。
②手工剪裁法
即手工修改可重用部件的内部细节，它要求用户了解可重用部件的内部详细情况。
③模板修改法
按模板修改比手工剪裁方便且安全，但同手工剪裁一样，仍有可能因修改可重用部件而使其出错。
④类属参数化方法
能保证修改不会使原可重用部件出错 ，但为设计和编码有一定要求。可重用技术中一般都采用此方法。重用条件可重用软件应满足如下的条件：
①软件系统应是模块化结构。
只有在模块化结构中，模块内部的修改和局部系统的重构（部分模块的替换、部分接口的改动）才不至于影响系统的功能和总体面貌。
②软件系统应不依赖于具体的运行环境。
在这种结构的系统中，依赖于具体运行环境的部分可以集中在少数模块。一旦系统环境发生变化，就可以用其他模块加以替换。
③软件系统应建立在标准的、统一的数据接口上，即软件系统在建立数据模块进行数据操作时，都要求以标准的数据模式为依据。
这样可以减少系统中模块之间的数据交换和相互依赖关系，并将数据模块的操作集中在少数几个模块进行统一管理。
④软件系统应有知识的帮助。
这一要求不是必须的，但在软件系统进行重构、扩充时，知识库系统可以提供并学习系统组合、生成及重用方面的知识，从而提高工作效率、改进工作质量。
软件重用定义
软件重用（Software Reuse，又称软件复用或软件再用）的概念对于大家并不陌生。早在1968年的NATO软件工程会议上就已经提出可复用库的思想。软件重用的定义也很多，比较权威和通用的一种是：软件重用是利用事先建立好的软部品创建新软件系统的过程。这个定义蕴含着软件重用所必须包含的两个方面： 
1. 系统地开发可重用的软部品。这些软部品可以是代码，但不应该仅仅局限在代码。我们必须从更广泛和更高层次来理解，这样才会带来更大的重用收益。比如软部品还可以是：分析，设计，测试数据，原型，计划，文档，模板，框架等等。 
2. 系统地使用这些软部品作为构筑模块，来建立新的系统。
软件重用的好处
1. 提高软件生成率。 
2. 缩短开发周期 。 
3. 降低软件开发和维护费用。 
4. 生产更加标准化的软件。 
5. 提高软件开发质量。 
6. 增强软件系统的互操作性。 
7. 减少软件开发人员数量。 
8. 使开发人员能比较容易的适应不同性质的项目开发。
软件成分重用形式分类
软件成分的重用可以进一步划分成以下三个级别。代码重用即普通代码的重复利用。
设计结果重用设计结果重用指的是，重用某个软件系统的设计模型(即求解域模型)。这个级别的重用有助于把一个应用系统移植到完全不同的软/硬件平台上。
分析结果重用这是一种更高级别的重用，即重用某个系统的分析模型。这种重用特别适用于用户需求未改变，但系统体系结构发生了根本变化的场合。?更具体地说，可能被重用的软件成分主要有以下10种。
软件重用形式
软件重用的形式（或手段）很多，重用的级别有大有小。主要有以下几种： 
1. 源代码模块或者类一级的重用。这是最基本的软件重用形式。 
2. 二进制形式的重用。如组件重用。 
3. 组装式重用。比如：把好几个应用程序的功能集成在一起。例如，要建立一个门户站点应用，登陆用户既可以查询天气情况，又可以查看股市行情，还可以在线购物。这些功能由不同网络应用服务供应商提供，通过这种组装式重用，就可以非常容易地把上述功能都集成到新的门户站点中。 
4. 分析级别重用。 
5. 设计级别重用。 
6. 软件文档重用。
软件重用分类
为软件重用分类比较困难，因为软件重用技术众多，一种重用技术可以包括多种重用形式。比如说：框架即可以包括代码级重用，也可以包括设计级重用。有一种分类方法是按照软件重用所应用的领域范围，把重用划分为两种：横向重用和纵向重用。 
横向重用指重用不同应用领域中的软件元素，例如数据结构、分类算法、人机界面构件等。标准函数库是一种典型的原始的横向重用机制。纵向重用指在一类具有较多公共性的应用领域之间进行软部品重用。因为在两个截然不同的应用领域之间实施软件重用非常困难，潜力不大，所以纵向重用才广受瞩目，并成为软件重用技术的真正所在。纵向重用活动的主要包括以下几个步骤： 
1) 首先进行域分析。根据应用领域的特征及相似性预测软部件的可重用性。 
2) 然后进行软部品的开发。一旦确认了软部件的重用价值，即可进行软部品的开发并对具有重用价值的软部品进行一般化，以便它们能够适应新的类似的应用领域。 
3) 最后，软部件及其文档即可进入软部品库，成为可供后续项目使用的可重用资源。
流行的软件重用技术
最理想的重用技术是它的重用产品能够和用户的需求完全一致，不需要用户做任何自定义，并且能够无需用户学习就能够被使用。然而，一种重用技术能够适合今天，可能不适合明天。一个重用产品越是能够被自定义，它越是可能在一个特定的环境下被使用，但是这也需要用户进行更多的学习，研究和实践。 
自从软件重用思想产生以来，计算机科学家和软件工程师就致力与软件重用的技术的研究和实践。在30多年的时间内，出现多种软件重用技术，如:库函数，模板，面向对象、设计模式、组件、框架、构架。 
下面是应用程序框架和其它三种软件流行的重用技术的比较。 
1. 库函数库函数是很早的软件重用技术。很多编程语言为了增强自身的功能，都提供了大量的库函数。对于库函数的使用者，他只要知道函数的名称，返回值的类型, 函数参数和函数功能就可以对其进行调用。2. 面向对象面向对象技术是近三十年来学术界和工业界研究和应用的一个热点。面向对象技术通过方法、消息、类、继承、封装、和实例等机制构造软件系统，并为软件重用提供强有力的支持。面向对象方法已成为当今最有效、最先进的软件开发方法。与函数库对应，很多面向对象语言为应用程序开发者提供了易于使用的类库，如VC++中的MFC。3. 模板模板相当于工业生产中所用的“模具”。有各种各样的模板（如文档模板，网页模板等），利用这些模板可以比较快速地建立对应的软件产品。模板把不变的封装在内部，对可能变化的部分提供了通用接口，由使用者来对这些接口进行设定或实现。4. 设计模式设计模式作为重用设计信息的一种技术，在面向对象设计中越来越来流行。设计模式描述了在我们周围不断重复发生的问题，该问题的解决方案的核心和解决方案实施的上下文。设计模式命名一种技术并且描述它的成本和收益，共享一系列模式的开发者拥有共同的语言来描述他们的设计。5. 构件普通意义上的构件应从以下几个方面来理解： 
1) 构件应是抽象的系统特征单元，具有封装性和信息隐蔽，其功能由它的接口定义。 
2) 构件可以是原子的，也可以是复合的。因此它可以是函数，过程或对象类，也可以是更大规模的单元。一个子系统是包含其它构件的构件。 
3) 构件是可配置和共享的,这是基于构件开发的基石，且构件之间能相互提供服务。6. 构架普通意义上的构架应从以下几个方面来理解： 
1) 构架是与设计的同义理解，是系统原型或早期的实现。 
2) 构架是高层次的系统整体组织。 
3) 构架是关于特定技术如何合作组成一个特定系统的解释。7. 框架如果把软件的构建过程看成是传统的建筑过程；框架的作用相当于为我们的房屋搭建的“架子”。框架从重用意义上说，是一个介于构件和构架之间的一个概念。构件，框架和构架三者的主要区别在于：对重用的支持程度的不同： 
1) 构件是基础，也是基于构件开发的最小单元。构件重用包括可重用构件的制作和利用可重用构件构造新构件或系统， 
2) 一个框架和构架包含多个构件。这些构件使用统一的框架（构架）接口，使得构造一个应用系统更为容易。 
3) 框架重用包括代码重用和分析设计重用，一个应用系统可能需要若干个框架的支撑，从这个意义上来说，框架也是一个“构件”的同时，框架又是一类特定领域的构架。 
4) 构架重用不仅包括代码重用和分析设计重用，更重要的是抽象层次更高的系统级重用。 
5) 框架和构架的重用层次更高，比构件更为抽象灵活，但也更难学习和使用。