【问题标题】:Is this considered code duplication?这被认为是代码重复吗?
【发布时间】:2013-08-08 13:33:58
【问题描述】:

如果我想使用一个 case 语句测试 enum 的多个值,并且 80%​​ 的 case 语句需要两个不同的 if 检查,那么一遍又一遍地重用该代码是否被认为是糟糕的编码?

我实际上使用了ctrl+cctrl+v,感觉代码神会杀了我。

以下是一些观点:

switch(value) {

   case value1:
   {
      if(something) { //do something; }

      if(somethingElse) { // do something else; }

      //unique for value1
   }
   break;

   case value2:
   {
      //unique for value2
   }
   break;

   case value3:
   {
      if(something) { //do something; }

      if(somethingElse) { // do something else; }

      //unique for value3
   }
   break;

   case value4:
   {
      if(something) { //do something; }

      if(somethingElse) { // do something else; }

      //unique for value4
   }
   break;

   case value5:
   {
      //unique for value5
   }
   break;

   default:
   break;

我的value 是从enum 随机生成的,被称​​为随机次数。目标是让value 成为任何随机“值”并且完全独立于其他情况。

【问题讨论】:

  • 就不能让你们的相似案例互相串流吗?
  • 这显然是重复,问题是是否值得通过命令模式、枚举中的代码等来修复。
  • @SotiriosDelimanolis 你能详细说明一下吗?
  • 第一步应该是为if(something)if(somethingElse)创建一个函数
  • 我不知道你是否忘记了,只是省略或不知道,但每个case 的末尾应该有一个break 语句,除非你希望代码流过(即value2value3value4value5 中的代码,如果value1 为真,如果没有break 语句,也会执行)。

标签: java switch-statement code-organization


【解决方案1】:

您可能希望将此重复的代码放入一个方法中。

public void yourFunctionCall() {
    //Could even pass the value if needed
    if(something) { //do something; }

    if(somethingElse) { // do something else; }
}

然后在你的情况下调用这个方法:

switch(value) {

case value1: {
    yourFunctionCall();
    //or yourFunctionCall(value1);
    //unique for value1
} //etc..

【讨论】:

    【解决方案2】:

    如果这是一段可重用的代码,你最好把它变成一个方法。如果没有,您可以简单地添加另一个 switch case,使用 fall-through 覆盖公共代码:

    switch (value) {
    
       case value1:
    
       case value3: // using fall-through
    
       case value4:
       {
          if (something) { /* do something; */ }
    
          if (somethingElse) { /* do something else; */ }
       }
    }
    
    switch (value) {
    
       case value1:
       {
          // unique for value1
          break;
       }
    
       case value2:
       {
          // unique for value2
          break;
       }
    
       // other unique cases
    }
    

    【讨论】:

      【解决方案3】:

      使用函数可能更好,但这里有另一种方式:

      case value1:
      case value3:
      case value4:
        if(something) { /* do something */ }
      
        if(somethingElse) { /* do something else */ }
      
        if (value1)
        {
          //unique for value1
        }
        else if (value3)
        {
          //unique for value3
        }
        else // if (value4)
        {
          //unique for value4
        }
        break;
      
      case value2:
        ...
      

      或使用嵌套开关:

      case value1:
      case value3:
      case value4:
        if(something) { /* do something */ }
      
        if(somethingElse) { /* do something else */ }
      
        switch(value)
        {
          case value1: /* unique for value1 */ break;
          case value3: /* unique for value3 */ break;
          case value4: /* unique for value4 */ break;
        }
        break;
      
      case value2:
        ...
      

      请谨慎使用,我不建议将任何一种用于生产代码。

      【讨论】:

      • 它是用于单元测试的......所以除了它之外不会真正使用。
      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 2011-08-11
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多