元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
设计原则
单一职责原则
开闭原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
▶
创建型模式
工厂方法模式
抽象工厂
单例模式
建造者模式
原型模式
▶
结构型模式
适配器模式
装饰器模式
代理模式
外观模式
组合模式
桥接模式
享元模式
▶
行为型模式
策略模式
观察者模式
命令模式
模板方法模式
状态模式
责任链模式
迭代器模式
中介者模式
访问者模式
备忘录模式
解释器模式
发布时间:
2025-03-21 10:57
↑
☰
# 单一职责原则 (Single Responsibility Principle) ## 定义 单一职责原则(SRP)是面向对象设计中最基础的原则之一,它规定一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一项职责。 ## 为什么需要单一职责原则 - 提高代码的可维护性 - 降低类的复杂度 - 提高代码的可读性和可复用性 - 降低变更引起的风险 ## 示例说明 ### 违反单一职责原则的例子 ```go // 违反SRP的设计 type Employee struct { id int name string salary float64 } func (e *Employee) calculatePay() float64 { // 计算工资 return e.salary } func (e *Employee) saveToDatabase() error { // 保存到数据库 return nil } func (e *Employee) generateReport() string { // 生成报告 return fmt.Sprintf("Employee Report: %s", e.name) } ``` 这个Employee类承担了太多职责: 1. 员工信息管理 2. 工资计算 3. 数据持久化 4. 报告生成 ### 遵循单一职责原则的设计 ```go // 员工信息管理 type Employee struct { id int name string salary float64 } // 工资计算器 type PayrollCalculator struct {} func (p *PayrollCalculator) calculatePay(e Employee) float64 { return e.salary } // 数据持久化 type EmployeeRepository struct {} func (r *EmployeeRepository) save(e Employee) error { return nil } // 报告生成器 type ReportGenerator struct {} func (g *ReportGenerator) generateReport(e Employee) string { return fmt.Sprintf("Employee Report: %s", e.name) } ``` ## 如何判断是否违反单一职责原则 1. 类的方法是否关注不同的业务领域 2. 修改某个功能是否会影响到其他不相关的功能 3. 类的职责是否可以用一句话清晰地描述 ## 最佳实践 1. 保持类的职责单一且明确 2. 如果发现类承担多个职责,及时进行拆分 3. 根据业务领域划分职责 4. 定期重构检查是否违反SRP ## 优缺点 ### 优点 - 降低类的复杂度 - 提高代码的可维护性 - 降低变更带来的风险 - 提高代码的重用性 ### 缺点 - 可能导致类的数量增加 - 增加了代码的复杂度 - 需要更多的接口和委托关系 ## 总结 单一职责原则是最简单但也是最难运用的原则。在实际开发中,对于职责的定义和划分需要根据具体的业务场景和团队的开发经验来权衡。合理运用SRP可以让代码更加清晰、灵活,更易于维护和扩展。