重构使用一系列循环的简单计算器

时间:2014-03-07 14:50:46

标签: javascript refactoring

我在编程和javascript方面相当新手,而且我正在通过一些示例问题来更好地完成CodeWars.com

我刚刚完成的问题询问如下:

  

编写一个名为calculate的函数,该函数取3个值。第一个和第三个值是数字。第二个值是一个字符。如果字符是“+”,“ - ”,“*”或“/”,则该函数将返回两个数字上相应数学函数的结果。如果字符串不是指定字符之一,则该函数应返回null。

它为您提供以下代码:

function calculate(num1, operation, num2) {
 //TODO: make a basic calculator.

它根据以下测试用例检查您的代码:

Test.assertSimilar(calculate(3.2,"+", 8), 11.2, "3.2 + 8 = 11.2")
Test.assertSimilar(calculate(3.2,"-", 8), -4.8, "3.2 - 8 = -4.8")
Test.assertSimilar(calculate(3.2,"/", 8), 0.4, "3.2 / 8 = .4")
Test.assertSimilar(calculate(3.2,"*", 8), 25.6, "3.2 * 8 = 25.6")
Test.assertSimilar(calculate(-3,"+", 0), -3, "-3 + 0 = -3")
Test.assertSimilar(calculate(-3,"-", 0), -3, "-3 - 0 = -3")
Test.assertSimilar(calculate(-3,"/", 0), null, "-3 / 0 = null")
Test.assertSimilar(calculate(-3,"*", 0), 0, "-3 * 0 = 0")
Test.assertSimilar(calculate(-3,"w", 0), null, "-3 w 0 = null")

我通过运行一系列if和else if循环( JSFiddle )完成了所有测试用例:

function calculate(num1, operation, num2) {
 //TODO: make a basic calculator.
 if (operation === '+'){
   console.log(num1 + num2);
 }
 else if (operation === '-'){
   console.log(num1 - num2);
 }
 else if (operation === '/'){
   console.log(num1 / num2);
 }
 else if (operation === '*'){
   console.log(num1 * num2);
 }
 else{
   return null;
 }
}
calculate(3.2,"*", 8);
calculate(-3,"+", 0);
calculate(-3,"-", 0);

我知道这不是最优雅的解决方案,我很想找到改进和简化代码的方法。关于开始新事物的最困难的部分是能够提出正确的问题,所以如果我能得到关于如何更好地简化我的代码的一些意见,我会很高兴!

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用switch

switch (operation) {
    case '+':
        console.log(num1 + num2);
        break;
    case '-':
        console.log(num1 - num2);
        break;
    case '/':
        console.log(num1 / num2);
        break;
    case '*':
        console.log(num1 * num2);
        break;
    default:
        return null;
}

JSFiddle

有些人不喜欢开关,因为您必须记住明确包含break语句(或returnthrow),以避免代码落入下一个{{ 1}}并且可能会导致意想不到的后果(尽管如果你故意这样做,这种能力下降可能会很方便。)

除了避免重复变量名之外,case的主要优点在于,对于那些熟悉变量名称的人来说,更容易一目了然地发现正在发生的事情,而不是必须检查每个switch条件,以确切了解条件是什么,因为每个if可能会检查不同的内容。 if始终只检查一个表达式的结果。

(顺便说一下,抛出一个异常而不是返回switch可能是一个更好的主意,因为它会停止执行而不是继续使用潜在的意外行为,以防你不小心让错误的操作符进入函数。)< / p>

如果仅仅是简化是你的目标(而不是安全性,因为基于使用null的不可信输入,以下内容不安全),您可以执行以下操作:

eval

JSFiddle