在本文中,您将了解以下内容:
- 什么是SRP?
- SRP在软件开发中的重要性
- 优势
- 弱点
- Twitter注册
什么是SRP?
单个职责原则(SRP)是指导软件开发的五个可靠设计原则之一。
定义:类或模块只有一个理由更改。
原则指出,班级只有一个理由改变和一个责任。该原则旨在促进模块化,并帮助开发人员创建更容易理解,修改和维护的代码。
本质上,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吗?
另外,将对象存储在数据库中的步骤2需要其他工作来打开与数据库的连接,对握手进行身份验证并存储用户对象。这是插入逻辑,应分别处理。
第三步是向用户发送欢迎消息,该消息应分别由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
创建几个对象,以注册用户。
// 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使代码更易于理解,维护和扩展。它降低了引入错误的风险,并使孤立测试单个组件变得更加容易。
SRP鼓励关注点的分离,从而使代码更加模块化和可扩展。该原则是面向对象设计的五个稳定原则之一,是创建清洁,可维护和可扩展代码的重要方面。