关于单一职责原则(SRP):Actor与Responsibility的区别是什么?
单一职责原则(SRP)中Actor与Responsibility的区别
先明确:SRP里的“一个类仅因一个原因变更”,核心其实是类的职责要对应单一的需求发起者(Actor),搞懂Actor和Responsibility的区别,就能彻底理解SRP的本质。
什么是Actor?
Actor是系统中的利益相关角色——可以是终端用户、管理员、第三方服务、定时任务,甚至是另一个系统模块。每个Actor代表一类独立的需求来源,他们的诉求变化会驱动代码修改。比如:
- 普通用户会要求优化界面展示逻辑
- 财务部门会要求调整报表的数据格式
- 支付系统会要求修改订单的回调处理逻辑
什么是Responsibility?
Responsibility是类所承担的具体功能集合,是类要完成的实际任务。比如:
- 一个
User类的职责可能是“管理用户基本信息” - 一个
PaymentProcessor类的职责可能是“处理支付请求与结果回调”
核心区别
本质不同
- Actor是需求的发起者,是“谁会让代码变更”
- Responsibility是功能的执行者,是“类要做什么”
与SRP的关联逻辑不同
SRP的核心不是“一个类只能做一件事”,而是“一个类的所有职责都应该来自同一个Actor的需求”。如果一个类的多个职责对应不同Actor,就会导致它因为多个原因变更——比如一个同时处理用户界面展示和财务数据导出的类,会因为用户的界面需求、财务的格式需求两次修改,这就违反了SRP。
举个实际例子
假设你有一个OrderExporter类,它同时负责:
- 生成给用户看的PDF订单详情(Actor:普通用户)
- 生成给财务系统的JSON订单数据(Actor:财务部门)
这时候,用户要求PDF加个二维码,你得改这个类;财务要求JSON加个税率字段,你又得改这个类——这个类就有两个变更原因,违反了SRP。
拆分后变成两个类:
UserPdfExporter:只处理用户的PDF导出需求FinanceJsonExporter:只处理财务的JSON导出需求
每个类只对应一个Actor,只会因为一类需求变更,完全符合SRP。
内容的提问来源于stack exchange,提问作者Muhammad Nabeel
相关产品推荐
相关产品推荐

