目录
1 概念
通过缩短软件生产周期来提高软件生产力(软件开发速度更快,用人更少)。不浪费资源,不必要地 "重新发明轮子"。降低维护成本(可以生产质量更好、更可靠、更高效的软件)。复用已经存在一段时间并经过调试的功能是建立稳定子系统上的基础。
降低成本和开发时间;经过充分测试,可靠、稳定;标准化,在不同应用中保持一致。
可重复使用的组件应该以明确定义的、开放的方式进行设计和构建,有简洁的接口规范、可理解的文档,并着眼于未来的使用。开发成本高于一般软件的成本:要有足够高的适应性。性能差些:针对更普适场景,缺少足够的针对性。
2 种类
白盒复用:源代码可见,可修改和扩展。复制已有代码到正在开发的系统,进行修改。可定制化程度高。对其修改增加了软件的复杂度,且需要对其内部充分的了解。
黑盒复用:源代码不可见,不能修改。只能通过API接口来使用,无法修改代码。简单,清晰。适应性差些。
3 发布形式
组织的内部代码库(Guava)
第三方提供的库(Apache)
语言自身提供的库(JDK)
代码示例
来自同事
已有系统内的代码
开源软件的代码
4 复用的层次
4.1 源代码复用
复制/粘贴 部分/全部 到你的程序中。在多种情况下需要修改代码。过程中出现错误的风险很高。可能需要了解所使用的软件的工作原理。需要能接触到源代码才能复用代码。
4.2 模块级复用:类/接口
类是代码复用的一个基本单元。不需要源代码,只需要类文件或jar/zip。只需要在classpath中包含即可。可以使用javap工具来获得一个类的公共方法头文件。管理的代码更少,版本管理、向后兼容仍是问题,需要将相关的类打包在一起 -- 静态链接。
复用一个类的方法:继承。Java提供了一种名为 "继承 "的代码重用方式。类扩展了现有类的属性/行为。此外,他们可能会重写现有的行为。
复用一个类的方法:委托。委派只是一个对象依赖另一个对象来实现其功能的某个子集。例如,Sorter的功能被委托给一些Comparator。明确委托:将发送对象传递给接收对象。隐性委托:通过利用语言的成员查询规则。委托可以被描述为实体之间共享代码和数据的低级机制。
4.3 库层面复用:API/Package
库:一组提供可重复使用功能的类和方法(API)。框架:可重复使用的骨架代码,可以定制成一个应用程序。框架调用回到客户端代码中。好莱坞原则:"不要给我们打电话。我们会给你打电话。"
4.4 系统级的复用:框架
4.4.1 概述
框架:一组具体类、抽象类、及其之间的连接关系。框架是一种抽象,其中提供通用功能的软件可以通过额外的用户编写的代码有选择地改变,从而提供特定应用的软件。Framework作为主程序加以执行,执行过程中调用开发者所写的程序。开发者根据Framework预留的接口所写的程序。
4.4.2 框架与库的区别
开发者构造可运行软件实体,其中涉及到对可复用库的调用。
Framework作为主程序加以执行,执行过程中调用开发者所写的程序。
4.4.3 白盒框架与黑盒框架
白盒框架,通过代码层面的继承进行框架扩展。通过继承和动态绑定实现可扩展性。通过子类化框架基类和重写预定义的钩子方法来扩展现有的功能。通常设计模式,如模板方法模式,被用来覆盖钩子方法。
黑盒框架,通过实现特定接口/delegation进行框架扩展。通过为可以插入框架的组件定义接口来实现可扩展性。通过定义符合特定接口的组件来复用现有的功能。这些组件通过授权与框架整合。