我可以用什么方式重構這樣的嵌套 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;
}
uj5u.com熱心網友回復:
您將布爾檢查與布爾回傳相結合。這可能意味著您可以在一個運算式中完成所有操作。
我會做:
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,也就是% 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;。)
uj5u.com熱心網友回復:
這是重構代碼的一種方法:
bool isLeapYear(int year) {
assert(!year.isNegative);
return year % 4 == 0 && year % 100 != 0 ||
year % 4 == 0 && year % 100 == 0 && year % 400 == 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/352800.html
標籤:镖
