You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构含大量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

优化后的优势

  1. 可读性提升:语义化的变量名让条件逻辑一目了然,不用反复读冗长的判断语句;
  2. 维护成本降低:后续新增维度或钻取规则时,只需要在字典里添加新条目,不用新增If/Else分支;
  3. 重复代码消除:通用逻辑封装后,避免了大量结构重复的字典创建代码。

字典映射完全适合你这种基于固定枚举值分支的场景,是当前最优的方案之一。

内容的提问来源于stack exchange,提问作者andrdpedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:40:30