我有一个可怕的嵌套if。将来可能还会有更多的行。
if (people < 10) {
price = 500;
} else if (people >= 10 && people < 25) {
price = 350;
} else if (people >= 25 && people < 100) {
price = 250;
} else if (people >= 100) {
price = 200;
}
价格随着交易量的增加而下降。我该如何重构它以使其更易于维护/可读?
编辑:我尝试了一个开关,效果没有改善吗?
答案 0 :(得分:3)
您可以选择提前退出功能。上一次检查是进行下一次检查或获得最大结果的条件。
优点是可以防止else if
陈述的链条,并提供更好的可维护性。
function getPrice(people) {
if (people < 10) {
return 500;
}
if (people < 25) {
return 350;
}
if (people < 100) {
return 250;
}
return 200;
}
var price = getPrice(people);
更多阅读内容:
答案 1 :(得分:2)
一种选择是使用定义阈值的数组,然后.find
使用数组中的适当值。这将非常简洁,尤其是在存在许多阈值的情况下:
const thresholds = [
[100, 200], // need 100+ people for the price to be 200
[25, 250], // else need 25+ people for the price to be 250
[10, 350],
[0, 500]
];
function findPrice(people) {
return thresholds.find(([limit]) => people >= limit)[1];
}
console.log(findPrice(53)); // 53 people
console.log(findPrice(25));
console.log(findPrice(24));
答案 2 :(得分:1)
好吧,当支票保持这种形式时,您不需要>=
支票:
if (people < 10) {
price = 500;
} else if (people < 25) {
price = 350;
} else if (people < 100) {
price = 250;
} else {
//people count is implicitly greater than 100
price = 200;
}
在每个(下一个)步骤中,人员计数都隐含地大于上一个检查,例如如果people < 10
产生false
,则该值隐式大于9或>= 10
。因此,不需要重复检查,因此可以省略。
答案 3 :(得分:0)
function applyConf(v) {
return [{
// false means infinite
min: false,
max: 9,
value: 500,
}, {
min: 10,
max: 24,
value: 350,
}, {
min: 25,
max: 99,
value: 250,
}, {
min: 100,
max: false,
value: 200,
}].find(({
min,
max,
}) => (min === false || v >= min) && (max === false || v <= max)).value;
}
console.log(applyConf(-10));
console.log(applyConf(8));
console.log(applyConf(20));
console.log(applyConf(80));
console.log(applyConf(100));
console.log(applyConf(100000));
答案 4 :(得分:0)
如果使用如下所示的切换条件,我更愿意而不是很多
function getPrice(people)
{
switch(true){
case people<10: return 500;
case people<25: return 350;
case people<100: return 250;
default: return 200;
}
}