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

如何用设计模式或更优方案重构含冗余if-else的VisitMonth函数?

更优雅的月份访问次数映射方案

嘿,我太懂这种一堆嵌套if-else的痛苦了!不仅看着乱糟糟,以后要加新的区间条件还得在里面插新的判断,维护起来简直是噩梦。既然逻辑是非线性的没法用简单公式计算,那咱们可以把区间映射关系和业务逻辑分离,给你两个实用的优化方案:

方案一:使用区间映射列表(直观易维护)

把每个区间的上限值和对应的访问次数存在一个有序列表里,然后遍历找到第一个符合条件的区间就行。这种方式最直观,新手也能一眼看懂,而且扩展超级方便——要加新区间?直接在列表里加一行就行!

import java.util.Arrays;
import java.util.List;

// 自定义简单的映射类,避免依赖第三方库
static class MonthVisitPair {
    int maxMonth;
    int visitCount;
    public MonthVisitPair(int maxMonth, int visitCount) {
        this.maxMonth = maxMonth;
        this.visitCount = visitCount;
    }
}

public class YourClass {
    // 按区间上限从小到大排序的映射列表
    private static final List<MonthVisitPair> MONTH_VISIT_MAP = Arrays.asList(
        new MonthVisitPair(1, 1),
        new MonthVisitPair(2, 2),
        new MonthVisitPair(4, 3),
        new MonthVisitPair(6, 4),
        new MonthVisitPair(9, 5),
        new MonthVisitPair(12, 6),
        new MonthVisitPair(15, 7),
        new MonthVisitPair(18, 8),
        new MonthVisitPair(24, 9),
        new MonthVisitPair(30, 10),
        new MonthVisitPair(36, 11),
        new MonthVisitPair(48, 12),
        new MonthVisitPair(60, 13)
    );

    public int VisitMonth(int months) {
        for (MonthVisitPair entry : MONTH_VISIT_MAP) {
            if (months <= entry.maxMonth) {
                return entry.visitCount;
            }
        }
        // 所有区间都不匹配时返回默认值
        return 14;
    }
}

方案二:使用NavigableMap(高效简洁)

如果你的区间数量比较多,或者需要频繁查询,用TreeMap(实现了NavigableMap接口)会更高效。它自带的floorEntry方法能直接帮我们找到小于等于目标值的最大键,省去了手动遍历的步骤,代码更简洁:

import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;

public class YourClass {
    private static final NavigableMap<Integer, Integer> MONTH_VISIT_MAP = new TreeMap<>();

    // 静态代码块初始化映射关系
    static {
        MONTH_VISIT_MAP.put(1, 1);
        MONTH_VISIT_MAP.put(2, 2);
        MONTH_VISIT_MAP.put(4, 3);
        MONTH_VISIT_MAP.put(6, 4);
        MONTH_VISIT_MAP.put(9, 5);
        MONTH_VISIT_MAP.put(12, 6);
        MONTH_VISIT_MAP.put(15, 7);
        MONTH_VISIT_MAP.put(18, 8);
        MONTH_VISIT_MAP.put(24, 9);
        MONTH_VISIT_MAP.put(30, 10);
        MONTH_VISIT_MAP.put(36, 11);
        MONTH_VISIT_MAP.put(48, 12);
        MONTH_VISIT_MAP.put(60, 13);
    }

    public int VisitMonth(int months) {
        Map.Entry<Integer, Integer> entry = MONTH_VISIT_MAP.floorEntry(months);
        // 原逻辑中months<=1就返回1,所以entry不会为null,这里做兜底处理更严谨
        return entry != null ? entry.getValue() : 14;
    }
}

两种方案的核心优势

不管选哪种,都把原来硬编码的判断逻辑抽成了可配置的映射关系:

  • 可维护性拉满:以后要加新的区间,比如<=72返回15,只需要在映射表/Map里加一行,完全不用动业务代码
  • 可读性提升:谁能一眼看懂原来十几层if-else的逻辑?现在看映射表就知道每个区间对应啥结果
  • 灵活性更高:甚至可以把映射关系放到配置文件里(比如JSON、properties),不用改代码就能调整规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:10:47