代码优化问询:精简多分支重复代码+消除process函数副作用
解决方案
一、精简主逻辑,消除重复代码
原代码的多层分支导致了重复的循环与process调用,可通过提前确定目标集合与过滤规则的方式合并逻辑,让代码更紧凑:
from collections import defaultdict direct_container = defaultdict(set) # 1. 确定要处理的元素集合 target_a = get_a() if config.a else a # 2. 处理空集合的边界情况 if config.a and not target_a: # log something return # 3. 定义过滤规则:仅当config.a为True时校验元素有效性 filter_rule = valid if config.a else lambda x: True # 4. 统一遍历处理所有符合条件的元素 for el in filter(filter_rule, target_a): process(el, direct_container)
二、消除process函数的副作用
原process直接修改传入的defaultdict属于隐式副作用,会增加代码调试与维护的难度。可修改函数为纯函数风格,让它返回需要添加的关系数据,由调用方统一管理容器的更新:
修改后的process函数
def process(el): rel = self.get_rel(el) if rel is None: add_without_rel(el) return None # 无需要添加的关系时返回None return rel # 有有效关系时返回该值
对应调整后的主逻辑
from collections import defaultdict direct_container = defaultdict(set) target_a = get_a() if config.a else a if config.a and not target_a: # log something return filter_rule = valid if config.a else lambda x: True for el in filter(filter_rule, target_a): rel = process(el) if rel is not None: direct_container["32"].add(rel)
完整优化后代码
from collections import defaultdict direct_container = defaultdict(set) # 确定目标元素集合 target_a = get_a() if config.a else a # 处理空集合分支 if config.a and not target_a: # log something return # 定义元素过滤规则 filter_valid = valid if config.a else lambda x: True # 统一遍历处理 for el in filter(filter_valid, target_a): rel = process(el) if rel is not None: direct_container["32"].add(rel) # ------------------------------ def process(el): rel = self.get_rel(el) if rel is None: add_without_rel(el) return None return rel
额外说明
- 修正了原代码中
direct_cotainer的拼写错误,统一为direct_container - 若
add_without_rel也存在类似副作用问题,可参考process的改造思路,让它返回数据由调用方处理,进一步降低函数耦合度
内容的提问来源于stack exchange,提问作者user3541631
相关产品推荐
相关产品推荐

