可复用式编程:
可复用性,指对于编写过一次的软件或程序,可以对其进行重复调用的能力,亦即使用已存在的软件模块执行更新的软件
有两种常用的基于软件可复用性的实现:
1.面向复用编程:开发出可复用的软件
2.基于复用编程:利用已有的可复用软件搭建应用系统
对于不同的应用场景,首先应分析其相似性与差异性,然后对于其中相似/相同的部分,即可采用可复用式的编程,实现一次编写多次利用的效果。
可复用式编程的优劣:
通常来说,可复用式编程有如下优点:
- 降低成本和开发时间:
具有可复用性的程序与软件可以进行重复的调用,节省了每次编写新软件时,进行相似或相同工作的时间,提升了工作效率
- 可靠、稳定
可复用的代码部分由于在大量程序中生效,性能经过充分测试,故可靠性与稳定性均有较高保证
- 标准化
使用可复用的代码能够使复用的代码实现的功能在不同应用中保持一致,加强了程序的标准性
但同时,可复用式编程也有如下缺点
开发可复用的软件:高成本,高适应,性能差,针对性差。
使用已有软件进行开发:往往无法拿来就用,需要适配。
可复用性的评估:
对可复用性的评估,需要考虑其被复用的次数、复用场合的广泛性,以及进行复用的代价。
通常情况下,可复用软件有如下特性:
小、简单、与标准兼容、灵活可变、可扩展、泛型、参数化、模块化、变化的局部性、稳定、丰富的文档和帮助。
可复用层级:最主要的复用是在代码层面,还有其他层面。软件构造过程中的任何实体都可能被复用。(需求,设计,规约,数据,测试用例,文档)
复用类型:
(1) 白盒复用:源代码可见,可修改和扩展。(一般是继承,继承树复杂,程序员不方便)
(2) 黑盒复用:源代码不可见,不能修改。(通过API接口使用,无法修改源代码,一般是调用类,复用效率低)
各层级复用:
代码层级的复用:复制粘贴不推荐。
模块层级的复用:基于类的复用。通过接口将功能提供给用户使用。
类的复用:继承(白盒),委托(黑盒,显式委托常用,隐式委托)
库文件层级的复用:库文件(想选什么库文件就选什么)。
框架层级的复用:框架(主要部分写好,可定制的部分由用户完成)。一组具体类,抽象类及其连接关系。
白盒框架:通过代码层面的继承进行框架扩展。
黑盒框架:通过实现特定接口/委托进行框架扩展。
分析API的好坏。
外部观察可复用性:类型可变(子类型,泛型),功能分组,实现可变(ADT有多种 不同实现),表示独立,共性抽取。
继承与重写:
继承就是子类继承父类
继承要满足行为子类型和 Liskov替换原则
行为子类型: 就是子类继承父类,父类的行为子类一定要实现
在可以使用父类的场景,都可以用子类代替而不会有任何问题
子类型可以增加方法,但不可删
子类型需要实现抽象类型中的所有未实现方法
子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
子类型中重写的方法不能抛出额外的异常
(可静态检测)
继承子类拥有:
更强的不变量
更弱的前置条件
更强的后置条件
(不可静态检测)
List的类型擦除 运行时List内部成员变量类型都是Object
List只能赋值给相同类型List引用,否则编译出错
Liskov Substitution Principle (LSP):
前置条件不能强化
后置条件不能弱化
不变量要保持
子类型方法参数:逆变
父类型->子类型:
越来越具体的specific
返回值类型:不变或变得更具体
子类型方法的返回值:协变
父类型->子类型:
越来越具体specific
返回值类型:不变或变得更具体
异常的类型:不变或变得更具体
重载:
重载,即函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。在Java中同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。这种情况下,该方法就被称为重载,这个过程称为方法重载
参数多态与泛型编程:
因List类型擦除,引出了泛型
List<?> ————这是一个未知类型的列表 <? super A>接收A的父类 <? extends A> 接收A的子类
组合与委托:
将功能实现利用接口抛出去,利用别的类实现具体功能
不同的接口定义不同的功能
通过接口组合完成各种操作实现
将接口作为该类的一个属性,使用接口属性使用功能(委托)
版权归原作者 Plumpy_patty 所有, 如有侵权,请联系我们删除。