跳至主要內容

单一职责原则

微信公众号:储凡2023/11/29大约 6 分钟

单一职责原则

一个类只负责一个功能领域中的相应职责,或者就一个类而言,应该只有一个引起它变化的原因。

一个类不能太“累”!!!

在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小, 而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,

将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

单一职责原则要求一个类或模块应该有且仅有一个引起它变化的原因。一个类应该只负责一项特定的职责 。这样做可以提高代码的可理解性、可维护性和可测试性。

举例说明

这里通过一个例子对单一职责原则进行说明。例如:

定义三个接口:UserServiceEmailServiceUser

  • UserService 提供了获取用户信息的方法
  • EmailService 提供了发送电子邮件的方法
  • User 表示用户对象

然后创建两个实现接口的类:DatabaseUserServiceEmailSender

  • DatabaseUserService 负责从数据库中获取用户信息
  • EmailSender 负责发送电子邮件。

最后创建 UserProcessor 类,接受一个 UserService 对象和一个 EmailService 对象作为构造函数参数。 UserProcessor 类负责处理用户,它首先通过 UserService 获取用户信息,然后执行用户处理逻辑,并使用 EmailService 发送欢迎邮件给用户

/**
 * 单一职责原则Demo
 */
export class User {
  private readonly id: string
  private readonly name: string
  private readonly email: string

  constructor(id: string, name: string, email: string) {
    this.id = id
    this.name = name
    this.email = email
  }

  getId(): string {
    return this.id
  }

  getName(): string {
    return this.name
  }

  getEmail(): string {
    return this.email
  }
}

interface UserService {
  getUserById: (userId: string) => User
}

interface EmailService {
  sendEmail: (user: User, message: string) => void
}

class DatabaseUserService implements UserService {
  getUserById(userId: string) {
    // 从数据库中获取用户信息
    // ...
    return new User(userId, 'John Doe', 'john.doe@example.com')
  }
}

class EmailSender implements EmailService {
  sendEmail(user: User, message: string): void {
    // 发送电子邮件给用户
    // ...
    console.log(`Sending email to ${user.getEmail()}: ${message}`)
  }
}

class UserProcessor {
  private userService: UserService
  private emailService: EmailService

  constructor(userService: UserService, emailService: EmailService) {
    this.userService = userService
    this.emailService = emailService
  }

  processUser(userId: string): void {
    const user = this.userService.getUserById(userId)
    // 执行用户处理逻辑
    // ...

    const message = `Hello, ${user.getName()}`
    this.emailService.sendEmail(user, message)
  }
}

// 使用示例
const userService = new DatabaseUserService()
const emailService = new EmailSender()

const userProcessor = new UserProcessor(userService, emailService)
userProcessor.processUser('123')

通过这种设计,将获取用户信息的职责委托给了 UserService,将发送电子邮件的职责委托给了 EmailService, 同时 UserProcessor 类专注于用户处理逻辑,遵循了单一职责原则。

每个类都有明确的职责,并且可以独立进行修改和扩展,提高了代码的可维护性和可测试性

更新日志

2025/5/18 18:01
查看所有更新日志
  • 24657-feat: 基于@142vip/vuepress对站点升级,简化配置、优化整体结构 (#234)
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • 6b33b-feat(ES6): 新增2016新增特性和ts文档
  • e6a79-feat: 大幅新增设计模式、Linux命令、ORM框架教程文档