首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何重构和使这些if语句更好?

如何重构和使这些if语句更好?
EN

Stack Overflow用户
提问于 2021-12-20 16:28:26
回答 2查看 226关注 0票数 -1

我有大量的if语句,我的任务是重构并提高可读性。

if语句依赖于2/3 JSON键,我想不出一种使其更好的方法。

有人给我小费吗?

这些if语句嵌套在其他一些if语句中,但是我使用规则引擎来帮助分解它。但我觉得规则引擎可能无法将其分解为更好的解决方案。

我在想一些像地图或查找表之类的东西,但我无法处理如何做到这一点。

代码语言:javascript
运行
复制
if (LM <= 15) {
  if (COMWT <= 25000) {
    COST = 225.0;
  }
  
  if (COMWT > 25000) {
    if (COMWT <= 30000) {
      COST = 275.0;
    }
  }
}

if (LM > 15) {
  if (LM <= 25) {
    if (COMWT <= 25000) {
      COST = 250;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 300.0;
      }
    }
  }
}

if (LM > 25) {
  if (LM <= 40) {
    if (COMWT <= 25000) {
      COST = 275;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 325.0;
      }
    }
  }
}

if (LM > 40) {
  if (LM <= 55) {
    if (COMWT <= 25000) {
      COST = 325;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 350.0;
      }
    }
  }
}

if (LM > 55) {
  if (LM <= 70) {
    if (COMWT <= 25000) {
      COST = 375;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 400.0;
      }
    }
  }
}

if (LM > 70) {
  if (LM <= 85) {
    if (COMWT <= 25000) {
      COST = 425;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 450.0;
      }
    }
  }
}

if (LM > 85) {
  if (LM <= 100) {
    if (COMWT <= 25000) {
      COST = 475;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 500.0;
      }
    }
  }
}

if (LM > 100) {
  if (LM <= 125) {
    if (COMWT <= 25000) {
      COST = 525;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 550.0;
      }
    }
  }
}

if (LM > 125) {
  if (LM <= 150) {
    if (COMWT <= 25000) {
      COST = 575;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = 600.0;
      }
    }
  }
}

if (LM > 150) {
  if (LM <= 300) {
    if (COMWT <= 25000) {
      COST = LM * 3;
    }
    
    if (COMWT > 25000) {
      if (COMWT <= 30000) {
        COST = LM * 3.5;
      }
    }
  }
}

if (LM > 300) {
  if (COMWT <= 25000) {
    COST = LM * 2.5;
  }
  
  if (COMWT > 25000) {
    if (COMWT <= 30000) {
      COST = LM * 3;
    }
  }
}
EN

回答 2

Stack Overflow用户

发布于 2021-12-20 16:42:06

将检查存储在一个变量中,并从最大的开始,然后一直工作到最低。

代码语言:javascript
运行
复制
const comwtLow = COMWT <= 25000;
const comwtHigh = COMWT > 25000 && COMWT <= 30000

let COST;

if (LM > 300 && comwtLow) COST = LM * 2.5;
else if (LM > 300 && comwtHigh) COST = LM * 3;
else if (LM > 150 && comwtLow) COST = LM * 3;
else if (LM > 150 && comwtHigh) COST = LM * 3.5;
else if (LM > 125 && comwtLow) COST = 575;
else if (LM > 125 && comwtHigh) COST = 600;
....

如果没有if/else,您可以使用对象执行数据结构,并存储费用的基本部分。使用循环查找与之匹配的费用结构并生成成本。

代码语言:javascript
运行
复制
const fees = {
  300: {
    low: { multi: 2.5 },
    high: { multi: 3 },
  },
  150: {
    low: { multi: 3 },
    high: { multi: 3.5 },
  },
  125: {
    low: { flat: 575 },
    high: { flat: 600 },
  },
  0: {
    low: { flat: 225 },
    high: { flat: 275 },
  },
}

const feesValues = Object.keys(fees).map(Number).sort((a,b)=>b-a);

function getCost (lm, comwt) {
  const range = comwt <= 25000 ? "low" : "high";
  const feeData = fees[feesValues.find(value => value < lm)];
  const { multi = 0, flat = 0 } = feeData[range];
  return lm * multi + flat;
}

console.log(getCost(400, 10000));
console.log(getCost(130, 10000));

这段代码期望在所有事情上都有匹配。如果不是这样的话,您需要在它周围添加更多的逻辑和保护。

票数 1
EN

Stack Overflow用户

发布于 2021-12-20 17:26:06

您可以通过将它存储到一个对象数组中来完成。

代码语言:javascript
运行
复制
Note: Please verify all conditions before using this code

代码语言:javascript
运行
复制
const conditionList = [
    {
        high: 15,
        low: 0,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 225
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 275
            }
        ]
    },
    {
        high: 25,
        low: 15,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 250
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 300
            }
        ]
    },
    {
        high: 40,
        low: 25,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 275
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 325
            }
        ]
    },
    {
        high: 55,
        low: 40,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 325
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 350
            }
        ]
    },
    {
        high: 70,
        low: 55,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 375
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 400
            }
        ]
    },
    {
        high: 85,
        low: 70,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 425
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 450
            }
        ]
    },
    {
        high: 100,
        low: 85,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 475
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 500
            }
        ]
    },
    {
        high: 125,
        low: 100,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 525
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 550
            }
        ]
    },
    {
        high: 150,
        low: 125,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => 575
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => 600
            }
        ]
    },
    {
        high: 300,
        low: 150,
        comwt: [
            {
                high: 25000,
                low: 0,
                cost: lm => lm * 3
            },
            {
                high: 30000,
                low: 25000,
                cost: lm => lm * 3.5
            }
        ]
    }
];


function cal(lm, cmwt) {
    let costd = 0;
    conditionList.forEach(item => {
        if (lm >= item.low && lm <= item.high) {
            item.comwt.forEach(c => {
                if (cmwt >= c.low && cmwt <= c.high) {
                    costd = c.cost(lm);
                }
            });
        }
    });

    return costd;
}

console.log(cal(75, 24000));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70424967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档