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

如何在Flutter/Dart中避免使用嵌套switch语句?

在Dart中规避嵌套Switch语句的几种方案

方案1:用映射表(Map)直接关联组合逻辑

把DayOfWeek和WeekOfMonth的组合作为键,对应的处理逻辑作为值,直接通过Map查找执行,完全避免嵌套结构。

示例代码:

enum DayOfWeek { sun, mon, tues, wed, thurs, fri, sat }
enum WeekOfMonth { first, second, third, fourth, fifth }

// 定义处理逻辑的函数类型
typedef Handler = void Function();

void main() {
  const day = DayOfWeek.sun;
  const week = WeekOfMonth.first;

  // 创建映射表,键是(DayOfWeek, WeekOfMonth)元组
  final handlerMap = <(DayOfWeek, WeekOfMonth), Handler>{
    (DayOfWeek.sun, WeekOfMonth.first): () => print("周日第一周处理逻辑"),
    (DayOfWeek.sun, WeekOfMonth.second): () => print("周日第二周处理逻辑"),
    (DayOfWeek.mon, WeekOfMonth.first): () => print("周一第一周处理逻辑"),
    // 按需补充其他组合
  };

  // 执行对应逻辑,可添加默认处理
  handlerMap[(day, week)]?.call() ?? print("默认处理逻辑");
}

如果部分组合逻辑相同,可以批量赋值,比如周日的第三、四、五周逻辑一致:

final commonSunHandler = () => print("周日第三/四/五周通用逻辑");
handlerMap.addAll({
  (DayOfWeek.sun, WeekOfMonth.third): commonSunHandler,
  (DayOfWeek.sun, WeekOfMonth.fourth): commonSunHandler,
  (DayOfWeek.sun, WeekOfMonth.fifth): commonSunHandler,
});

方案2:封装策略类拆分职责

针对每个DayOfWeek创建对应的策略类,类内部处理WeekOfMonth的分支逻辑,把嵌套的层级拆分成独立的类,符合单一职责原则。

示例代码:

enum DayOfWeek { sun, mon, tues, wed, thurs, fri, sat }
enum WeekOfMonth { first, second, third, fourth, fifth }

abstract class DayStrategy {
  void handleWeek(WeekOfMonth week);
}

class SundayStrategy implements DayStrategy {
  @override
  void handleWeek(WeekOfMonth week) {
    switch (week) {
      case WeekOfMonth.first:
        print("周日第一周处理");
        break;
      case WeekOfMonth.second:
        print("周日第二周处理");
        break;
      default:
        print("周日其他周通用处理");
    }
  }
}

class MondayStrategy implements DayStrategy {
  @override
  void handleWeek(WeekOfMonth week) {
    // 周一对应的周处理逻辑
  }
}

// 其他日期的策略类同理

void main() {
  const day = DayOfWeek.sun;
  const week = WeekOfMonth.first;

  // 映射日期到对应的策略类
  final strategyMap = <DayOfWeek, DayStrategy>{
    DayOfWeek.sun: SundayStrategy(),
    DayOfWeek.mon: MondayStrategy(),
    // 补充其他日期
  };

  strategyMap[day]?.handleWeek(week) ?? print("默认处理");
}

方案3:使用扩展方法分散逻辑

给DayOfWeek添加扩展方法,接收WeekOfMonth作为参数,把原本嵌套的逻辑分散到每个枚举值的扩展方法中,代码更直观。

示例代码:

enum DayOfWeek { sun, mon, tues, wed, thurs, fri, sat }
enum WeekOfMonth { first, second, third, fourth, fifth }

extension DayHandler on DayOfWeek {
  void handleWeek(WeekOfMonth week) {
    switch (this) {
      case DayOfWeek.sun:
        _handleSundayWeek(week);
        break;
      case DayOfWeek.mon:
        _handleMondayWeek(week);
        break;
      // 其他日期分支
      default:
        print("默认处理");
    }
  }

  void _handleSundayWeek(WeekOfMonth week) {
    switch (week) {
      case WeekOfMonth.first:
        print("周日第一周处理");
        break;
      case WeekOfMonth.second:
        print("周日第二周处理");
        break;
      default:
        print("周日通用处理");
    }
  }

  void _handleMondayWeek(WeekOfMonth week) {
    // 周一的周处理逻辑
  }
}

void main() {
  const day = DayOfWeek.sun;
  const week = WeekOfMonth.first;
  day.handleWeek(week);
}

选择建议

  • 如果逻辑简单、组合较少,优先用映射表,代码最简洁;
  • 如果逻辑复杂、每个日期的周处理差异大,用策略类,便于维护和扩展;
  • 想保持枚举的内聚性,用扩展方法,逻辑和枚举绑定更紧密。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:29