使用多个elif代码块设计架构
def core_module(user_auth_type, data_source_channel, operation_permission_level):
if user_auth_type == "type1" and data_source_channel == "channel1" and operation_permission_level == "level1":
# 执行特定逻辑1
pass
elif user_auth_type == "type1" and data_source_channel == "channel1" and operation_permission_level == "level2":
# 执行特定逻辑2
pass
elif user_auth_type == "type1" and data_source_channel == "channel2" and operation_permission_level == "level1":
# 执行特定逻辑3
# 以此类推,根据不同维度组合编写相应的elif块
可维护性问题
- 代码冗长:随着业务场景维度增加和场景组合增多,elif块数量会迅速膨胀,代码变得冗长且难以阅读。
- 逻辑分散:不同场景的逻辑分散在各个elif块中,修改或查找特定场景逻辑时,需要在大量代码中定位。
扩展性问题
- 新增场景困难:当需要新增一种业务场景组合时,需要在已有大量elif块中插入新的elif块,容易破坏原有代码结构,引发错误。
- 耦合度高:各elif块之间紧密耦合,一个场景逻辑的修改可能影响到其他elif块,增加维护成本。
解决问题的方法
- 策略模式:
- 将每个业务场景逻辑封装成独立的类,每个类实现相同的接口(比如一个抽象基类定义的方法)。
- 使用一个字典来映射不同的业务场景组合到对应的类实例,通过传入的参数查找字典获取对应的逻辑类并执行其方法。
from abc import ABC, abstractmethod
class CoreLogic(ABC):
@abstractmethod
def execute(self):
pass
class LogicType1Channel1Level1(CoreLogic):
def execute(self):
# 执行特定逻辑1
pass
class LogicType1Channel1Level2(CoreLogic):
def execute(self):
# 执行特定逻辑2
pass
logic_mapping = {
("type1", "channel1", "level1"): LogicType1Channel1Level1,
("type1", "channel1", "level2"): LogicType1Channel1Level2
}
def core_module(user_auth_type, data_source_channel, operation_permission_level):
key = (user_auth_type, data_source_channel, operation_permission_level)
if key in logic_mapping:
logic_mapping[key]().execute()
- 配置文件驱动:
- 将业务场景组合和对应的逻辑函数或类路径配置在一个配置文件(如JSON、YAML)中。
- 程序启动时读取配置文件,构建映射关系。这样在新增或修改业务场景时,只需修改配置文件,无需修改代码。
import yaml
with open('config.yaml', 'r') as f:
config = yaml.safe_load(f)
def core_module(user_auth_type, data_source_channel, operation_permission_level):
key = f"{user_auth_type}_{data_source_channel}_{operation_permission_level}"
if key in config:
logic_func = __import__(config[key]['module']).__dict__[config[key]['function']]
logic_func()
- 使用装饰器:
- 定义一个装饰器,用于注册不同业务场景对应的处理函数。
- 装饰器将函数注册到一个全局字典中,根据传入的业务场景参数从字典中获取并执行对应的函数。
logic_registry = {}
def register_logic(user_auth_type, data_source_channel, operation_permission_level):
def decorator(func):
key = (user_auth_type, data_source_channel, operation_permission_level)
logic_registry[key] = func
return func
return decorator
@register_logic("type1", "channel1", "level1")
def logic_type1_channel1_level1():
# 执行特定逻辑1
pass
@register_logic("type1", "channel1", "level2")
def logic_type1_channel1_level2():
# 执行特定逻辑2
pass
def core_module(user_auth_type, data_source_channel, operation_permission_level):
key = (user_auth_type, data_source_channel, operation_permission_level)
if key in logic_registry:
logic_registry[key]()