运行时动态构建执行步骤的设计模式及Python类架构优化问询
解决方案核心思路
将execute的执行流程从硬编码方法转为可配置的流程模板,完全解耦步骤定义和执行流程编排,不需要每次新增执行链路都修改Operator类和主调用逻辑。
具体实现步骤
- 抽离执行流程配置,避免硬编码
将所有配置参数对应的step执行序列独立存放,新增执行流仅需修改配置,无需改动业务代码:
# 可单独存放于配置模块中,和业务逻辑完全拆分 EXECUTE_FLOW_CONFIG = { "param_1": ["step_1", "step_5", "step_9", "step_2"], "param_m": ["step_7", "step_6"], # 新增执行流程仅需在这里加对应配置项即可 }
- 改造Operator类,新增通用执行入口
删除所有硬编码的execute_x方法,统一用通用run方法接收步骤序列动态执行:
class DummyOperator: def step_1(self): pass # ... 其余step方法保持原有实现不变 def run(self, step_sequence: list[str]): """通用执行入口,按传入的步骤序列依次执行对应方法""" for step_name in step_sequence: # 动态获取step方法并调用 step_func = getattr(self, step_name) step_func()
- 简化主调用逻辑,删除冗长的分支判断
直接根据配置取值执行,无需每次新增execute方法都修改主逻辑:
# main.py from xxx import EXECUTE_FLOW_CONFIG conf_value = get_value_from_config() obj = DummyOperator() step_sequence = EXECUTE_FLOW_CONFIG[conf_value] obj.run(step_sequence)
进阶优化方案
- 如果step需要传参、包含分支判断逻辑,可将配置项从字符串升级为结构化描述,比如
{"step": "step_1", "params": {"timeout": 10}, "condition": "pre_check_pass"},在run方法中对应解析处理即可 - 可在run方法中增加步骤合法性校验,执行前先判断传入的step是否存在,提前抛出异常避免执行中途失败
- 同类结构的类可抽离公共基类,将通用执行逻辑、校验逻辑放到基类中,子类仅需实现各自的step方法即可,不用重复开发执行逻辑:
class BaseOperator: def run(self, step_sequence: list[str]): # 公共执行逻辑、校验逻辑统一放在基类 for step_name in step_sequence: if not hasattr(self, step_name): raise ValueError(f"不存在的执行步骤: {step_name}") getattr(self, step_name)() class DummyOperator(BaseOperator): # 子类仅需实现业务相关的step方法 def step_1(self): pass
- 运行时需要动态新增/修改execute流程时,直接修改
EXECUTE_FLOW_CONFIG配置即可,配合配置中心可实现热更新,完全不需要改动业务代码。
内容的提问来源于stack exchange,提问作者fo1n
相关产品推荐
相关产品推荐

