为软件复用写一篇详细的介绍
软件复用是指在构造新的软件系统的过程中，对已存在的软件产品(设计结构、源代码、文档等)重复使用的技术。#### 软件复用的发展历史

软件复用并不是一个新概念，它的首次提出可以追溯到20世纪60年代末期。截至目前，共经历了4个标志性的研究、发展阶段。

1．1968--1978年：萌芽、潜伏期

在1968年德国Garmish举行的NATO(北大西洋公约组织)软件工程会议上，DoughMcilroy在其论文MassProduceSoftwareComponents中提出软件复用的概念，希望通过代码复用实现软件开发的大规模生产。Mcilroy设想软件构件可根据它们的通用性、性能、应用平台进行分类，使复杂的软件系统可以像硬件设计一样，通过标准的构件进行识别、组装，这也是类构件软件复用思想的雏形，但是在以后的10年中，软件复用研究并未取得实质进展。

2．1979——1983年：再发现期

1979年，Lanergan发表论文，对其在RaytherMissiceDivison中的一项软件复用项目进行总结，使得软件复用技术重新引起人们的关注。Lanergan项目小组分析了5000个COBOL源程序，发现设计和代码中有60％的冗余，因此可标准化并被复用。在此后的几年里，其他软件工程师也通过研究发现商业、金融等系统的大部分逻辑结构和设计模式都属于编辑、维护、报表等类型的模块，可通过对这些模块重新设计和标准化而得到较高的复用率。

3．1983——1994年：发展期

1983年，HedBiggerstuffA和AlanPetis在美国的NewPort组织了第一次有关软件复用的研讨会。随后在1984年和1987年，美国IEEETransactiononSoftwareEngineering和IEEESoftware分别出版了有关软件复用的专辑。1991年，第一届软件复用国际研讨会(IWSR)在德国举行，之后在1993年又举行了第二次研讨会。在此期间，欧洲实施了几个有关软件复用的重点项目，如ESF(EurekaSoftwareFactory)，其主要目标是提供软件复用的工具支持。

4．1994年至今：成熟期

1994年的软件复用国际研讨会议改称软件复用国际会议，此时软件复用技术已引起了计算机科学界的广泛重视，越来越多的人投入到这一技术的研究中。面向对象技术的崛起给软件复用技术以新的希望，出现了类库、构件等新的复用方式，微软的ActiveX是其典型代表。软件复用研究重新成为热点，被视为解决软件危机、提高软件生产效率和质量的现实可行的途径。软件的构件化开发和软件复用已经成为互联网时代软件开发的大趋势。软件复用是解决“软件危机”的重要手段之一。无论是早期的结构化软件设计方法还是后来的面向对象的软件设计方法都在朝着这个方向努力。#### 软件复用的分类

(1)代码的复用

代码复用是软件复用中最为常见的一种形式，包括目标代码和源代码的复用。其中目标代码的复用级别最低，历史最久，大部分编程语言的运行支持环境都提供了连接、绑定等功能来支持这种复用。源代码的复用级别略高于目标代码的复用，程序员在编程时把一些想复用的代码段复制到程序中，但这样做往往会产生一些新旧代码不匹配的错误。要大规模地实现源程序的复用，只有依靠含有大量可复用构件的构件库，如“对象链接与嵌入”技术，既支持在源程序级上定义构件以构造新的系统，又使这些构件在目标代码级上仍然是一些独立的可复用构件，能够在运行时被灵活地重新组合为各种应用系统。

(2)设计的复用

设计结果比源程序的抽象级别更高，因此它的复用受实现环境的影响较少，从而使可复用构件被复用的机会更多，并且所需修改更少。这种复用有3种途径，第一种途径是从现有系统的设计结果中提取一些可复用的设计构件，并把这些构件应用于新系统的设计中；第二种途径是把一个现有系统的全部设计文档在新的软硬件平台上重新实现，也就是把一个设计运用于多个具体的实现；第三种途径是独立于任何具体的应用，有计划地开发一些可复用的设计构件。

(3)分析的复用

这是比设计结果更高级别的复用。可复用的分析构件是针对问题域的某些事物或某些问题的抽象程度更高的方法，受设计技术及实现条件的影响更小，所以可复用的机会更大。这种复用也有3种途径，第一种途径是从现有系统的分析结果中提取可复用构件并用于新系统的分析；第二种途径是用一份完整的分析文档作为输入，产生针对不同软硬件平台和其他实现条件的多项设计；第三种途径是独立于具体应用，专门开发一些可复用的分析构件。

(4)测试信息的复用

测试信息的复用主要包括测试用例的复用和测试过程的复用。前者是把一个软件的测试用例应用于新的软件测试中，或者在软件作出修改时使用在新一轮的测试中。后者是在测试过程中通过软件工具自动记录测试的过程信息，包括测试员的每一个操作、输人参数、测试用例及运行环境等信息，并将这些过程信息应用于新的软件测试或新一轮的软件测试中。测试信息的复用级别不易同分析、设计、编程的复用级别进行准确地比较，因为被复用的不是同一事物的不同抽象层次，而是另一种信息，但从这些信息的形态来看，大体处于与程序代码相当的级别。
从软件的发展历史来看，在软件发展初期，所有人都必须从头开始编写程序。现在，软件系统的种类越来越多，规模越来越大，在已有的软件中，很多功能被重复写了成千上万次，这些重复的代码在当今软件的开发中可以不断被拿来使用。AT&T、爱立信、惠普、IBM、摩托罗拉、NEC和东芝等公司的经验表明，非正式的代码复用率为15％～20％，结合其他系统复用，使得软件开发的成本大大降低，开发时间得到有效缩短。
日本的一些软件公司还建立了适合使用标准部件的工程组织，一直追求更正式的复用。20世纪80年代中期，日本软件工程的复用率已经接近50％。美国的惠普公司从1984年初开始之后的10年里，在仪表和打印机固件方面的复用率达到25％～50％，其中有一条仪表生产线达到了83％。
由此可见，使用软件复用技术可以减少软件开发活动中大量的重复性劳动，提高软件生产效率，降低开发成本，缩短开发周期。同时，由于软件构件大都在实际运行环境中得到了多次校验，并经过了严格的质量认证，因此，复用这些构件有助于改善软件质量。此外，大量使用软件构件，还有助于提高软件的灵活性和标准化程度。而且，由于软件生产过程主要是正向过程，即大部分软件的生产过程是使软件产品从抽象级别较高的形态向抽象级别较低的形态演化，级别较高的复用容易带动级别较低的复用，因而复用的级别越高，可得到的回报也就越大，因此分析结果和设计结果在目前很受重视。用户可购买生产商的分析构件和设计构件，自己设计或编程，掌握系统的剪裁、扩充、维护和演化等活动。#### 软件复用的层次

软件复用有三个层次：知识的复用、方法的复用和软件成分的复用，前两个属于知识工程的范畴，这里只讨论软件成分的复用。软件成分的复用包括
(1)代码的复用，可以采用源代码剪贴、源代码包含和继承来实现。
(2)设计结果的复用，是指复用某个软件系统的设计模型，适用于软件系统的移植。
(3)分析结果的复用，是指复用某个软件系统的分析模型，适用于用户需求未改变，而系统体系结构变化的场合。#### 软件复用的意义

软件复用的意义是降低软件开发和维护的成本，提高软件开发效率，提高软件的质量。