在软件开发的世界里,随着项目规模的扩大和复杂度的增加,保持代码的清晰和可维护性变得尤为重要。而单一职责原则正是我们手中的一把利剑,帮助我们构建更加健壮、灵活的系统。
一、什么是单一职责原则?
单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的基本原则之一,它指出:一个类应该仅有一个引起它变化的原因。换句话说,一个类应该负责一项职责,并且这个职责应该被完整地封装在类内。当职责过多时,类之间的耦合度会增加,一旦某个职责发生变化,就可能会影响到其他职责的实现,从而增加修改和维护的难度。
二、为什么需要单一职责原则?
- 提高代码的可读性:每个类职责单一,使得代码更容易被理解和阅读。
- 增强代码的可维护性:当需要修改或扩展某个功能时,只需关注与该功能相关的类,减少了出错的可能性。
- 促进代码的重用:职责单一的类更有可能被其他系统或模块重用。
- 降低耦合度:减少了类之间的依赖关系,使得系统更加灵活,易于扩展和测试。
三、如何应用单一职责原则?
- 识别职责:首先,我们需要仔细分析类的功能,识别出它承担的所有职责。
- 评估职责:然后,评估这些职责之间是否存在紧密的联系。如果某个职责与其他职责相对独立,或者其变化频率与其他职责不同,那么它可能就是一个需要被分离出来的职责。
- 重构代码:将识别出的独立职责分配给新的类,并在旧类和新类之间建立合理的接口或依赖关系。
四、反向示例及后果
示例:多职责的UserManager
类
假设我们有一个UserManager
类,它原本只负责用户信息的增删改查操作。但随着时间的推移,为了满足业务需求,这个类被不断扩展,增加了用户认证、权限检查、发送邮件通知等多种功能。
class UserManager {
// 用户信息管理
void addUser(User user) { ... }
void updateUser(User user) { ... }
User getUserById(int id) { ... }
// 用户认证
boolean authenticateUser(String username, String password) { ... }
// 权限检查
boolean checkPermission(User user, String permission) { ... }
// 发送邮件通知
void sendEmailNotification(User user, String subject, String body) { ... }
}
后果
- 代码难以理解与维护:由于
UserManager
类包含了多种不相关的职责,其他开发者在阅读或修改代码时可能会感到困惑,难以快速定位问题。 - 高耦合度:不同的职责之间可能存在紧密的联系,一旦某个职责的实现发生变化,就可能影响到其他职责。
- 难以复用:由于功能混杂,
UserManager
类很难被其他系统或模块重用。 - 扩展性差:当需要添加新的用户相关功能时,由于类的职责已经过多,可能不得不继续在这个类中增加方法,导致类变得更加庞大和复杂。譬如邮件发送,如果需要包含抄送人怎么办?如果按用户组发送怎么办?等等。
五、如何避免反向示例中的后果?
遵循单一职责原则,将UserManager
类拆分为多个职责单一的类,如UserRepository
(负责用户信息的增删改查)、UserAuthenticator
(负责用户认证)、PermissionChecker
(负责权限检查)和EmailService
(负责发送邮件通知)等。
/**
* 负责用户信息的增删改查
*/
public class UserRepository {
/**
* 添加用户
* @param user
*/
void addUser(User user) {
// do something
}
/**
* 编辑用户
* @param user
*/
void updateUser(User user) {
// do something
}
/**
* 根据id获取用户信息
* @param id
* @return
*/
User getUserById(int id) {
// do something
return new User();
}
}
/**
* 负责用户认证
*/
public class UserAuthenticator {
/**
* 用户认证
* @param username
* @param password
* @return
*/
boolean authenticateUser(String username, String password) {
// do something
return true;
}
}
/**
* 负责权限检查
*/
public class PermissionChecker {
/**
* 权限检查
* @param user
* @param permission
* @return
*/
boolean checkPermission(User user, String permission) {
// do something
return true;
}
}
/**
* 负责发送邮件通知
*/
public class EmailService {
/**
* 发送邮件通知
* @param user
* @param subject
* @param body
*/
void sendEmailNotification(User user, String subject, String body) {
// do something
}
}
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="Ew9pnusZ-1728785445491" src="https://live.csdn.net/v/embed/429031"></iframe>
「撸一手好代码」设计模式之单一职责原则
标签:职责,一手,user,用户,param,User,设计模式,String From: https://blog.csdn.net/lk13962517093/article/details/142894446