当前课程知识点:软件工程与软件自动化 > 第九章 软件复用 > 9.1软件复用综述 > 授课视频
嗨,大家好
今天我们来讨论软件复用
说到软件复用,有人可能说了
我现在天天都在复用
我把一段代码拷贝来拷贝去,复用率很高啊
这话乍一听好像也对
代码拷贝好像也算是一种代码复用吧
但大家别忘了,代码坏味道当中排名第一的可就
是代码拷贝
尽管代码拷贝不是一种良好的复用方法
但是也足以说明我们对软件复用的迫切需求
但是也足以说明我们对软件复用的迫切需求
除了代码拷贝这种低级的不良的复用方式之外
我们再来看一看,在整个软件开发过程中
哪些地方还可以复用
通过观察,我们可以很容易的发现
当每个应用系统都从头开始进行开发的时候
在系统开发过程当中就必然存在大量重复的劳动
比如,用户需求捕获的时候有重复
需求分析和设计的重复
编码的重复,测试的重复,文档工作的重复等等
等等
我们希望通过软件复用来避免大量的重复
提高软件开发的效率和产品的质量
随着面向对象技术、构件技术的出现
并逐步成为主流技术
为软件复用提供了基本的技术支持
软件复用的概念第一次引入是在1968年
当时在一次国际的开发会议上有人发表了一篇论
文
题目就叫“大量生产的软件构件”
在此之前,子程序的概念其实也体现了复用的思
想
随后出现了通用的子程序库
供程序员在编程的时候使用
从那以后,也出现了很多复用技术
和成功的复用实践经验
他们对软件的复用也有了更加明确的定义
这里我们认为,软件复用是指重复使用
为了复用的目的而设计的软件
这样一个过程
也就是在设计软件的时候
就要考虑到设计内容的多次使用问题
我们把为了复用的目的而设计的软件叫做可复用
软件
以区别于那些一般的一次性的软件元素
相对应的
我们可以把那种重复使用了
并不是为了复用而设计的软件
的那些活动,我们叫做“软件挽救”
把那些在一个应用系统的不同版本之间的
这种代码重复的活动,叫做“代码沿用”
这么说也是为了尽量避免使用“复用”这个词
免得把复用这个词狭义的概念
和广义的概念混在一起
软件挽救和代码沿用都不属于狭义上的软件复用
为了进一步了解软件复用的概念
我们来看,在软件演化的过程中
重复使用的行为可以发生在三个维度
一是时间维
就是使用以前的软件版本作为新版本的基础
加入新的功能,适应新的需求,这就是软件维护
二是平台维,就是以某个平台上的软件为基础
修改和运行那些和平台相关的部分
使其能够运行在新的平台下,这就是软件移植
三是应用维
就是将某个软件或者软件中的某些构件
应用到其他的应用系统当中去
新的系统具有不同的功能和用途
应用维的重复活动才是真正意义上的软件复用
软件的复用可以根据多个角度来观察和分类
按照复用的对象分
可以将软件复用分为产品复用和过程复用
产品复用从狭义上来说
是指复用那些已有的软件构件
通过构件集成得到新的系统
如果从广义上来说,则包括数据复用
体系结构复用,设计复用和程序模块复用等等
过程复用是指复用已有的软件开发过程
使用可复用的应用生成器来自动生成
或者是半自动的生成那些我们所需要的系统
过程复用依赖于软件自动化技术的发展
目前只适用于一些特殊的应用领域
所以,产品复用是目前现实的,主流的一个复用
途径
如果按照复用的方式来分
软件复用又可以分为黑盒复用和白盒复用
黑盒复用是指对已有的构件不做任何修改而直接
使用
当然这是一种理想的复用方式
白盒复用是指已有的构件并不能完全符合用户的
需求
需要根据用户的需求进行适应性修改之后才能使
用
在大多数应用系统的组装过程中
构件的适应性修改往往是必需的
软件复用有三个基本的问题
一是必须有可以复用的对象
二是被复用的对象必须是有用的
三是复用者需要知道如何去使用被复用的对象
软件复用还包括两个相关的过程
一是可复用软件的开发
另一个是基于可复用软件的应用系统的构造
解决好了这几个方面的问题才能实现软件复用
与这些问题相关的实现软件复用的关键因素
主要包括软件构件技术,领域工程,软件架构技
术
软件再工程,开放系统技术,软件过程
CASE技术以及各种各样的非技术因素
这些技术因素和非技术因素是相互关联的
随后我们会具体的针对其中的几个关键问题展开
讨论
在这些软件复用的关键因素当中
我们首先来看软件构件技术
构件是应用系统当中可以明确辨识的构成部分
在计算机百科全书当中
软件构件被明确的定义为
软件系统当中具有相对独立功能
可以明确辨识,接口由契约指定
和语境有明显的依赖关系,可独立的部署
而且多由第三方提供的可组装的软件实体
这个定义比较长
定义把构件的几个基本特征都给包括进去了
有些构件的开发并不是为了复用
这一类构件我们这里不做讨论
我们只讨论那些可复用的构件
可复用的构件是指那些具有相对独立功能
和复用价值的构件
随着对软件复用理解的深入
构件的概念已经不再局限于源代码构件了
而是延伸到了需求、系统和软件的需求规约
系统和软件的体系结构,文档,测试计划
测试用例和测试数据
以及其他对软件开发活动有用的信息
一般我们把架构和体系结构当成同义词来对待
这两个词都是指对系统整体结构的刻画
所以我们在后面的讨论中
可以不加区分的使用这两个词汇
构架主要包括全局组织与控制结构,构件间的通
讯
同步和数据访问协议等等
在基于复用的软件开发过程当中
为复用而开发的软件架构可以作为一种
大粒度的,抽象级别比较高的软件构件进行复用
而且软件架构还为构件的组装提供了
基础和上下文的环境
对于成功的复用具有非常重要的意义
软件架构主要是研究如何快速而可靠的
从可复用构件来构造系统的方式
着重于软件系统自身的整体结构和构件间的互联
其中主要包括软件架构的原理和风格
软件架构的描述和规约,特定领域的软件架构
基于软件架构的构件组装机制等等
作为一个研究和应用的热点
面向服务的体系结构,我们称为SOA
提供了一种面向服务的,大颗粒的、松耦合的
动态绑定的分布式应用系统的构建方式
和传统的软件工程不同的是
SOA可以看作是从面向对象技术
和软件架构技术演化而来的
一种新的体系结构风格
服务的概念和SOA的引入
扩展了构件的内涵和外延
支持了异构应用的集成和互操作
促进了软件复用在更大范围内得以实施
领域是一组应用系统所覆盖的功能区域
这些应用系统具有相似或者相近的软件需求
软件复用的研究和实践都表明
在特定领域的软件复用相对来说更容易取得成功
这种现象是由特定领域本身的相对内聚性
和稳定性所决定的
内聚性保证了领域有足够的共性
而稳定性则保证了领域工程的投资
可以获得足够的回报
领域工程是为那种特定领域的应用工程
建立基本能力和必备基础的过程
它涵盖了建立可复用软件构件的所有活动
它涵盖了建立可复用软件构件的所有活动
领域工程包括三个主要的阶段
第一个阶段是分析阶段
这个阶段的主要目标是获得领域模型
领域模型描述了领域当中系统之间的共同需求
这个阶段的主要活动包括确定领域边界,识别信
息源
分析领域中系统的需求
确定哪些需求是可以广泛共享的,哪些是可变的
从而建立领域模型
第二个阶段是设计阶段
这个阶段的目标是获得领域架构
领域架构描述了在领域模型当中的解决方案
它不是单个系统的表示
而是一个高层次的设计
能够适应领域当中多个系统的需求
第三个阶段是实现阶段
这个阶段的主要行为就是定义一种机制
可以把需求翻译成由可复用构件所创建的应用系
统
根据所采用的复用策略和领域的成熟
和稳定程度的不同
这种机制可能是一组与领域模型
和领域架构相关的可复用构件
也可能是应用系统的生成器
软件再工程是指对原有的软件系统进行调查和分
析
将其重构为新系统的开发过程
软件再工程的最重要的特点之一
就是最大限度地重用原有系统的各种资源
从软件重用方法学来说
如何开发可重用的软件和如何使用可重用软件
如何开发可重用的软件和如何使用可重用软件
来构造新的应用系统是两个最关键的问题
不过对于软件再工程来说
很大一部分的工作内容是对原有系统当中
那些非可重用构件的改造
软件再工程是以软件工程方法学为指导
对原有系统进行再设计、再编码和再测试
为此可以使用CASE工具
包括逆向工程和再工程工具来帮助理解原有的设
计
在软件再工程的各个阶段中
软件的可重用程度都将决定软件再工程的工作量
再工程的基础是对原有系统的理解
包括对运行系统,源代码,设计,分析
文档等的全面理解
但在很多情况下,由于各类文档的丢失
只能对源代码进行再理解
最后,我们再来讨论影响软件复用的其他四个因
素
就是开放系统技术,软件过程
就是开放系统技术,软件过程
CASE技术和非技术因素
开放系统技术的基本原则是在系统的开发中
使用标准接口
同时使用那些符合接口标准的实现
这些原则为系统开发当中的设计决策
特别是对于系统的演化
提供了一种稳定的基础
同时,也为系统和子系统之间的互操作提供了保
证
当前,以解决异构环境当中的互操作性为目标的
分布对象技术是开发系统技术的主流技术
分布对象技术是开放系统技术的主流技术
它使得符合接口标准的构件可以用“即插即用”
的方式组装到系统中,实现黑盒复用
这样,在符合标准接口的前提下
构件就可以进行独立开发
从而可以形成独立的构件生产行业
我们之前讨论过软件过程
知道了一个定义良好的软件过程对软件的质量
和产品的开发效率有着非常重要的影响
当然,基于构件复用的软件开发过程
和传统的那种一切从头开始的软件开发过程
有着实质性的不同
因此,探索与软件复用相适应的软件过程
就成为了一个重要的研究内容
软件复用同样需要CASE技术的支持
CASE技术当中与软件复用相关的主要研究内容
包括
可复用构件的提取、描述、分类和存储、检索
组装和度量等等
除了技术因素之外
软件复用还涉及到众多的非技术因素
比如,机构组织和管理方法如何适应复用的要求
开发人员知识的更新和心理障碍的克服
知识产权问题,标准化问题,等等等等
好,软件复用概述就说这么多,下次再见
-1.1 软件工程的前生今世
--开篇阅读
--授课视频
-第一章 软件工程基础--1.1 软件工程的前生今世
-1.2 万变不离其宗
--授课视频1/3
--授课视频2/3
--授课视频3/3
-第一章 软件工程基础--1.2 万变不离其宗
-1.3 唯一不变的是变化
--授课视频1/3
--授课视频2/3
--授课视频3/3
--外部链接
-第一章 软件工程基础--1.3 唯一不变的是变化
-1.4 亡羊补牢为时不晚
--授课视频1/2
--授课视频2/2
-第一章 软件工程基础--1.4 亡羊补牢为时不晚
-扩展阅读与话题讨论
--扩展阅读
--话题讨论
-2.1 方法论来源于恐惧
--授课视频
-第二章 敏捷开发--2.1 方法论来源于恐惧
-2.2 敏捷是什么
--授课视频
-第二章 敏捷开发--2.2 敏捷是什么
-2.3 典型敏捷开发方法
--XP敏捷开发方法
-第二章 敏捷开发--2.3 典型敏捷开发方法
-2.4 敏捷不是万能药
--授课视频
-第二章 敏捷开发--2.4 敏捷不是万能药
-专家谈敏捷
-扩展阅读与话题讨论
--外部链接
--话题讨论
-3.1 面向对象核心概念和基本特性
-第三章 OO与UML--3.1 面向对象核心概念和基本特性
-3.2 面向对象设计基本原则
-第三章 OO与UML--3.2 面向对象设计基本原则
-3.3 通用职责分配模式(GRASP)
--通用职责分配模式
-3.3 通用职责分配模式(GRASP)--作业
-3.4 从重构到模式
--模式和设计模式
-第三章 OO与UML--3.4 从重构到模式
-3.5 使用UML设计面向对象系统
--UML综述
-第三章 OO与UML--3.5 使用UML设计面向对象系统
-3.6 主要UML模型图绘制技巧
--UML用例图
--UML类图
-第三章 OO与UML--3.6 主要UML模型图绘制技巧
-扩展阅读与话题讨论
--设计模式有毒么?
--话题讨论
-4.1 案例简介
--书籍参考
--案例说明
-4.2 对象模型之一
--授课视频1/2
--授课视频2/2
-第四章 对象模型分析--4.2 对象模型之一
-4.3 对象模型之二
--授课视频1/2
--授课视频2/2
-第四章 对象模型分析--4.3 对象模型之二
-4.4 对象模型之交互
--授课视频
-第四章 对象模型分析--4.4 对象模型之交互
-扩展阅读与话题讨论
--图书推荐
--话题讨论
-5.1 软件自动化概述
--软件自动化概述
-第五章 软件自动化技术--5.1 软件自动化概述
-5.2 典型自动化方法和工具
-第五章 软件自动化技术--5.2 典型自动化方法和工具
-5.3 文档自动化
--文档自动化视频
-第五章 软件自动化技术--5.3 文档自动化
-5.4 测试自动化
--测试自动化视频
-第五章 软件自动化技术--5.4 测试自动化
-专家访谈
-扩展阅读与话题讨论
--话题讨论
-6.1 持续集成
-第六章 CI/CD与DevOps--6.1 持续集成
-6.2 持续交付和部署
-第六章 CI/CD与DevOps--6.2 持续交付和部署
-6.3 DevOps
-第六章 CI/CD与DevOps--6.3 DevOps
-专家访谈
-扩展阅读与话题讨论
--DevOps专题
--话题讨论
-7.1 质量和质量保证
--授课视频
-第七章 软件质量保证--7.1 质量和质量保证
-7.2 软件质量模型
--授课视频
-第七章 软件质量保证--7.2 软件质量模型
-7.3 SQA组织与职责
--授课视频
-第七章 软件质量保证--7.3 SQA组织与职责
-7.4 全面软件质量管理
--授课视频
-第七章 软件质量保证--7.4 全面软件质量管理
-专家访谈
--专家访谈
-扩展阅读与话题讨论
--外部链接
--话题讨论
-8.1 软件过程综述
--授课视频
-第八章 软件过程改进--8.1 软件过程综述
-8.2 软件过程改进
--授课视频
-第八章 软件过程改进--8.2 软件过程改进
-8.3 能力成熟度模型
--授课视频
-第八章 软件过程改进--8.3 能力成熟度模型
-8.4 过程改进标准框架
--授课视频
-第八章 软件过程改进--8.4 过程改进标准框架
-扩展阅读与话题讨论
--话题讨论
-9.1软件复用综述
--授课视频
-第九章 软件复用--9.1软件复用综述
-9.2 软件构件技术
--授课视频
-第九章 软件复用--9.2 软件构件技术
-9.3 软件复用实施
--授课视频
-第九章 软件复用--9.3 软件复用实施
-9.4 微服务架构
--授课视频
-第九章 软件复用--9.4 微服务架构
-扩展阅读与话题讨论
--微服务扩展
--话题讨论
-文档提交处--文档提交