如何重构含大量If/Elseif的函数?寻求更优替代方案
优化多If/Elseif分支的方案
针对你这段嵌套分支过多的代码,我们可以从提取重复条件、封装通用逻辑、用字典映射替代分支这几个方向入手,既提升可读性,也让后续维护更轻松。字典映射确实是这类场景的优质方案,下面结合你的代码具体优化:
第一步:提取重复条件为变量
把重复出现的判断逻辑提前定义成语义化变量,避免在分支里重复写冗长的条件:
# 提前定义复用的条件变量 is_short_date_range = presetDateRange != "Last 12+ Months" is_search_campaign = campaignType == "SEARCH" is_non_perf_max = campaignType != "PERFORMANCE_MAX" is_campaign_or_adgroup = lowestDim in ["Campaign", "Adgroup"] is_google_special_case = source == "google" && (campaignType in ["SMART", "PERFORMANCE_MAX"])
第二步:封装通用构造逻辑
多个分支都在创建结构一致的drillThroughMap条目,把这个逻辑封装成辅助函数,减少重复代码:
# 封装生成钻取链接的通用函数 function create_drill_link(filters::Dict, target_dashboard) return Dict("filters" => filters, "drillTo" => target_dashboard) end
第三步:用字典映射替代If/Else分支
针对基于lowestDim这类枚举值的分支判断,用字典存储不同值对应的规则,直接通过键值获取结果,替代嵌套的If/Else:
优化DRILLLINK5逻辑
if is_campaign_or_adgroup if is_non_perf_max # 用字典存储不同维度对应的过滤规则 dim_filter_map = Dict( "Campaign" => Dict([SQLFilter("CAMPAIGN", "=", onlyCampaign), SQLFilter("SOURCE", "=", source)]), "Adgroup" => Dict([SQLFilter("CAMPAIGN", "=", onlyCampaign), SQLFilter("SOURCE", "=", source), SQLFilter("ADGROUP", "=", adgroup)]) ) drillThroughMap["DRILLLINK5"] = create_drill_link(dim_filter_map[lowestDim], demographicDashboard) end drillThroughMap["DRILLLINK10"] = create_drill_link(Dict(), campaignComparisonDashboard) end
优化DRILLLINK6逻辑
if is_short_date_range && lowestDim != "Keyword" && !is_google_special_case filter_value = lowestDim == "Campaign" ? campaignStr : "$onlyCampaign ·· $source" drillThroughMap["DRILLLINK6"] = create_drill_link( Dict([SQLFilter("CAMPAIGN_FROM_DIAGNOSIS", "=", filter_value)]), adgroupComparisonDashboard ) end
优化DRILLLINK7逻辑
if is_short_date_range && is_search_campaign # 用字典存储不同维度对应的钻取配置 drill7_config_map = Dict( "Campaign" => ( filter_key = "CAMPAIGN_FROM_DIAGNOSIS", filter_value = "$onlyCampaign ·· $source" ), "Adgroup" => ( filter_key = "ADGROUP_FROM_DIAGNOSIS", filter_value = "$adgroup ·· $onlyCampaign ·· $source" ) ) # 匹配对应维度的配置并生成钻取链接 if haskey(drill7_config_map, lowestDim) config = drill7_config_map[lowestDim] drillThroughMap["DRILLLINK7"] = create_drill_link( Dict([SQLFilter(config.filter_key, "=", config.filter_value)]), keywordComparisonDashboard ) end end
优化后的优势
- 可读性提升:语义化的变量名让条件逻辑一目了然,不用反复读冗长的判断语句;
- 维护成本降低:后续新增维度或钻取规则时,只需要在字典里添加新条目,不用新增If/Else分支;
- 重复代码消除:通用逻辑封装后,避免了大量结构重复的字典创建代码。
字典映射完全适合你这种基于固定枚举值分支的场景,是当前最优的方案之一。
内容的提问来源于stack exchange,提问作者andrdpedro
相关产品推荐
相关产品推荐

