目录
前言
什么是软件复用呢?用我的话说,那就是一次编程,多次使用。通过将在编程中多次使用的功能编写出代码,在以后再次使用该功能时直接使用现成的,就可以实现复用,这样的复用可以大大地简化代码,减少重复,进而大大提高软件开发的效率。当然,这种效率是相对而言的,因为在之后多次复用的方便就意味着在你初次开发该部分代码时将要付出更多的时间和心血。所以,若该部分功能复用次数极多时,该代价是值得的;但是若编写好后之后却很少使用,那显然该代价是不值得的!所以,在开发可复用的软件之前,一定要考虑好该软件的使用频率是怎样的,做好代价评估,避免做无用功。
1.代码重用的类型
1.1白盒复用
在这里我们又用到了黑白盒来形象地定义复用类型,那我们就很自然的能猜到其大体所指的是什么意思了。白盒复用即源代码是可见的,可以进行修改和扩展。在对源码根据我们的需要进行修改后,复制到我们正在开发的软件中。
对于该复用类型来说,其优点就是可以根据我们自身的需要进行修改,但是缺点就是过程相对复杂,需要对源代码进行充分了解。
1.2黑盒复用
黑盒复用自然就是源代码不可见且不能修改扩展的。我们所得到的是程序的接口,通过将接口具体实现,来实现复用。
相对于白盒复用来说,该方法更加简单清晰,我们并不需要直到其内部具体是怎么实现的。但是该方法的适用性较差,无法根据需要对其内部做相应更改。
2.复用的级别
2.1代码级复用
通过复制粘贴代码到我们开发的程序来实现复用。
对于该方法来说,若出错概率较高,尤其是代码相对复杂是,会更有可能存在一些隐患,需要仔细地检查更改。同时,我们需要对源码实现有着具体的了解,以便于根据我们的需要对代码进行更改。
2.2模块级复用
以类为单位进行代码的复用,通过类文件或jar包等来获取所需的复用类。与代码级复用相比其优势是明显的,需要管理的代码边的更少了,出错的概率自然也就更低了。当然,我们需要通过静态链接的方式将所用到的包链接到一起。
2.3库级复用
- 库 将可重用功能的类和方法提供给使用者,使用者通过在程序中调用实现复用。
- 框架 提供一个程序运行的骨架和许多的接口,由用户来编写这些接口的具体实现,来使得框架成功地运行
两者的一个明显的不同在于程序运行的主动权在哪方。库的方法的主动权在于使用者,使用者决定程序运行的方式。而框架的方法主动权在于框架,框架已经规定好了程序要按照怎样的流程步骤来执行,交给开发者做的只是具体实现其各个步骤。
2.4系统级复用
框架可看做是更大规模的API复用,它在提供了复用的API的同时,也将模块间的关系确定了下来。
框架有两种类型,白盒框架和黑盒框架。再次提到黑盒与白盒,不做过多的赘述。简单提一下两者扩展方式的不同。
- 白盒框架 通过代码层面的继承进行框架的扩展
- 黑盒框架 通过实现特定接口来进行框架的扩展
3.LSP替换原则
子类型替换父类型时,要比父类型有着更强的规约,更强的约束条件,具体有以下几点:
- 方法可增加但不可减少
- 方法参数相同或为父类,逆变
- 方法返回值相同或为子类,协变
- 子类型要实现父类型所有未实现的方法
- 不能抛出额外的异常,协变
- 后置条件不能更弱
- 前置条件不能更强
- 不变量要保持
此外,由于对于Java来说,重写不支持参数逆变,若参数改变则被视为重载,所以要重写则参数类型不可进行改变。