Python方法中if-elif-else多分支重复代码重构方案咨询
优化思路
你这个场景属于典型的多分支固定映射逻辑,不需要引入重量级设计模式,直接用字典映射表就能完全消除重复代码,后续维护也更方便。
重构后代码
def get_params_in_string(params): # 所有业务对象、对应方法的映射关系集中维护 OBJ_CONFIG = { 'AccountAnalysisW': (AccountAnalysis, 'BuhReports.GetAccountAnalysis'), 'АнализСчетаW': (AccountAnalysis, 'BuhReports.GetAccountAnalysis'), 'TurnoverSheetW': (TurnoverSheet, 'BuhReports.GetTurnoverSheet'), 'ОборотнаяВедомостьW': (TurnoverSheet, 'BuhReports.GetTurnoverSheet'), 'CardAccountW': (CardAccount, 'BuhReports.GetCardAccount'), 'КарточкаСчетаW': (CardAccount, 'BuhReports.GetCardAccount'), 'MutualSettlementsW': (MutualSettlements, 'BuhReports.GetMutualSettlements'), 'ВзаиморасчетыW': (MutualSettlements, 'BuhReports.GetMutualSettlements'), 'JournalVoucherW': (JournalVoucher, 'BuhReports.GetJournalVoucher'), 'ЖурналОрдерW': (JournalVoucher, 'BuhReports.GetJournalVoucher'), 'WarehouseCompareW': (WarehouseCompare, 'BuhReports.GetWarehouseCompare'), 'СверкаСкладаW': (WarehouseCompare, 'BuhReports.GetWarehouseCompare'), 'DebtsW': (Debts, 'MutualSettlements.DebitorsAndCreditors'), 'ДолгиW': (Debts, 'MutualSettlements.DebitorsAndCreditors'), } obj_name = params.PrefetchMethod.split('.')[0] if obj_name not in OBJ_CONFIG: raise Exception('Unexpected call') obj_class, method_name = OBJ_CONFIG[obj_name] obj = obj_class(None, params, None, None) obj.prepare_filters() params.Put('PrefetchMethod', method_name, sbis.FieldType.ftSTRING) return JournalVoucher.GetParamsInString(params)
方案优势
- 所有映射规则集中管理,后续新增业务类型只需要在
OBJ_CONFIG里加一条记录,不需要修改逻辑分支 - 完全消除了重复的
elif判断和实例化代码,整体代码量减少近50% - 业务行为和原有代码完全一致,没有侵入性改动
- 比策略模式更轻量,适合当前固定映射的简单场景
内容的提问来源于stack exchange,提问作者Eugene B
相关产品推荐
相关产品推荐

