首页 > 解决方案 > 如何重构此代码块的嵌套 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;
}

标签: dart

解决方案


您将布尔检查与布尔返回相结合。这可能意味着您可以在一个表达式中完成所有操作。

我会做:

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 的倍数,那么做& 15aka% 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;。)


推荐阅读