文章目录
面向可理解性的构造
代码的可理解性
如何编写易于理解的代码
遵循命名规范
限制代码行的最大长度,文件的最大LOC
足够的注释
代码有好的布局:缩进,空行,对齐,分块等。
避免多层嵌套,增加复杂度
可复用性编程
什么是软件复用
软件复用是使用现有软件组件实施或更新软件系统的过程
软件复用的两个观点
1.面向复用编程:开发出可复用的软件
2.基于复用编程:利用已有的可复用软件搭建应用系统
复用的好处
1.降低成本和开发时间
2.复用的代码经过测试,可靠,稳定。
3.产出标准化,在不同应用中保持一致。
复用的类型
白盒复用:源代码可见,可修改和拓展
黑盒复用:源代码不可见,不能修改
可复用实现的级别
源代码级别的复用
模块级别的复用:类,抽象类,接口
复用类:
源码并非是必要的,可能只需要类文件或jar
只需要将这个类加入到类路径
可以使用工具javap获得一个类的public方法
复用的方法:继承和委托
继承:
1.类扩展了现有类的属性和行为
2.可能会Override现有的行为
3.通常需要在实施之前设计继承层次结构
委托:
委托是简单的将一个对象连接到另一个对象上,使另一个对象获得这个对象方法的子集
如下图所示就是委托
库级别的复用:
方法:library,framework
library:
库定义:一组提供可复用功能的类和方法
framework:
框架定义:一组具体类,抽象类及其之间的连接关系
作为主程序加以执行,执行过程中调用开发者所写的程序。
对可复用性的外部观察
Type Variation 类型可变:
1.能够复用的部分应该类型参数化,以适应不同的数据类型
2.复用的部分应该一般化
3.适用不同的类型,且满足LSP
Implementation Variation 实现可变:
ADT 有多种不同的实现,提供不同的representation和abstract function,但具有同样的specification,从而可以适用不同的应用场景
功能分组:
提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作
RI:
内部实现可能会经常变化,但客户端不应受到影响。
Factoring Out Common Behaviors:
将共同的行为抽象出来,形成可复用实体。
白盒框架和黑盒框架
白盒框架:
1.通过继承和动态绑定实现可扩展性
2.通过继承框架基类并重写预定义的hook方法来扩展现有功能。
3.通常使用模板方法模式等设计模式,来覆盖hook方法。
黑盒框架:
1.通过为可插入框架的组件定义接口来实现可扩展性
2.通过定义符合特定接口的组件来复用现有功能。
3.这些组件可通过委派与框架集成。
设计可复用的软件
设计可复用的类–LSP
行为子结构
子类型多态:客户端可用统一的方式处理不同类型的对象
Animal a = new Animal();
Animal c1 = new Cat();
Cat c2 = new Cat();
在使用a的场景都可以用c1,c2不会有什么问题
在java的静态类型检查中,编译器强调了一些规则:
1. 子类型可以增加方法但不可以删
2. 子类型需要实现抽象类型中的所有未实现方法
3. 子类型中重写的方法必须有相同或子类型的返回值
4. 子类型中重写的方法必须使用同样类型的参数。
5. 子类型重写的方法不能抛出额外的异常
复合继承原则
定义:类应当通过它们之间的组合达到多态表现和代码复用,而不仅仅是从基础类或父类继承。
委派的类型
1.临时性委派:调用类里的方法,而不将其作为属性。
2.永久性委派:类中有其他类的实例来作为一个变量。
3.更强的委派:组合,将一些简单的对象组合成为一个更大的对象。