- 贯穿设计模式:用一个电商项目详解设计模式
- 伟山育琪
- 1146字
- 2024-12-28 11:44:54
1.2 设计模式的原则
1.2.1 单一职责原则
引用百度词条对单一职责原则的定义:“单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则是Robert C. Martin于《敏捷软件开发:原则、模式与实践》一书中给出的。Martin表示此原则是基于Tom DeMarco和Meilir Page-Jones的著作中的内聚性原则发展出的。”
单一职责原则,强调的是职责的分离,一个类,只需要负责一种职责即可,一个类发生变化的原因,必然是所负责的职责发生变化。这听起来很抽象,干涩的文字描述可能会让经验稍浅的读者产生一定的困惑,可实际上,从我们接触代码的那一刻起,已经时时刻刻地在遵守单一职责原则。
· main函数所在的类,作为程序的启动入口,职责单一。
· SpringBoot框架的启动类是单一职责原则最完美的写照。
· 我们创建的utils工具类,对日期的处理一般会封装到一个DateUtils.java中,职责单一。即便我们将所有的工具类方法封装到一个统一的CommonUtils.java中,也依然遵循了单一职责原则,因为它的职责就是工具。
· 大家众所周知的MVC框架,提倡将接入层Controller、服务层Service、持久层DAO分别进行实现,划分不同的职责,也遵循了单一职责原则。
……
单一职责原则,是一个备受争议的原则,也是设计模式最为基础的原则。备受争议的原因是,每个人对职责划分的看法不一样,不同项目需求所面临的挑战和划分方式不一样。我们以一个简单的“用户注册和用户登录”需求为例,展开一场讨论,相信这个需求对读者来说是非常简单的,很快就能书写以下代码。
这是一个非常完美的设计,UserService类完全遵循了单一职责原则,不管是register注册功能还是login登录功能,都属于“用户操作”的相关职责,简单的注册和登录功能,用粗粒度的“用户操作”职责进行了正确的划分。
然而,如果登录功能需要满足多种第三方账号授权登录,注册功能需要进行短信、邮箱等动态码验证,金融相关软件还需要进行身份证验证和人脸识别等一系列附加功能,我们可能就要考虑将登录功能和注册功能以更加细粒度的职责进行划分。
(1)登录功能单独划分,提供默认登录方式(拥有本站账号的用户)和第三方账号的验证及登录功能。
(2)注册功能单独划分,分为注册功能以及注册过程中所需要的相关验证功能如下。
这样的设计也是非常正确的,随着业务的复杂程度越来越高,每一个细粒度的职责都可能拥有非常复杂的逻辑,那么我们就要考虑是否可以按照项目需求进行更加细粒度的职责拆分,从而保证单一职责原则下的低耦合度。当然,部分读者会认为,是否可以将“手机验证功能”和“邮箱验证功能”再次进行单一职责的划分?当然可以,但是要避免过度的职责拆分,要根据项目需求的复杂程度进行合理的规划。
最后,我想对广大读者说的是,单一职责原则的划分没有正确与错误之分,每个开发者都有自己的考量角度和划分方式。一切都应该以项目实际情况为出发点进行设计,因地制宜才是我们真正需要遵守的原则。