dart - 如何重构此代码块的嵌套 if 语句?
问题描述
我可以通过什么方式重构这样的嵌套 if 语句?满足条件,但条件有一些例外。我认识到这开始接近Arrow Anti-Pattern。
具体来说,是否有任何 dart 语言功能可以帮助我重构或重写此代码以更清晰?
让我们以“闰年”为例:
// on every year that is evenly divisible by 4
// except every year that is evenly divisible by 100
// unless the year is also evenly divisible by 400
bool isLeapYear(int year) {
assert(!year.isNegative);
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0) {
return true;
}
return false;
}
return true;
}
return false;
}
解决方案
您将布尔检查与布尔返回相结合。这可能意味着您可以在一个表达式中完成所有操作。
我会做:
bool isLeapYear(int year) =>
year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
(现在,如果你想优化,那么模, %
, 比按位和, 更昂贵&
,所以你也可以这样做:
bool isLeapYear(int year) =>
year & 3 == 0 && (year & 15 == 0 || year % 100 != 0);
这应该稍微更有效率。如果您知道数字是 100 的倍数,那么做& 15
aka% 16
足以检测到是 400 的倍数。)
对于一般情况,您可以反转您的if
分支并提前返回:
bool isLeapYear(int year) {
if (year % 4 != 0) return false; // Not multiple of 4.
// Year is a multiple of 4.
if (year % 100 != 0) return true; // Not multiple of 100.
// Year is a multiple 100.
return year % 400 == 0;
}
(注意到
if (year % 400 == 0) {
return true;
}
return false;
是一样的return year % 400 == 0;
。)
推荐阅读
- visual-studio - 更改集合表达式的传入参数
- javascript - React Service Worker:加载新内容而不强制用户关闭选项卡
- javascript - 如何将谷歌甘特图的 Y 轴作为 Javascript/AngularJS 中的超链接?
- sql - 使用 TimescaleDB 计算具有大整数时间间隔的平均值
- python - 在循环中绘制 DataFrameGroupBy 对象会给出多个图
- python - 如何解决:安装pandas时出错WinError[123]
- autodesk-forge - 如何在没有标记的情况下获取 forgeviewer 的快照
- javascript - 在 AmCharts v3 上旋转 categoryField
- java - 使用 Hibernate 和 H2 的表创建错误
- qt - 设置应用程序以记住主题:深色与浅色