原则是指基本事实或主张,是信仰体系,行为准则或推理的基础。
提起面向对象设计(OOD)的设计原则,大家立刻就能想到最基本的5大设计原则。我们首先看一下最基本的5大设计原则。
1)单一职责原则
类的每个关注点都是一个变化轴。一个类最好只有一个关注点,只有一个能导致它发生变化的原因。
2)开闭原则(OCP)
类的设计应该对扩展开放,对修改封闭。对于新的需求,能够在不影响其他代码的情况下进行扩展;只有在修改bug的情况下对原有代码进行修改。(我的理解是:在对原有代码进行修改的时候,不能对其他代码造成影响。)开闭原则的核心思想就是要针对接口编程,而不是针对具体类编程。
3)依赖倒转原则(DIP)
人正常的思维过程是从具体的对象中提取出抽象,也就是说抽象是依赖于具体对象的。这个原则的核心就是要倒转这个依赖关系,使具体要依赖于抽象。高层模块不应该依赖于底层模块,两者要同时依赖于抽象。
4)接口隔离原则(ISP)
接口应该是内聚的,不要创建一个大而全的接口,而是要使用多个小而专的接口。不能强迫客户依赖他使用不到的方法。
5)里氏代换原则(LSP)
必须能够通过父类接口使用子类,而客户并不知道这种差别。代码中所有使用父类的地方,都可以用子类代替。子类型至少提供父类型承诺的行为。
在5大设计原则之外,还有一个重要的设计原则——迪米特法则。迪米特法则也被人们称为第6大设计原则。
6)迪米特法则
又被称作最少知道原则。一个对象应该对被依赖的对象保持最少的了解,只和直接朋友进行通信。
除了上面的6大设计原则之外,我们在面向对象的设计过程中,也会自觉或不自觉的用到下面的这些设计原则。
7)抽象原则
通过精简和概括来简化实体。精简指删除不必要的部分,概括指找出并定义重要的通用特性。
8)封装原则
封装原则提倡一种信息隐藏方式,通过隐藏抽象的实现细节和隐藏可能发生的变化两种形式,来实现关注点分离和信息隐藏。封装原则又可以划分为信息隐藏原则和变化封装原则。
9)模块化原则
倡导通过集中(数据和操作集中在一个对象中)和分解(将大的抽象分解成规模适中的抽象)等方法创建高内聚和低耦合的抽象。
10)层次结构原则
倡导通过使用分类,归并(抽出子类中的共性),替换(遵循LSP原则),排序等手法以层次方式组织抽象。
11)非循环依赖原则(ADP)
该原则指出,包之间的依赖关系不能存在循环。同样,类之间的依赖也不能存在循环。
12)不自我复制原则(DRY)
该原则指出,对于每一个知识点,系统中只能有一个明确而权威的表示。在面向对象的设计中,重复可能表现为类名重复和代码实现重复。
13)保持简单原则(KISS)
简洁是软件设计的重要目标,避免引入不必要的复杂。保持软件设计简单的方式有两种:一种是让它简单到没有缺陷,另外一种是复杂到没有显而易见的缺陷。
14) 合成聚合原则(CAPP)
对象之间如果存在依赖关系的话,尽量使用合成/聚合,而不要使用继承来表达这种依赖关系。因为使用继承会导致对象之间的强耦合。