【问题标题】:refactoring large if else satement in java在java中重构大型if else语句
【发布时间】:2014-01-28 21:41:15
【问题描述】:

我正在尝试重构一些代码,所以如果可能的话,我没有大的 if / else if 语句。

代码如下:

if (Character.getNumericValue(num) == 0 ) {
        return bar0;
    }
    else if (Character.getNumericValue(num) == 1 ) {
        return bar1;
    }
    else if (Character.getNumericValue(num) == 2 ) {
        return bar2;
    }
    else if (Character.getNumericValue(num) == 3 ) {
        return bar3;
    }
    else if (Character.getNumericValue(num) == 4 ) {
        return bar4;
    }
    else if (Character.getNumericValue(num) == 5 ) {
        return bar5;
    }
    else if (Character.getNumericValue(num) == 6 ) {
        return bar6;
    }
    else if (Character.getNumericValue(num) == 7 ) {
        return bar7;
    }
    else if (Character.getNumericValue(num) == 8 ) {
        return bar8;
    }
    else if (Character.getNumericValue(num) == 9 ) {
        return bar9;
    }
    else {
        return bar10;
    }

基本上它检查 char num 是否等于 int 0-9,然后返回相关的数字 bar(它是字符串类型)。有什么办法可以改善吗?

我希望它像

if (Character.getNumericaValue(num) == x {
   return barx;
}
else 
   return bar10;

如果这有意义的话。

【问题讨论】:

    标签: java if-statement refactoring


    【解决方案1】:

    创建一个值数组并执行类似的操作

    if(Character.getNumericaValue(num) < 10) {
        return array[Character.getNumericaValue(num)];
    } else {
        return bar10;
    }
    

    当然,如果您确定 num 不会小于 0。

    【讨论】:

    • 如果 barN 的值在执行过程中发生变化,他必须在每次执行 if 语句时构建这个数组。在这种情况下,switch 语句更有效。
    • @IraBaxter OP 应该将每个 barN 重构为 bars[n],包括更新。维护一组十个索引变量本身就是一种味道。
    • 在我的情况下,它们不会改变,所以这是可行的。但是是的,如果我确实需要更改它,我可以在数组中添加另一个字符串。
    【解决方案2】:

    您可以拥有一个条形数组bars,该方法将根据您传递的索引返回bar 元素。

    public bar getBar(num){
        return bars[Character.getNumericValue(num)];
    }
    

    确保根据您的要求涵盖所有边缘情况。

    【讨论】:

      【解决方案3】:

      您可以创建一个数组来保存您的条形值:

      Bar[] arr = {bar0,.....,bar9};
      int numb = Character.getNumericValue(num);
      if(numb < 0 || numb >= arr.length){
         return bar10;
      }
      else {
         return arr[numb];
      }
      

      【讨论】:

      • 一个switch语句好像效率更高。
      【解决方案4】:

      bar0bar10 到底是什么?

      您可以使用数组来查找所需的元素:

      String[] bars = { bar0, bar1, ... };  // etc.
      
      int numericValue = Character.getNumericValue(num);
      if (numericValue >= 0 && numericValue <= 9) {
          return bars[numericValue];
      } else {
          return bar10;
      }
      

      【讨论】:

      • bar0 是你周五晚上喝啤酒的第一家酒吧...barX 是以下系列:)
      • 这也有效,但选择的答案更简洁。 bar0 - bar9 表示要打印出来的 POSTNET 代码,给定一个数字 0-9。例如:bar0 = "||:::";,而 bar10 只是一个返回错误的字符串,以防方法被传递给无效字符。
      • 我的意思是,“什么 typebar0bar10?”,显然它们是 Strings。
      猜你喜欢
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2014-10-29
      相关资源
      最近更新 更多