조건절에서 어떤 두개의 분기가 같은 구현을 가지고 있어선 안됩니다.

 

switch 문에 case의 구현이 중복되거나 if chain이 중복된 코드를 갖는 경우, 중복 코드에서 끝나는 게 아니라 최악의 경우 코딩 에러라고 까지 볼 수 있습니다. 만약 정말로 같은 로직이 필요한 경우였다면, 케이스를 하나로 합치거나 switch 문의 경우, case를 함께 써서 같은 코드에 도달하도록 해야합니다.

규칙을 어긴 코드

switch (i) {
  case 1:
    doFirstThing();
    doSomething();
    break;
  case 2:
    doSomethingDifferent();
    break;
  case 3:  // 규칙을 어긴 코드; case 1의 구현과 중복됩니다
    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();  // 규칙을 어긴 코드; 첫번째 조건과 중복됩니다
}
else {
  doTheRest();
}

예외

코드가 1줄인 if 체인의 블록은 무시됩니다. 또한 마찬가지의 이유로 1줄의 코드를 갖는 switch block도 예외로 간주됩니다.

if (a == 1) {
  doSomething();  // 이런 경우 문제가 되지 않습니다. 보통 이런 경우는 가독성을 올리기위해 사용되는 경우가 많습니다.
} else if (a == 2) {
  doSomethingElse();
} else {
  doSomething();
}

그러나 이 예외는 else-s가 없는 if 체인일 때는 적용되지 않습니다. 마찬가지로 default:가 없는 switch-es 케이스에 코든 블락이 같은 코드라면 예외로 적용되지 않습니다. 이런 경우 규칙 {rule:java:S3923}이 반응합니다.

if (a == 1) {
  doSomething();  // 규칙을 어긴 코드, 어떤 목적을 갖고 만들어진 코드일지 모르나, 아직은 의미가 없습니다.
} else if (a == 2) {
  doSomething();
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project