1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。
遵循单一职责原的优点有:
a.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
b.提高类的可读性,提高系统的可维护性;
c.如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
2. 开放封闭原则(ASD):软件实体(类、模块、函数等等等)应该是可以拓展的,但是不可修改。
开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。这个原则有两个特性,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在了。
3. 里氏替换原则(LSP):子类型必须能够替换掉它们的父类。
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化
里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
里氏替换原则主要发力点是继承基础上的抽象和多态,具体就是子类必须实现父类的方法,是重写;这里要注意重写(Override)与重载(Overload)的区分。
在此重温【重写与重载】
方法的重载,就是同样的一个方法能够根据输入数据的不同,做出不同的处理——有不同的参数列表,甚至不同的返回值(静态多态性)
方法的在重写,是子类继承自父类的相同方法,输入参数一样,但要做出有别于父类的操作,要覆盖父类方法。——相同参数,相同返回值,不同实现(动态多态性)
定义:高层模块不应该依赖低层模块,两个都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
依赖倒转其实就是谁也不要依靠谁,除了约定的接口,大家都可以灵活自如。依赖倒转可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。如果设计的各个部件或类相互依赖,这样就是耦合度高,难以维护和扩展,这也就体现不出面向对象的好处了。
5. 迪米特原则(LOD):一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则又叫最少知道原则也称为最少知识原则。如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。
米特法则其根本思想,是强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成影响,也就是说,信息的隐藏促进了软件的复用。
6. 接口隔离原则(ISP)
接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
采用接口隔离原则对接口进行约束时,要注意以下几点:
a.接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。b.依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
c.提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
学会这几大原则可以有效地的提高系统的复用性,维护性,扩展性。让我们做出的系统更简洁、更高效。这部分知识还需要我们在日后实践中不断加强学习。