1. 核心概念
单一职责原则(Single Responsibility Principle, SRP) 是SOLID原则中的第一个原则,其定义为:
一个类应该只有一个引起它变化的原因
通俗理解:一个类/模块/函数应该只负责一项具体职责
2. Python实现示例
违反SRP的代码
class UserManager:
def __init__(self, user):
self.user = user
def change_user_name(self, new_name):
self.user.name = new_name
def save_user_to_db(self):
db_connection.save(self.user)
def send_welcome_email(self):
email_service.send(
to=self.user.email,
subject="Welcome!",
body=f"Hello {self.user.name}"
)
遵循SRP的重构后代码
class User:
def __init__(self, name, email):
self.name = name
self.email = email
class UserDB:
@staticmethod
def save(user):
db_connection.save(user)
class EmailService:
@staticmethod
def send_welcome_email(user):
email_service.send(
to=user.email,
subject="Welcome!",
body=f"Hello {user.name}"
)
class UserNameChanger:
@staticmethod
def change_name(user, new_name):
user.name = new_name
3. 使用场景
- 业务逻辑分离:当处理用户数据、数据库操作和邮件通知应该分开管理时
- 微服务架构:各服务专注于单一功能
- 插件系统开发:每个插件只处理特定功能
- 测试驱动开发:单一职责的类更容易进行单元测试
4. 最佳实践
- 识别变更原因:如果发现修改类的原因有多个,就应该考虑拆分
- 合理粒度:避免过度拆分导致"类爆炸"(建议类行数控制在200行内)
- 高内聚设计:相关功能尽量放在同一个类中
- 使用组合而非继承:通过组合多个单一职责类实现复杂功能
- 装饰器模式:Python中可用装饰器动态添加职责
5. 优势与收益
- 可维护性:修改一个功能不会影响其他功能
- 可测试性:每个类可以独立测试
- 可读性:代码组织结构更清晰
- 复用性:单一职责的组件更容易被复用
- 并行开发:不同开发者可以同时开发不同模块
6. 实际应用案例
Django模型设计
# models.py (数据层)
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
# services.py (业务逻辑层)
class ProductService:
@staticmethod
def apply_discount(product, discount):
product.price *= (1 - discount)
product.save()
# serializers.py (表示层)
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ['id', 'name', 'price']
提示:在Python中可以通过模块(文件)来进一步组织单一职责的类,如将数据库操作类放在
repository.py
,业务逻辑类放在services.py
等。