面向对象的六大原则
1:优化代码的第一步——单一职责原则(Single Responsibility Principle)SRP
简单来说,
一个类中应该是一组相关性很高的函数、数据的封装。
2:让程序更稳当、更灵活——开闭原则(Open Close Principle)OCP
软件中的对象(类、模块、函数等
)应该对于扩展是开放的,但是,对于修改是封闭的。
3:构建扩展性更好的系统——里氏替换原则(Liskov Substitution Principle)LSP
所有引用基类的地方必须能透明地使用其子类的对象。
面向对象的语言的三大特点:继承、封装、多态,里氏替换原则就是依赖于继承和多态。
通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误和异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。其实最终总结就两个字:抽象。
里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特性。
开闭原则和里氏替换原则往往是生死相依、不离不弃的,通过里氏替换来达到对扩展开放,对修改关闭的效果。然而,这两个原则都同时强调了一个OOP的重要特性——抽象,因此,在开发过程中国运用抽象是走向代码优化的重要一步。
4:让项目拥有变化的能力——依赖倒置原则(Dependence Inversion Principle)DIP
依赖倒置(依赖反转)原则有以下几个关键点:
(1)高层模块不应该依赖低层模块,两者都应该依赖其抽象;
(2)抽象不应该依赖细节;
(3)细节应该依赖抽象。
在Java语言中,
抽象就是指
接口或者抽象类,两者都是
不能直接被实例化的;
细节就是
实现类,
实现接口或者继续抽象类而产生的类就是细节,其特点就是,可以直接被实例化,也就是可以加上一个New产生一个对象。
高层模块就是调用端,
低层模块就是具体实现类。
依赖倒置原则在Java语言中的表现是:
模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。其实就是面向抽象编程,这里的抽象是指接口或抽象类。
一句话:依赖抽象 ,不依赖具体实现。
5:系统有更高的灵活性——接口隔离原则(Interface Segregation Principle)ISP
定义是:类间的依赖关系应该建立在最小的接口上。用最小化接口隔离实现类的细节。
目的是:系统解开耦合,从而容易重构、更改和重新部署。
6:更好的可扩展性——迪米特原则(Law of Demeter)LOD,也称最少知识原则(Least Knowledge Principle)
定义是:
一个对象应该对其他对象有最少的了解。
通俗地讲:一个类应该对自己需要耦合或调用的类知道得最少,类的内部如何实现与调用者或者依赖者没关系,调用者或者依赖者只需要知道它需要的方法即可,其他的一概不用管。