七大设计原则(一句话总结)

一、单一职责原则

类、函数、接口 的职责单一

二、开闭原则

修改关闭,扩展开放

三、里氏替换原则:

基类和子类之间的关系,基类可以被子类替代

四、依赖倒置原则

依赖抽象接口,而不是具体对象

五、接口隔离原则

不对外暴露无用接口,接口按照功能细分

六、迪米特法则

一个对象尽量与其他对象少的交互,类间解耦,弱耦合,使得功能模块相对独立

七、合成复用原则

尽量使用组合和聚合(关联关系)代替继承来实现
因为:
1.继承复用破坏了类的封装性,父类的方法会暴露给子类
2.父类和子类耦合度高,父类的实现变化会影响子类,不利于类的扩展和维护

<think>好的,我现在要解决用户的问题:如何在Python中检查类是否遵循单一职责原则(SRP)并提供判断方法。用户之前已经问过关于Python类设计如何避免将太多函数塞进同一个类的问题,现在他想知道具体如何判断一个类是否违反了SRP。 首先,我需要回忆一下单一职责原则的定义。SRP指出一个类应该只有一个引起变化的原因,也就是说,一个类应该只负责一个功能或职责。如果类承担了多个职责,那么修改其中一个职责可能会影响到其他不相关的功能,导致代码维护困难。 接下来,我需要结合用户提供的引用内容。引用[1]、[2]、[3]、[4]都提到了SRP的应用和实例,特别是引用[2]详细解释了SRP的作用,引用[4]给出了一个分割模块的示例。用户之前的回答中也提到了拆分类的具体方法,比如组合模式、Mixin等。 用户现在需要的是判断方法,也就是如何检查一个类是否违反SRP。根据之前的回答,可能包括方法数量、职责描述、修改原因等标准。需要把这些标准具体化,形成可操作的步骤。 首先,我应该从代码结构入手。比如,类的方法是否属于同一类功能。例如,一个数据处理类如果同时包含数据清洗和数据库连接的方法,可能就违反了SRP。另外,类的方法命名是否具有一致性,比如以不同前缀开头可能暗示不同职责。 然后,考虑职责描述测试。用户提到需要能用一句话描述类的职责,如果描述中出现“和”、“或者”等连接词,说明可能存在多个职责。例如,“处理数据并连接数据库”就明显有两个职责。 另外,变更原因分析也是一个关键点。如果不同的功能需求变更导致同一个类需要修改,那么这个类可能承担了多个职责。比如,数据格式变化和数据库连接参数变化都需要修改同一个类,说明需要拆分。 还有依赖关系检查。如果类导入了多个不相关的模块,比如同时导入数据处理和图形绘制的库,这可能意味着职责过多。例如,DataProcessor类导入了pandas和matplotlib,可能就是问题。 测试复杂度也是一个指标。如果测试类时需要模拟多个外部依赖或者覆盖多个不同场景,可能说明职责过多。比如,测试一个类需要同时测试数据解析和网络请求,这可能违反SRP。 代码示例部分,需要给出正例和反例,帮助用户理解。比如,引用[3]中的Animal类只负责呼吸,而如果Animal类还负责移动,就需要拆分。 最后,提供工具辅助检查,比如Pylint、Radon等,这些工具可以计算代码复杂度,帮助识别问题。但需要说明工具只是辅助,主要还是依靠设计原则判断。 总结下来,判断方法应包括结构分析、职责描述、变更原因、依赖检查、测试复杂度以及工具使用。需要将这些步骤组织成清晰的条目,并提供具体示例,让用户能够逐步应用这些方法检查自己的代码。</think>### Python类SRP符合性检测方法 #### 一、代码结构分析法 1. **方法聚类检测** - 统计类中方法的**动词前缀一致性**:例如$UserManager$类中出现`process_payment()`和`render_template()`,动词`process`与`render`暗示不同职责[^2] - 示例检测代码: ```python class SRPChecker: @staticmethod def check_method_prefixes(cls): prefixes = [m.split('_')[0] for m in dir(cls) if not m.startswith('_')] return len(set(prefixes)) > 3 # 超过3种动词前缀触发警告 ``` 2. **方法关联度计算** 使用代码耦合度指标: ```python # 安装分析工具:pip install radon from radon.complexity import cc_visit def calculate_coupling(code): results = cc_visit(code) return sum(item.complexity for item in results) ``` 当类内方法平均耦合度>7时需警惕[^4] #### 二、语义化判断标准 1. **职责描述测试** - 要求用**一句话**完整描述类的功能 - 通过示例说明: ```python # 反例:DataHandler 类的描述 "处理CSV文件解析、数据库连接和生成PDF报告" # 包含3个职责 # 正例:PDFGenerator 类的描述 "将结构化数据转换为PDF格式文档" # 单一职责 ``` 2. **变更原因验证** 创建变更记录表进行验证: | 修改时间 | 修改内容 | 触发原因 | 影响范围 | |------------|-------------------|----------------------|-----------------| | 2024-03-01 | 调整数据加密算法 | 安全策略升级 | encrypt_data() | | 2024-03-05 | 修改API响应格式 | 前端界面改版需求 | format_response() | 若同一类出现**不同业务原因**的修改,说明违反SRP[^1] #### 三、依赖关系检测 1. **导入模块分析** 检查类的导入语句: ```python # 反例:混合导入数据处理和界面库 import pandas as pd from matplotlib import pyplot as plt # 正例:专注数据库操作 import psycopg2 from sqlalchemy import create_engine ``` 2. **参数类型多样性** 统计方法参数类型: ```python def analyze_parameters(cls): param_types = [] for method in cls.__dict__.values(): if callable(method): annotations = method.__annotations__ param_types.extend(annotations.values()) return len(set(param_types)) > 5 # 超过5种类型触发警告 ``` #### 四、测试用例验证法 1. **测试覆盖率差异检测** 当出现以下情况时需注意: ```text test_data_processing.py 覆盖率 95% test_report_generation.py 覆盖率 30% # 同一类不同功能测试覆盖率差异过 ``` 2. **Mock对象复杂度** 记录单元测试中需要的模拟对象数量: ```python # 反例测试样例 def test_process_data(self): mock_db = Mock(DatabaseConnector) # 模拟数据库 mock_parser = Mock(DataParser) # 模拟数据解析器 processor = DataProcessor(mock_db, mock_parser) # 需要多个模拟对象 ... ``` #### 五、工具辅助检测 1. **Pylint规则扩展** 自定义.pylintrc配置: ```ini [DESIGN] max-methods=10 # 类方法数量阈值 max-locals=15 # 单个方法代码行数 max-returns=6 # 方法返回路径数量 ``` 2. **可视化分析(使用pyreverse)** ```bash pyreverse -o png -p Project *.py ``` 生成的类关系图中,若发现类有**多个入方向箭头**或**多组关联模块**,则可能违反SRP[^3] #### 六、典型模式对照表 | 违规特征 | 合规特征 | 检测方法 | |---------------------------|---------------------------|------------------------| | 方法使用不同领域的术语 | 方法动词前缀一致 | 语义分析 | | 需要同时Mock多个外部服务 | 仅需1-2个测试替身 | 单元测试审查 | | 类描述包含"和/与"等连词 | 能用名词短语精确描述 | 文档审查 | | 频繁因不同原因被修改 | 修改原因保持单一 | 版本历史分析 | #### 、代码示例验证 ```python # 违反SRP的类 class FileManager: def read_csv(self, path): ... # 数据读取职责 def encrypt_data(self, data): ... # 数据加密职责 def send_email(self, content): ... # 通知发送职责 # 符合SRP的拆分方案 class CSVReader: ... # 只负责文件读取 class DataEncryptor: ... # 只负责加密 class EmailNotifier: ... # 只负责通知 ``` 通过上述方法可系统化检测SRP合规性,当发现类同时具备$数据处理+通信+安全$等跨领域功能时,应立即启动重构[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值