30 . (Java)面向对象编程六大基本原则

六大基本原则可分为:SOLID和迪米特原则

1.单一职责原则S——优化代码的第一步

Single Responsibility Principle,简称SRP

定义:一个类只负责一项职责。

好处:降低类的复杂度,一个类只负责一个职责,其逻辑一定会比一个类负责多项职责要简单,同时也易于维护,提高类的可读性,提高系统的可维护性。如果单一职责原则遵守的好,那么当修改一个功能时可以显著降低对其它功能的影响。

note: 虽说我们要遵守单一职责原则,但是也不是说死板的对每一个细节都严格遵守,也要视情况而定:如果一个类的逻辑非常简单且可以保证变化极小,此时可以在代码级别上违反单一职责原则;另外当一个类中方法很少时,也可以在方法的级别上违反这一原则。(这里我这么理解单一职责原则:分为两个层次,最高层次是类的层次,其次是方法层次上)但是如果一个类相对庞大,类中方法较多时,一定要遵守单一职责原则;宁愿在第一次扩展时花费精力完成重构,也要遵守这一原则,否则会给以后的扩展带来不可预估的灾难!

2.开闭原则O——让程序更稳定、更灵活

Open Close Principle,简称OCP 
定义:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的

在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

3.里氏替换原则L——构建扩展性更好的系统

Liskov Substitution Principle,简称LSP
定义:所有引用基类的地方必须能透明地使用其子类的对象

里氏替换原则的严格表达是:如果对每一个类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。

比如:假设有两个类,一个是Base类,另一个是Derived类,并且Derived类是Base类的子类。那么一个方法如果可以接收一个基类对象b的话:method1(Base b),那么它必然可以接受一个子类对象b,也即可以有method1(d).

4.接口隔离原则I——系统有更高的灵活性

InterfaceSegregation Principles,简称ISP
定义:类间的依赖关系应该建立在最小的接口上

使用多个专门的接口比使用单一的总接口要好。

一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。

5.依赖倒置原则D——让项目拥有变化的能力

Dependence Inversion Principle,简称DIP
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

6.迪米特原则——更好的可扩展性

Law of Demeter,简称LOD
定义:一个对象应该对其他对象有最少的了解

广义的迪米特法则在类的设计上的体现:
优先考虑将一个类设置成不变类。
尽量降低一个类的访问权限。
谨慎使用Serializable。
尽量降低成员的访问权限。
 
 
 
暂时介绍一些基本的概念,具体这些原则也会体现在我们的设计模式中。后面边学习边更新这边文章举例。
 
 
 

参考文献:

《Java与模式》

https://blog.csdn.net/qq_26440221/article/details/53746433

https://blog.csdn.net/niudasheng/article/details/80595217

原文地址:https://www.cnblogs.com/Hermioner/p/10211477.html