Java开发的设计原则-SOLID

本文主要讲述 Java 开发五大设计原则。

什么是 S.O.L.I.D 原则

众所周知,Java 编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计,S.O.L.I.D 是面向对象设计和编程 ( OOD & OOP ) 中几个重要编码原则(Programming Priciple)的首字母缩写。

S: Single responsibility principle [单一职责原则]
O: Open-closed principle [开闭原则]
L: Liskov substitution principle [里氏替换原则]
I: Interface segregation principle [接口隔离原则]
D: Dependency inversion principle [依赖倒置原则]

单一职责原则 [ SRP ]

There should never be more than one reason for a class to change.

引起一个类发生改变的原因有且只有一个。也就是说一个类只做一件事情或者一类事情,每个类的分工是明确的,只负责一个功能。如果出现一个类有多个负责功能,那么就应该考虑将这个类拆分成多个来实现。因为如果把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能影响到另一个功能。

应用:当我们做系统设计时,如果发现有一个类拥有了两种的职责,那就问自己一个问题:可以将这个类分成两个类吗?如果真的有必要,那就分吧。千万不要让一个类干的事情太多!

开闭原则 [ OCP ]

Software entities like classes, modules and functions should be open for extension but closed for modifications.

软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。

(1)通过增加代码来扩展功能,而不是修改已经存在的代码。
(2)若客户模块和服务模块遵循同一个接口来设计,则客户模块可以不关心服务模块的类型,服务模块可以方便扩展服务(代码)。
(3)OCP支持替换的服务,而不用修改客户模块。

简言之,对扩展开放,对修改封闭。换句话说,可以去扩展类,但不要去修改类。

应用:当需求有改动,要修改代码了,此时您要做的是,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能够确保对整体架构不会产生任何影响,那么也没必要搞得那么复杂了,直接改这个类吧。

里氏替换原则 [ LSP ]

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

父类能够替换子类,但子类不一定能替换父类。也就是说,在代码中凡是父类出现的地方,都可以用子类进行替换,并且程序不会报错,也不会在运行时出现任何异常,但反过来却不一定成立。

应用:在继承类时,务必重写(Override)父类中所有的方法,尤其需要注意父类的 protected 方法(它们往往是让您重写的),子类尽量不要暴露自己的 public 方法供外界调用。

该原则由麻省理工学院的 Barbara Liskov 女士提出,她是美国第一位获取计算机博士学位的女性,曾经也获得过计算机图灵奖。

接口隔离原则 [ ISP ]

The dependency of one class to another one should depend on the smallest possible interface.

不要对外暴露没有实际意义的接口。也就是说,接口是给别人调用的,那就不要去为难别人了,尽可能保证接口的实用性吧。她好,我也好。

应用:当需要对外暴露接口时,需要再三斟酌,如果真的没有必要对外提供的,就删了吧。一旦您提供了,就意味着,您将来要多做一件事情,何苦要给自己找事做呢。

依赖倒置原则 [ DIP ]

High level modules should not depends upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

应该面向接口编程,不应该面向实现类编程。面向实现类编程,相当于就是论事,那是正向依赖(正常人思维);面向接口编程,相当于通过事物表象来看本质,那是反向依赖,即依赖倒置(程序员思维)。

应用:并不是说,所有的类都要有一个对应的接口,而是说,如果有接口,那就尽量使用接口来编程吧。

----------本文结束感谢您的阅读----------
xiaolong wechat
一只程序猿对世界的不完全理解