这些原则都是从《大话设计模式》里面整理出来的,现只把里面概念性的东西提取出来,说明的例子就不写了(因为用以理解并不是很贴切),这些原则都不是很容易理解,可以多查阅相关资料。
这些原则的使用一般都是为了软件的代码复用性,可扩展性,可维护性。
1. 单一职责原则:就一个类而言,应该只有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化,这种设计会遭到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离。如果你能想到多于一个动机去改变一个类,那么这个类就有多于一个的职责。
2. 开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展,但不能修改。对于扩展是开放的(Open for extension),对于修改是关闭的(Closed for modification)。怎样的设计才能面对需求的改变却能保持相对稳定,从而使得系统可以在第一个版本之后不断推出新版本呢?无论模块多么“封闭”,都会存在一些无法对之封闭的变化。既然不能完全封闭,设计人员应该对于他设计的模块应该对那种变化进行封闭做出选择。他必须猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。也许事先不能猜测到那些地方会经常变化,但是变化发生时要立即采取行动,查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,对于程序中每个部分都刻意进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。(http://baike.baidu.com/view/2493421.htm百科的介绍,可以好好看看)
3. 依赖倒转原则:原话解释是抽象不应该依赖细节,细节应该依赖于抽象,高层模块不应该依赖底层模块,两个都应该依赖抽象。说白了就是针对接口编程,不要针对实现编程(无论主板,CPU,内存,硬盘都是在针对接口设计的,如果针对实现来设计,内存就要对应到具体的某个品牌的主板,那就会出现换内存需要把主板也换了的尴尬)。依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之就是面向过程设计的了。
4. 里氏代换原则:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它观察不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化,简单来讲,子类型必须能够替换掉它们的父类型。只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础行增加新的行为。正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。
5. 迪米特法则(最小知识原则):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。迪米特法则其根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。(里面举的取电脑的例子挺有说明性,小菜到公司领电脑,找到一个人,他推给另一个人,另一个又推给另一个人。。。小菜如果是一个类的话,那么他找的第一个人就是他直接打交道的类,而这个人推给了其他人相当于这个类有改动,此时任务就无法完成,系统的设计要做大的改动。而依照迪米特法则,那么应该新建一个专门负责管理电脑的部门,小菜直接与这个部门打招呼,这个部门进行统筹安排。以类的概念讲就是新建一个管理类,小菜类直接与这个类通信,这样即便其他类有改动,也不会造成大的波及)。