SOLID:单一职责原则及示例
在本文中,您将了解以下内容:
- 什么是 SRP?
- SRP在软件开发中的重要性
- 优势
- 弱点
- Twitter 注册
什么是 SRP?
单一职责原则 (SRP) 是指导软件开发的五个 SOLID 设计原则之一。
定义:一个类或模块应该只有一个改变的原因。
该原则指出,一个类应该只有一个更改原因和一项职责。该原则旨在促进模块化,并帮助开发人员创建更易于理解、修改和维护的代码。
本质上,SRP 指出每个类都应该具有单一、明确定义的职责,并且该职责应该封装在该类中。
这意味着一个类不应该承担多重职责,因为这会使它更难理解和修改。遵循 SRP,开发人员可以创建更易于维护、更灵活的代码,并且随着时间的推移更容易使用。
SRP 是面向对象编程的基本原则,它可以显著影响软件开发的质量和效率。我们将更详细地探讨 SRP,包括它的工作原理、重要性以及如何在 Java 编程中有效地应用它。
SRP在软件开发中的重要性
SRP 在软件开发中很重要的原因有以下几个:
- 增强代码可读性:当每个类或模块都具有单一职责时,代码的阅读和理解会变得更加容易。这有助于开发人员快速理解类或模块的用途及其与系统其他部分的关系。
- 提高代码可维护性:通过将复杂的功能分解为更小、更集中的模块,SRP 使开发人员能够更轻松地更改代码,而不会影响系统的其他部分。这意味着代码的维护和故障排除将变得更省时、更经济。
- 促进代码重用:遵循 SRP 的代码通常更加模块化且可重用。这意味着开发人员可以轻松地在系统或项目的其他部分重用代码。
- 提高系统可扩展性:随着代码库的增长,保持每个类或模块的单一职责变得越来越重要。SRP 确保代码库保持可扩展性,并能够轻松适应更改或新功能,而不会影响系统的其余部分。
总体而言,遵守单一职责原则可以提高代码库的质量和可维护性,使其更易于管理、测试和部署。
优势
遵循单一职责原则(SRP)的优点包括:
- 更好的代码组织和可维护性。
- 提高了代码的可读性和理解性。
- 更容易调试和测试代码。
- 代码的可重用性更高。
- 促进新功能的并行开发和实施。
- 能够更改代码,且引入错误的风险较小。
缺点
单一职责原则(SRP)的一些缺点包括:
- 复杂性增加,因为系统可能需要更多类来实现相同的功能。
- 过度设计的可能性,导致过多的抽象和不必要的代码。
- 难以确定适当的职责粒度。
- 在分离责任和维持绩效之间取得平衡的挑战。
当程序员尝试为软件产品添加功能或新行为时,他们通常会将所有内容集成到当前类中。当之后需要更改某些内容时,由于代码的复杂性,代码重构过程极其耗时且繁琐。
单一职责原则帮助我们创建只执行一项任务的简单类。这使得修改或扩展现有代码更加轻松。
使用单一职责原则的 Twitter 注册
我们借助单一职责原则设计了Twitter注册软件,其中包含通知服务、数据库存储库、帐户服务和执行类。
让我们在 Twitter 注册流程上实现第一个设计原则。
🔐 Twitter 注册流程
假设一个用户想要在 Twitter 上注册的用例。Twitter 为用户注册的步骤如下:
- Twitter 要求用户通过注册表进行注册。
- Twitter 将用户对象存储在其数据库中,其中包含
User
详细信息 -email
、、和其他元数据等name
。password
- Twitter 向用户发送欢迎消息。
让我们声明一个执行上述步骤的类。
public class TwitterRegistration {
public void register() {
// step 1
System.out.println("Fill signup form");
// step 2
System.out.println("Store account details in database");
// step 3
System.out.println("Send a welcome message");
}
}
我们正在创建一个 Twitter 帐户,这三个步骤应该分开处理。但上面的类却将它们全部声明在一个TwitterRegistration
类中。这难道不违反 SRP 吗?
此外,将对象存储到数据库的第二步需要额外的工作,例如打开与数据库的连接、验证握手并存储用户对象。这属于插入逻辑,应单独处理。
第三步是向用户发送欢迎消息,这应该由NotificationService
单独处理。
使用 SRP 原则,我们将上述TwitterRegistration
类分为三个不同的类,每个类具有单一且仅有一个职责。
SRP 重构
重构 TwitterRegistration 类得到:
// Notification Service
class NotificationService {
public void sendNotification() {
// step 3
System.out.println("Send out welcome message");
}
}
// Database handshakes
class AccountRepository {
public void createUser() {
// step 2
System.out.println("🔐 Auth Success!");
System.out.println("Store user data into database");
}
}
// Account Registration
class TwitterAccountRegister {
public void registerUser() {
// step 1
System.out.println("fill account internal details");
}
}
最后,重构上述类之后,我们首先允许TwitterAccountService
创建几个对象AccountRepository
并向NotificationService
Twitter 注册用户。
// Execution Class or Main class
public class TwitterAccountRegister {
public static void main(String[] args) {
TwitterAccountService service = new TwitterAccountService();
service.registerUser();
}
}
// Account Registration Service
class TwitterAccountService {
AccountRepository repository = new AccountRepository();
NotificationService notificationService = new NotificationService();
public void registerUser() {
// step 1
System.out.println("fill account internal details");
repository.createUser();
notificationService.sendNotification();
}
}
// Notification Service
class NotificationService {
public void sendNotification() {
// step 3
System.out.println("Send out welcome message");
}
}
// Database handshakes
class AccountRepository {
public void createUser() {
// step 2
System.out.println("🔐Signup Success!! Registered");
System.out.println("Store user data into database");
}
}
/*
Outputs:
fill account internal details
🔐Signup Success!! Registered
Store user data into database
Send out welcome message
*/
上面TwitterAccountService
正在执行所有三个任务。主要职责是在帐户详细信息中填写帐户详细信息,并将其他职责委托给其他类。
最后,我们知道许多团队致力于同一个软件产品。
遵循 SRP 原则,如果我们在 Github 中看到名为 的文件发生更改TweetAnalytics
,就可以确定这些更改与分析相关。这有助于轻松进行版本控制。
结论
总之,单一职责原则 (SRP) 是一种软件设计原则,它指出每个类应该只有一个改变的理由。
遵循 SRP 可以使代码更易于理解、维护和扩展。它降低了引入 bug 的风险,并使单独测试各个组件变得更加容易。
SRP 鼓励关注点分离,使代码更加模块化和可扩展。该原则是面向对象设计的五大 SOLID 原则之一,是创建简洁、可维护且可扩展代码的重要方面。
文章来源:https://dev.to/ggorantala/solid-single-responsibility-principle-with-examples-h0f您将获得完整的书面笔记@ https://www.ggorantala.dev/