- 封装变化
- 针对接口编程,而不是针对实现编程
- 多用组合,少用继承
- 为了交互对象之间的松耦合设计而努力
- 类应该对扩展开放,对修改关闭
- 要依赖抽象,不要依赖具体类
- 最小知识原则
- 好莱坞原则
- 应尽量让每个类保持单一责任
封装变化
找出应用中可能需要变化之处,把它们独立出来(并封装起来),不要和那些不要变化的代码混在一起。
如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分
针对接口编程,而不是针对实现编程
以前的做法是:行为来自超类的具体实现,或是继承某个接口并由子类自行实现而来。这两种做法都是依赖于“实现”,我们被实现绑得死死的,没办法更改行为(除非写更多代码)。
“针对接口编程”真正的意思是“针对超类型(supertype)编程”,货可以更明确地说成“变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口”。
多用组合,少用继承
良好的OO设计必须具备可复用、可扩充、可维护三个特性。大多数的模式都允许系统局部改变独立于其他部分
为了交互对象之间的松耦合设计而努力
类应该对扩展开放,对修改关闭
要依赖抽象,不要依赖具体类
依赖倒置原则(Dependency Inversion Principle):不能让高层组件依赖低层组件,而且,不管高层或低层组件,两者都应该依赖于抽象。所谓高层组件,是由其他低层组件定义其行为的类。
一下指导方针能帮助避免在OO设计中违反依赖倒置原则:
- 变量不可以持有具体类的引用
- 不要让类派生自具体类
- 不要覆盖基类中已实现的方法(如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象。基类中已实现的方法,应该由所有的子类共享)
最小知识原则
减少对象之间的交互,不要让太多的类耦合在一起。
指导方针:就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:
- 该对象本身
- 被当做方法的参数而传进来的对象
- 此方法所创建或实例化的任何对象
- 对象的任何组件(Has-A)
注意,如果某对象是调用其他方法的返回结果,不要调用该对象的方法!
好莱坞原则
别调用(打电话给)我们,我们会调用(打电话给)你(将决策权放在高层模块中)。
例如模板方法模式中,低层组件绝对不可以直接调用高层组件。
应尽量让每个类保持单一责任
因为一个类应该只有一个引起变化的原因。类的每个责任都有改变的潜在区域,超过一个责任,意味着超过一个改变的区域。如果一个类具有两个改变的原则,那么这会使得将来该类变化的几率上升;而当它真的改变时,你的设计中同时有两个方面将受到影响。
术语:
- 内聚(cohesion):用来度量一个类或模块紧密地达到单一目的或责任
- 高内聚:一个模块/类被设计成只支持一组相关功能