单一职责原则
一个类(或模块、函数),应该有且仅有一个引起它变化的原因。
核心概念:什么是“单一职责”?
通俗来说,一个类只用心做好一件事。
打个生活中的比方:
不符合原则的设计(多功能军刀): 假设你买了一把集成了“剪刀、厨师刀、指甲刀、开瓶器、锯子”的万用军刀。某一天,如果你觉得剪刀部分太钝,想把它拆下来磨一磨,很有可能会把旁边的开瓶器弹簧弄坏,或者导致整把刀松动无法使用。
符合原则的设计(专业工具): 厨房菜刀只负责切菜,修剪指甲只用指甲刀。菜刀坏了,拿去磨或者换掉,完全不会影响你剪指甲。
在代码世界里,“引起变化的因素”通常对应着不同的角色或业务需求(比如财务部门提出了计税逻辑修改、运维部门提出了数据库结构修改)。如果把这两块逻辑塞进同一个类里,一旦财务需求发生变化,你修改代码时就有可能不小心把运维或数据库相关的功能给改出 Bug。
为什么需要单一职责原则?
降低代码复杂度:类只专注于一件事,代码量少、逻辑清晰,非常容易阅读和维护。
减少修改带来的风险(降低耦合):修改某一个业务逻辑时,不会“牵一发而动全身”影响到其他无关功能。
提高复用性:功能越单一、越纯粹的类,越容易在其他地方被重复利用。
极易编写单元测试:测试目标非常明确,不需要写一堆复杂的伪数据(Mock)去覆盖不相关的逻辑。
Python 代码示例
结合你贴出的通知系统案例,我们来看一下违反和遵循 SRP 的对比:
❌ 违反 SRP 的做法(全能大杂烩类)
下面的 UserManager 类承担了太多职责:不仅管理用户数据,还负责密码加密、连接数据库,甚至还掺和了发送邮件!
1 | class UserManager: |
遵循 SRP 的做法(分工明确,各司其职)
我们将上面的“大杂烩”按照职责独立拆分成不同的专业类,每一个类只负责一件事:
1 | # 1. 职责一:专门负责密码处理 |
总结:SOLID 中 DIP 与 SRP 的微妙关系
- 单一职责原则(SRP) 关注的是类内部的“高内聚”:解决的是“一个类不要管太多闲事,防止代码交织乱成一团”的问题。
- 依赖倒转原则(DIP) 关注的是类与类之间的“低耦合”:解决的是“模块之间不要直接死板依赖,要通过接口/抽象打交道”的问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 jiaklop9!
评论