当前位置: 首页 > wzjs >正文

wordpress 制作网站模板教程wordpress wp roket

wordpress 制作网站模板教程,wordpress wp roket,西安网站空间,珠海网站制作公单一职责原则 什么是单一职责原则? 单一职责原则是面向对象设计(OOD)中 SOLID 原则的第一个字母 "S"。它由罗伯特C马丁 (Robert C. Martin, 又称 "Uncle Bob") 提出,其核心思想是: 一个类&…

单一职责原则

什么是单一职责原则?

单一职责原则是面向对象设计(OOD)中 SOLID 原则的第一个字母 "S"。它由罗伯特·C·马丁 (Robert C. Martin, 又称 "Uncle Bob") 提出,其核心思想是:

一个类(或模块、函数)应该有且仅有一个引起它变化的原因。

换句话说,一个类应该只负责一项职责。如果你能想到多于一个的动机去改变一个类,那么这个类就承担了过多的职责。

为什么这个原则很重要?

遵守单一职责原则可以带来以下好处:

  1. 降低类的复杂度: 一个类只做一件事情,其内部逻辑会相对简单,更容易理解和维护。

  2. 提高类的可读性: 职责清晰的类,其代码意图也更容易被他人(或未来的你)理解。

  3. 提高代码的可维护性: 当需求变更时,如果一个类只负责一项职责,那么修改通常只会影响到这一个职责相关的部分,降低了引入新错误的风险。如果一个类承担了多个职责,修改其中一个职责可能会无意中影响到其他职责。

  4. 提高代码的复用性: 职责单一的类更容易被其他模块或项目复用,因为它的功能是明确和独立的。

  5. 降低耦合度: 当一个类只关注一个职责时,它与其他类的依赖关系会更少、更清晰,从而降低了系统组件之间的耦合度。

  6. 易于测试: 功能单一的类更容易进行单元测试,因为测试的焦点更集中。

如何理解“职责”和“变化的原因”?

这里的“职责”可以理解为“一项功能”或“一个业务关注点”。“变化的原因”是指当需求发生变化时,可能会导致你修改这个类的代码。

举个例子:

假设我们有一个 User 类:

// 反例:违反单一职责原则的 User 类
class User {private String username;private String password;private String email;
​// 构造函数、getter/setter 省略...
​// 职责1: 用户信息管理public void setUsername(String username) { this.username = username; }public String getUsername() { return username; }// ... 其他用户信息相关的 getter/setter
​// 职责2: 用户认证public boolean login(String inputPassword) {// 复杂的密码校验逻辑,可能涉及加密、盐值等return this.password.equals(inputPassword); // 简化示例}
​// 职责3: 发送邮件通知public void sendEmailNotification(String subject, String message) {// 连接邮件服务器、构建邮件内容、发送邮件的逻辑System.out.println("Sending email to " + email + ": " + subject + " - " + message);}
​// 职责4: 将用户信息持久化到数据库public void saveToDatabase() {// 连接数据库、执行SQL插入或更新操作的逻辑System.out.println("Saving user " + username + " to database.");}
}

在这个 User 类中,它承担了至少四个职责:

  1. 存储和管理用户基本信息(用户名、密码、邮箱)。

  2. 用户登录认证。

  3. 发送邮件通知。

  4. 将用户信息持久化到数据库。

这会导致以下问题:

  • 修改用户认证逻辑(比如更换加密算法)可能会影响到用户信息管理或邮件发送。

  • 修改邮件发送方式(比如从 SMTP 切换到 API)可能会影响到用户认证。

  • 修改数据库持久化方式(比如从 MySQL 切换到 MongoDB)可能会影响到其他所有功能。

  • 这个类会变得非常庞大和复杂,难以维护和测试。

如何应用单一职责原则进行改进?

我们可以将这些职责分离到不同的类中:

// 改进:遵循单一职责原则
​
// 职责1: 用户数据对象 (POJO/Entity)
class UserData {private String username;private String passwordHash; // 存储密码哈希而不是明文private String email;
​// 构造函数、getter/setterpublic UserData(String username, String passwordHash, String email) {this.username = username;this.passwordHash = passwordHash;this.email = email;}public String getUsername() { return username; }public String getPasswordHash() { return passwordHash; }public String getEmail() { return email; }// ...
}
​
// 职责2: 用户认证服务
class UserAuthenticator {public boolean login(UserData user, String inputPassword) {// 复杂的密码校验逻辑// 比如:PasswordHasher.verify(inputPassword, user.getPasswordHash());return user.getPasswordHash().equals(inputPassword); // 简化示例}
}
​
// 职责3: 邮件服务
class EmailService {public void sendEmail(String toEmail, String subject, String message) {System.out.println("Sending email to " + toEmail + ": " + subject + " - " + message);}
}
​
// 职责4: 用户持久化服务 (Repository)
class UserRepository {public void save(UserData user) {System.out.println("Saving user " + user.getUsername() + " to database.");}public UserData findByUsername(String username) {// 从数据库查找用户的逻辑System.out.println("Finding user " + username + " from database.");// 示例:返回一个模拟用户if ("testuser".equals(username)) {return new UserData("testuser", "hashedpassword", "test@example.com");}return null;}
}
​
// 客户端/业务逻辑层 使用这些分离的服务
public class UserRegistrationService {private final UserRepository userRepository;private final UserAuthenticator userAuthenticator;private final EmailService emailService;
​public UserRegistrationService(UserRepository userRepository, UserAuthenticator userAuthenticator, EmailService emailService) {this.userRepository = userRepository;this.userAuthenticator = userAuthenticator;this.emailService = emailService;}
​public void registerUser(String username, String password, String email) {// 检查用户是否已存在等逻辑String hashedPassword = password; // 实际应进行哈希处理UserData newUser = new UserData(username, hashedPassword, email);userRepository.save(newUser);emailService.sendEmail(email, "Welcome!", "Thanks for registering.");}
​public boolean loginUser(String username, String password) {UserData user = userRepository.findByUsername(username);if (user != null) {return userAuthenticator.login(user, password);}return false;}
​public static void main(String[] args) {UserRepository repo = new UserRepository();UserAuthenticator auth = new UserAuthenticator();EmailService mailer = new EmailService();
​UserRegistrationService service = new UserRegistrationService(repo, auth, mailer);service.registerUser("john.doe", "password123", "john.doe@example.com");System.out.println("Login successful: " + service.loginUser("john.doe", "password123"));}
}

在改进后的设计中:

  • UserData 类只负责存储用户数据。

  • UserAuthenticator 类只负责用户认证逻辑。

  • EmailService 类只负责发送邮件。

  • UserRepository 类只负责用户数据的持久化。

现在,如果需要修改密码校验逻辑,只需要修改 UserAuthenticator。如果需要更换邮件发送方式,只需要修改 EmailService。每个类的职责都非常清晰。

注意事项和权衡:

  • 粒度问题: 单一职责原则的难点在于如何界定“职责”的粒度。过度拆分可能会导致类的数量剧增,反而增加系统的复杂性。需要根据具体场景进行权衡。

  • 上下文相关: “职责”的定义也可能因项目和团队的上下文而异。

  • 并非绝对: 有时候,为了聚合相关的行为或者由于性能等原因,可能会在一个类中包含多个紧密相关的职责。但这种情况应该是经过仔细考虑和权衡的结果。

总结:

单一职责原则是构建健壮、可维护和可扩展软件系统的重要指导原则。通过确保每个类只承担一项职责,可以有效地降低系统的复杂度和耦合度,提高代码质量。在进行类设计时,时刻思考“这个类有多少个变化的原因?”是一个很好的实践。


文章转载自:

http://jTY9Sss5.kjfqf.cn
http://4HD28Hsm.kjfqf.cn
http://ekxoNtrv.kjfqf.cn
http://qZ24Tgyc.kjfqf.cn
http://IBk1Cz9L.kjfqf.cn
http://6LJULXD7.kjfqf.cn
http://ABDyXWV1.kjfqf.cn
http://AoK7s2zv.kjfqf.cn
http://pNuCc7Sk.kjfqf.cn
http://79btYpKI.kjfqf.cn
http://5oVMSVlC.kjfqf.cn
http://EXtwGCbA.kjfqf.cn
http://MCiOqWZm.kjfqf.cn
http://Z6q34Sv3.kjfqf.cn
http://R4O5woOs.kjfqf.cn
http://b9vJ0ZR3.kjfqf.cn
http://bigoePEu.kjfqf.cn
http://4yOfpx81.kjfqf.cn
http://AbRGGxzM.kjfqf.cn
http://bbaYelRn.kjfqf.cn
http://cswduHdG.kjfqf.cn
http://WZqMdGtZ.kjfqf.cn
http://3navrfdT.kjfqf.cn
http://R2xKQ4UW.kjfqf.cn
http://bmuspma0.kjfqf.cn
http://XDJ32ar8.kjfqf.cn
http://9FAX2hyo.kjfqf.cn
http://9xsf2abA.kjfqf.cn
http://mRKlRAn0.kjfqf.cn
http://ZFUYoOEi.kjfqf.cn
http://www.dtcms.com/wzjs/725249.html

相关文章:

  • 南海营销网站建设怎么架设个人网站
  • 前台和后台网站开发的区别新手机发布
  • 网站外部链接怎么做大型行业门户网站开发
  • 做外贸如何建网站东莞路桥投资建设公司招聘
  • 做网站图片和文字字体侵权湖南常德通报1例复阳病例
  • 单位网站 单位网页 区别吗网站推广方式案例
  • 设计师导航网站大全阳谷做网站
  • 岳阳网站建设团队网站与网页的关系
  • 温州网站优化价格wordpress 登陆页面模板
  • 网站制作 视频二级域名 wordpress
  • 为什么自己花钱做的网站竟然不是自己的?(哪些企业网站做的好
  • 律师事务所网站设计wordpress静态首页
  • 个人注什么域名的网站南宁老牌网站建设公司
  • 电子商务网站建设论文资料东坑仿做网站
  • iis下建多个网站郑州男科医院哪家治疗比较好
  • wordpress开通邮件注册安徽网络优化公司
  • 网站建设技术外文文献网站建设下载模板之后怎么修改
  • 网站怎么显示被k品牌建设与电商发展的关系
  • 设计师平台网站南京学习网站建设
  • 湛江做网站建设wordpress 素材站模板
  • 重庆万州网站建设多少钱好享购物官方网站购物
  • 云主机是不是可以搭建无数个网站网页游戏大厅下载
  • 制作网页网站公司wordpress链接亚马逊
  • 携程网网站推广方式沧州网站建设沧州
  • 建设银行亚洲官方网站个人网站备案名字不同
  • 徐州品牌网站建设免费下载百度到桌面
  • 网站风格有哪些类型安徽网站设计费用
  • 营销型网站建设步骤php+mysql网站开发技术与典型案例导航【源代码】
  • nodejs 网站开发模块在线优化网站
  • 网站开发并发处理如何申请一个网站