如何在Flutter/Dart中避免嵌套开关?



我正在查看嵌套switch语句的桶。我真想避开这个老鼠窝。我知道在其他语言中有其他的避免这个的方法,比如,Dart呢?

与此相比,我的数据结构相当复杂,所以这里有一些简单的&相似。

enum DayOfWeek {
sun,
mon,
tues,
wed,
thurs,
fri,
sat,
}
enum WeekOfMonth {
/// 1-7
first,
/// 8-14
second,
/// 15-21
third,
/// 22-28
fourth,
/// 29-31
fifth,
}
switch (dayOfWeek) {
case sun:
switch (weekOfMonth) {
case first:

case second:
case third:
case fourth:
case fifth:
}
case mon:
...
case tues:
case wed:
case thurs:
case fri:
case sat:
}

你总是会有某种嵌套,除非你想返回什么有逻辑-例如,如果第一周,总是返回'abc'…

我最近发现实现这一点的一个简单方法是使用Map而不是case语句。

并不是说我总是推荐这样做,但这是在某些情况下你可能会使用的一种方法。

在Map中,您只需像这样存储返回值

enum DayOfWeek {
sun,
mon,
tues,
wed,
thurs,
fri,
sat,
}
enum WeekOfMonth {
/// 1-7
first,
/// 8-14
second,
/// 15-21
third,
/// 22-28
fourth,
/// 29-31
fifth,
}
String? f(DayOfWeek dayOfWeek, WeekOfMonth weekOfMonth) {

var ret = <DayOfWeek, Map<WeekOfMonth, String>> {
DayOfWeek.sun: {
WeekOfMonth.first: "Sun - 1st",
WeekOfMonth.second: "Sun - 2nd",
WeekOfMonth.third: "Sun - 3rd",
WeekOfMonth.fourth: "Sun - 4th",
WeekOfMonth.fifth: "Sun - 5th",
},
DayOfWeek.mon: {
WeekOfMonth.first: "Mon - 1st",
WeekOfMonth.second: "Mon - 2nd",
WeekOfMonth.third: "Mon - 3rd",
WeekOfMonth.fourth: "Mon - 4th",
WeekOfMonth.fifth: "Mon - 5th",
},
DayOfWeek.tues: {
WeekOfMonth.first: "Tues - 1st",
WeekOfMonth.second: "Tues - 2nd",
WeekOfMonth.third: "Tues - 3rd",
WeekOfMonth.fourth: "Tues - 4th",
WeekOfMonth.fifth: "Tues - 5th",
},
DayOfWeek.wed: {
WeekOfMonth.first: "Wed - 1st",
WeekOfMonth.second: "Wed - 2nd",
WeekOfMonth.third: "Wed - 3rd",
WeekOfMonth.fourth: "Wed - 4th",
WeekOfMonth.fifth: "Wed - 5th",
},
DayOfWeek.thurs: {
WeekOfMonth.first: "Thurs - 1st",
WeekOfMonth.second: "Thurs - 2nd",
WeekOfMonth.third: "Thurs - 3rd",
WeekOfMonth.fourth: "Thurs - 4th",
WeekOfMonth.fifth: "Thurs - 5th",
},
DayOfWeek.fri: {
WeekOfMonth.first: "Fri - 1st",
WeekOfMonth.second: "Fri - 2nd",
WeekOfMonth.third: "Fri - 3rd",
WeekOfMonth.fourth: "Fri - 4th",
WeekOfMonth.fifth: "Fri - 5th",
},
DayOfWeek.sat: {
WeekOfMonth.first: "Sat - 1st",
WeekOfMonth.second: "Sat - 2nd",
WeekOfMonth.third: "Sat - 3rd",
WeekOfMonth.fourth: "Sat - 4th",
WeekOfMonth.fifth: "Sat - 5th",
},         
};

return ret[dayOfWeek]![weekOfMonth];


}
void main() {
print(f(DayOfWeek.wed, WeekOfMonth.third));
}

最新更新