什么是软件复用?
如何衡量“可复用性”?
可复用组件的级别和形态java
对可复用性的外部观察程序员
总结算法
软件复用编程
软件复用是使用现有软件组件实施或更新软件系统的过程。设计模式
软件复用的两个观点数据结构
为何复用?架构
为何复用?框架
重复使用具备成本效益,而且具备及时性下降成本和开发时间数据结构和算法
通过充分测试,可靠,稳定,生成可靠的软件模块化
重复使用标准化,在不一样应用中保持一致
重复使用成本
可复用组件的设计和构建应该采用明确,开放的方式,具备简洁的接口规范,易于理解的文档以及面向将来的使用。作到这些,须要代价。
复用成本很高:涉及跨越组织,技术和流程变动,以及支持这些变动的工具成本,以及培训人员使用新工具和变动的成本。 不只面向复用编程代价高,基于复用编程代价也高
面向复用开发:开发可复用的软件
可复用组件的开发成本高于特定等价物的成本。 这种额外的可复用性加强成本应该是一个组织而不是项目成本。 开发成本高于通常软件的成本:要有足够高的适应性
通用组件的空间效率可能较低,执行时间可能长于其特定的等效项。 性能差些:针对更普通场景,缺乏足够的针对性。
基于复用开发:使用已有软件进行开发
必须开发和维护用于体系结构,设计,文档和代码的组件管理工具,例如存储库。可复用软件库,对其进行有效的管理
一个关键问题:适应每每没法拿来就用,须要适配
衡量可复用性
软件资产在不一样应用场景中的重复使用频率如何?
为重复使用此资产需支付多少费用?
可复用性
可复用性意味着对构建,打包,分发,安装,配置,部署,维护和升级问题进行一些明确的管理。
具备高可复用性的软件资产应该:
复用水平
可复用组件多是代码
可是,从更普遍和更高层次上看待能够重复使用的观点带来的好处。
咱们在这节课中关注的是什么
源代码级别:方法,语句等
模块级别:类和接口
库级别:API
架构级别:框架框架
代码复用的类型
白盒复用:源代码可见,可修改和扩展
黑盒复用:源代码不可见,不能修改
可复用组件分布的格式
形式:
可复用软件组件的来源:
(1)源代码复用
复用代码 - 最低级别
将部分/所有复制/粘贴到您的程序中
维护问题
过程当中出现错误的风险很高
可能须要知道如何使用的软件工做
须要访问源代码
(2)模块级复用:类/接口
复用类
类是代码复用的原子单元
文档很是重要(Java API)
封装有助于复用
代码管理较少
版本控制,向后兼容性仍然存在问题
须要一块儿打包相关的类 - 静态连接
复用类的方法:继承
Java提供了一种名为Inheritance的代码复用方法
不须要放置仅仅转发或委托工做的虚拟方法
更好地捕捉现实世界
一般须要在实现以前设计继承层次结构
没法取消属性或方法,所以必定要当心,不要过度
复用类的方法:委托
委托只是当一个对象依赖另外一个对象来实现其功能的某个子集时(一个实体将某个事物传递给另外一个实体)
审慎的委托支持代码复用
显式委托:将发送对象传递给接收对象
隐式委托:由语言的成员查找规则
委托能够被描述为在实体之间共享代码和数据的低级机制。
(3)库级复用:API /包
库:一组提供可复用功能的类和方法(API)
框架:能够定制到应用程序中的可重复使用的框架代码
框架调用回客户端代码
通常区别:库与框架
框架做为主程序加执行,执行过程当中调用开发者所写的程序
开发者构造可运行软件实体,其中涉及到对可复用库的调用
(4)系统级复用:框架
应用程序框架
框架是子系统设计,包含一系列抽象和具体类以及每一个类之间的接口
框架:一组具体类,抽象类,及其之间的链接关系 - 只有“骨架”,没有“血肉”
框架是一种抽象,其中提供通用功能的软件能够经过额外的用户编写的代码进行选择性更改,从而提供特定于应用程序的软件。 开发者根据框架的规约,填充本身的代码进去,造成完整系统
可复用性利用了应用领域知识和经验丰富的开发人员的先前努力
框架:领域复用
系统经过添加组件来填充缺失的设计元素并实例化抽象类来实现
控制反转(Inverse of Control)
由第三方的容器来控制对象之间的依赖关系,而非传统实现中由代码直接操控。
控制权由代码中转到了外部容器,带来的好处就是下降了对象之间的依赖程度,提升灵活性和可维护性。
框架设计
框架与应用程序不一样
框架能够用扩展它们的技术来分类。
白盒和黑盒框架
白盒框架:
黑盒框架
类库与框架
类库:
框架:
在实践中,开发人员常用两种:
组件与框架
组件
•优势是应用程序不必定须要在组件更改时从新编译。
构架:
对可复用性的外部观察
类型可变
功能分组
实现可变
表示独立
共性抽取
类型可变
可复用组件应该是类型参数化的,以便它们能够适应不一样的数据类型(输入,计算和输出);
换句话说,咱们须要一个用于描述类型参数化模块的工具,这个模块也被称为通用模块。
通用性:可复用组件应该是通用的。
类型可变(泛型):适应不一样的类型,且知足LSP
实现可变
在实践中有不少种适用的数据结构和算法。
咱们不能指望单个模块可以处理全部可能性,这种变化确实是这样; 这将是巨大的。
咱们须要一系列模块来涵盖全部不一样的实现。
实现可变:ADT有多种不一样的实现,提供不一样的表示和抽象功能,但具备一样的规范(前置条件,后置条件,不变式),从而能够适应不一样的应用场景
功能分组
一个自给自足的可复用模块须要包含一组功能,每一个操做一个功能。
完整性
提供完备的细粒度操做,保证功能的完整性,不一样场景下复用不一样的操做(及其组合)
表示独立性
可复用模块的通常形式应该使客户可以指定一个操做而不知道它是如何实现的。
表示独立性是信息隐藏规则的延伸,对于大型系统的顺利开发相当重要:实施决策常常会改变,客户应该受到保护。 内部实现可能会常常变化,但客户端不该受到影响。
表示独立反映了客户对可复用性的见解 - 忽略内部实现细节和变体的能力
表示独立性,信息隐藏
共性抽取
分解共同行为,反映了供应商的观点,更通常地反映了可复用类的开发者的观点。
目标是利用家庭或实施子系列中可能存在的任何通用性。
将共同的行为(共性)抽象出来,造成可复用实体
如上所述,在某些问题领域可用的各类实现一般须要基于模块族的解决方案。
这些类别中的每个都涵盖了许多变体,但一般能够在这些变体之间找到显着的共性。
什么是软件复用?
如何衡量“可复用性”?
可复用组件的级别和形态
对可复用性的外部观察