Uploaded image for project: 'Rules Repository'
  1. Rules Repository
  2. RSPEC-1871

Two branches in a conditional structure should not have exactly the same implementation

    Details

    • Type: Code Smell Detection
    • Status: Active
    • Resolution: Unresolved
    • Labels:
    • Message:
      The code of this ["case"|branch] is a duplicate; refactor so that all ["case" blocks|branches] are unique.
    • Highlighting:
      Hide
      • Primary: 2nd block
      • Additional: 1st block
        • Message: Original

      All characters in both blocks should be underlined.

      Show
      Primary: 2nd block Additional: 1st block Message: Original All characters in both blocks should be underlined.
    • Default Severity:
      Major
    • Impact:
      Low
    • Likelihood:
      High
    • Default Quality Profiles:
      Sonar way
    • Targeted languages:
      PL/I, VB6
    • Covered Languages:
      ABAP, C#, C, C++, Cobol, Flex, Go, Java, JavaScript, Kotlin, Objective-C, PHP, PL/SQL, Python, RPG, Ruby, Scala, Swift, T-SQL, TypeScript, VB.Net
    • Irrelevant for Languages:
      HTML, XML
    • Remediation Function:
      Constant/Issue
    • Constant Cost:
      10min
    • Analysis Level:
      Syntactic Analysis
    • Analysis Scope:
      Main Sources
    • Common Rule:
      Yes
    • CPPCheck:
      duplicateBranch
    • ESLint-SonarJS:
      no-duplicated-branches
    • FindBugs:
      DB_DUPLICATE_SWITCH_CLAUSES, DB_DUPLICATE_BRANCHES
    • ReSharper:
      ConditionalTernaryEqualBranch

      Description

      Having two cases in a switch statement or two branches in an if chain with the same implementation is at best duplicate code, and at worst a coding error. If the same logic is truly needed for both instances, then in an if chain they should be combined, or for a switch, one should fall through to the other.

      Noncompliant Code Example

      switch (i) {
        case 1: 
          doFirstThing();
          doSomething();
          break;
        case 2: 
          doSomethingDifferent();
          break;
        case 3:  // Noncompliant; duplicates case 1's implementation
          doFirstThing();
          doSomething(); 
          break;
        default: 
          doTheRest();
      }
      
      if (a >= 0 && a < 10) {
        doFirstThing();
        doTheThing();
      }
      else if (a >= 10 && a < 20) {
        doTheOtherThing();
      }
      else if (a >= 20 && a < 50) {
        doFirstThing();
        doTheThing();  // Noncompliant; duplicates first condition
      }
      else {
        doTheRest(); 
      }
      

      Exceptions

      Blocks in an if chain that contain a single line of code are ignored, as are blocks in a switch statement that contain a single line of code with or without a following break.

      if(a == 1) {
        doSomething();  //no issue, usually this is done on purpose to increase the readability
      } else if (a == 2) {
        doSomethingElse();
      } else {
        doSomething();
      }
      

      But this exception does not apply to if chains without else-s, or to switch-es without default clauses when all branches have the same single line of code. In case of if chains with else-s, or of switch-es with default clauses, rule S3923 raises a bug.

      if(a == 1) {
        doSomething();  //Noncompliant, this might have been done on purpose but probably not
      } else if (a == 2) {
        doSomething();
      }
      

        Attachments

          Issue Links

          1.
          COBOL RSPEC-2585 Language-Specification Active Unassigned
          2.
          Swift RSPEC-2633 Language-Specification Active Unassigned
          3.
          Python RSPEC-2705 Language-Specification Active Unassigned
          4.
          PHP RSPEC-2863 Language-Specification Active Unassigned
          5.
          RPG RSPEC-2868 Language-Specification Active Unassigned
          6.
          JavaScript RSPEC-3022 Language-Specification Active Unassigned
          7.
          ABAP RSPEC-3703 Language-Specification Active Unassigned
          8.
          VB.NET RSPEC-3714 Language-Specification Active Unassigned
          9.
          C# RSPEC-3716 Language-Specification Active Unassigned
          10.
          T-SQL RSPEC-4100 Language-Specification Active Unassigned
          11.
          TypeScript RSPEC-4141 Language-Specification Active Unassigned
          12.
          PL/SQL RSPEC-4240 Language-Specification Active Unassigned
          13.
          Go RSPEC-4590 Language-Specification Active Unassigned
          14.
          Ruby RSPEC-4763 Language-Specification Active Unassigned
          15.
          Kotlin RSPEC-4799 Language-Specification Active Unassigned
          16.
          Scala RSPEC-4930 Language-Specification Active Unassigned
          17.
          Apex RSPEC-5002 Language-Specification Active Unassigned

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                freddy.mallet Freddy Mallet (Inactive)
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated: