重构if语句JavaScript

重构if语句JavaScript,javascript,Javascript,我想知道如何重构它?我在重复我自己我觉得这不是最好的写作方式: if (operator === "+") { strength += 2; up = 4 * strength; if (up > 40) up = 40; final.base += up; } else if (operator === "-") { up = 4 * strength; if (up > 40) up = 40; final.base -=

我想知道如何重构它?我在重复我自己我觉得这不是最好的写作方式:

if (operator === "+") {
    strength += 2;
    up = 4 * strength;
    if (up > 40) up = 40;
    final.base += up;
} else if (operator === "-") {
    up = 4 * strength;
    if (up > 40) up = 40;
    final.base -= up;
    strength -= 2;
}

因为位置很重要,所以我真的看不到正确重构的方法。有什么方法可以清除此函数吗?

如果以后不使用
up
,可以使用
Math.min
将其编写得更紧凑

if (operator === "+") {
    strength += 2;
    final.base += Math.min(40, 4 * strength);
} else if (operator === "-") {
    final.base -= Math.min(40, 4 * strength);
    strength -= 2;
}

为了解决复制问题,您可以添加一个
乘数
因子,因为这里变化的大部分只是符号


只有当
操作员
-
+
时,此操作才有效。如果它像“代码> */CODE >,这将像操作符是代码> +/<代码>

您可以考虑将逻辑写入一系列条件三元运算符语句:

let isAdd = operator === '+'
strength += isAdd ? 2 : 0;
up = 4 * strength;
if(up > 40) up = 40;
final.base += isAdd ? up : (-1 * up)
strength -= isAdd ? 0 : 2;

您可以将操作放在对象中:

const obj = {
    "+" : {
        strength : prevStrength => prevStrength + 2,
        finalBase: (prevFinalBase , up) =>  prevFinalBase + Math.min(40, 4 * strength)
    },  
    "-" : {
        strength : prevStrength => prevStrength - 2,
        finalBase: (prevFinalBase , up) => prevFinalBase - Math.min(40, 4 * strength)
    }
}

strength = obj[operator].strength(strength);
finalBase = obj[operator].finalBase(finalBase);
var运算符=“+”;
var强度=3;
var最终基准=5;
常量对象={
"+": {
强度:prevStrength=>prevStrength+2,
最终数据库:(prevFinalBase,up)=>prevFinalBase+Math.min(40,4*强度)
},
"-": {
强度:prevStrength=>prevStrength-2,
最终数据库:(prevFinalBase,up)=>prevFinalBase-Math.min(40,4*强度)
}
}
强度=对象[操作员]。强度(强度);
finalBase=obj[运算符].finalBase(finalBase);
console.log({
力量
最终数据库
})
这个怎么样

 /*ASCII Code For "-" = 45, "+" = 43*/
 operator = (44-operator.charCodeAt(0));
 if(operator > 0) strength += 2;
 up = 4*strength;
 if(up > 40) up = 40;
 final.base = final.base + (operator*up);
 if(operator < 0) strength -= 2;
“-”=45,“+”=43的ASCII码*/ 运算符=(44运算符.charCodeAt(0)); 如果(操作员>0)强度+=2; 向上=4*强度; 如果(上升>40)上升=40; final.base=final.base+(运算符*up); 如果(操作员<0)强度-=2;
对于preserve
up
变量,我将执行以下操作:

if (operator === "+")
{
    up = Math.min(4 * (strength += 2), 40);
    final.base += up;
}
else if (operator === "-")
{
    final.base -= (up = Math.min(4 * strength, 40));
    strength -= 2;
}
如果不需要
up
变量,可以简化为:

if (operator === "+")
{
    final.base += Math.min(4 * (strength += 2), 40);
}
else if (operator === "-")
{
    final.base -= Math.min(4 * strength, 40);
    strength -= 2;
}
如果您不需要
up
变量,并且您只有
+
-
运算符,那么您可以这样做:

strength += (operator === "+") ? 2 : 0;
final.base += (operator === "+" ? 1 : -1) * Math.min(4 * strength, 40);
strength -= (operator === "-") ? 2 : 0;

我的答案不是重构
if..else
——而是要提前思考你的应用程序如何发展,而是要做出正确的选择

在逻辑复杂的大型应用程序中,您必须抽象方法,以使您的代码更加灵活

例如,让
Operations
类抽象出
if..else
开关,您可以扩展它,怎么样

类操作{
静态增强(基础、强度){
base=parseInt(base);
强度=parseInt(强度);
强度+=2;
基础+=数学最小值(40,4*强度);
回报[基础,力量];
}
静态负(基础、强度){
base=parseInt(base);
强度=parseInt(强度);
基础-=数学最小值(40,4*强度);
强度-=2;
回报[基础,力量];
}
静态do(操作){
常量运算符={
“+”:Operations.plus,
“-”:Operations.减号
}
常量args=Object.values(arguments).slice(1);
if(!运算符[操作]){
返回args;
}
返回运算符[operation].apply(null,args);
}
}
设final={base:10};
强度=10;
让新基地、新力量;
console.log('Before.base:',final.base,'strength:',strength);
//如果运算符上有其他项,则为否(:
[newBase,newStrength]=Operations.do('+',final.base,strength);
力量=新力量;
final.base=newBase;
console.log(“+”操作后的.base:”,final.base,'strength:”,strength);
[newBase,newStrength]=Operations.do('-',final.base,strength);
力量=新力量;
final.base=newBase;

console.log('After“-”operation.base:',final.base,'strength:',strength);
重构大型else if梯形图的常用方法是通过关联数组循环。请看这里:如果没有其他内容,则使用
if(up>40)up=40;
根本不依赖条件。经过一些重构后,我认为您的原始代码更好。正如我刚才所说,位置非常重要,所以我不能这样做。如果运算符为“加”,我必须在递增后得到up,如果运算符为“减”是的,你说得对@num8er。只有当操作符是
+
-
时,这才有效。很好,我正在添加一个编辑器这是一个很好的主意,而且它尊重位置,谢谢!@FlickaMin如果你想同时更新
向上
并增加
基值,那么,
final.base+=up=Math.min(40,4*强度)
第二种方法行不通,请注意,
final.base
并不总是递增的…@Shidersz,这就是我添加免责声明的原因。我想,你不明白我的意思。我相信你忘了用这个
final.base+=Math.min(40,4*强度);
替换
final.base=final.base+(operator==“+”Math.min(40,4*strength):-Math.min(40,4*strength));
或者可以这样:
final.base+=(操作符==“+”?1:-1)*Math.min(40,4*strength);
正确!我认为上面有更好的答案!
strength += (operator === "+") ? 2 : 0;
final.base += (operator === "+" ? 1 : -1) * Math.min(4 * strength, 40);
strength -= (operator === "-") ? 2 : 0;