'switch-case' 구문은 너무 많은 코드 라인을 포함해서는 안됩니다.

switch 구문은 제어 흐름에서 일부 새로운 분기들을(branches) 명확하게 정의하기 위해서만 사용해야 합니다. case 문이 너무 많은 구문을 가지게 되면, 전체 제어 흐름에 대한 가독성이 급격하게 떨어집니다. 이러한 경우, case 구문 내의 내용들을 전용 메소드로 추출해야합니다. 규칙을 어긴 코드 기본 임계치 5에서: switch (myVariable) { case 0: // 규칙을 어긴 코드: 다음 case 문까지 6줄이 존재합니다. methodCall1(""); methodCall2(""); methodCall3(""); metho...

더보기

메소드는 너무 많은 리턴문을 포함해서는 안됩니다.

너무 많은 return 문을 가지는 것은 실행 흐름이 return 문을 만나는 경우 마다 끝나기 때문에, 메소드의 필수적인 복잡성을 증가시킵니다. 이것은 메소드를 읽기 어렵고 로직을 이해하기 어렵게 만듭니다. 규칙을 어긴 코드 기본 임계치 3에서: public boolean myMethod() { // Noncompliant; there are 4 return statements if (condition1) { return true; } else { if (condition2) { return false; } else { return true...

더보기

매직넘버는 사용되서는 안됩니다.

매직넘버는 반복문의 반복 횟수를 제한하거나 특정 속성의 값을 테스트하는 등 뜬금없이 사용되는 숫자로, 코드의 구문 내에서 직접적으로 사용됩니다. 매직 넘버를 사용하는 것은 코드를 작성할 때 명확하고 간단해보일 수 있지만, 디버깅할 때에는 덜 명확하고 간단하지 않습니다. 그렇기에 매직 넘버를 사용하기 전에 이를 명확하게 명명된 변수에 할당하여 이해할 수 있게 만들어야 합니다. -1,0 그리고 1은 매직넘버로 간주되지 않습니다. 규칙을 어긴 코드 public static void doSomething() { for(int i = 0; i < 4; i++) { // 규칙을 어긴 코드, 4 는 매직넘버입니다/ ...

더보기

파일은 너무 많은 코드 라인을 가져서는 안됩니다.

과도하게 커지는 소스파일은 너무 많은 책임을 결합하려는 경향이 있으며, 그로 인해 필연적으로 이해하거나 유지보수 하기 어렵게됩니다. 특정 임계값을 초과하는 소스파일들을 더 작은 코드 조각으로 리팩토링하는 것이 좋습니다. 이러한 작은 파일들은 이해하기도 쉽고 테스트하기도 쉬울 것입니다. If you like SONARKUBE, don’t forget to give me a star. :star2: 원문으로 바로가기

더보기

배열은 loop를 이용해서 복사되어선 안됩니다

loop를 사용해서 배열이나 배열의 하위 집합을 복사하는 행위는 코드 낭비입니다. 전체 배열을 다른 배열로 복사하고 싶다면 Arrays.copyOf를 사용하세요. 배열의 하위 집합을 다른 배열로 복사하고 싶다면 System.arraycopy을 사용하세요. 배열을 새로운 List로 만들고 싶다면 Arrays.asList를 사용하세요. 단 Arrays.asList는 원래 배열에 Collections 래퍼를 배치할 뿐이므로, 고정되지 않은 크기의 List로 만들고 싶다면 몇개의 추가적인 작업이 요구될 수 있습니다. 규칙을 어긴 코드 public void makeCopies(String[] source) { t...

더보기

"catch" 구문은 rethrow 이상의 역할을 해야합니다

포착한 예외를 rethrow하기만 하는 catch 구문은, catch를 생략하고 자동으로 bubble up 하는 것과 같은 효과가 있지만, 코드만 더 많아지고 maintainer가 ‘뭐지…?’라는 생각만 들게합니다 이러한 구문들은 제거되거나, 구문을 사용할만한 이유가 포함된, 적절한 논리가 들어가야합니다. 규칙을 어긴 코드 public String readFile(File f) { StringBuilder sb = new StringBuilder(); try { FileReader fileReader = new FileReader(fileName); BufferedReader buffer...

더보기

다이아몬드 연산("<>")이 사용 되어야 합니다

Java 7은 제네릭 코드의 범용성을 높이기 위해 다이아몬드 연산자(<>)를 도입했습니다. 예를 들어, List의 type을 선언과 생성자 모두에 선언하는 대신, <>를 사용하여 생성자 선언을 단순화할 수 있게됬습니다. 그렇게만 해도 컴파일러가 알아서 type을 유추할 수 있습니다. 참고: 이 규칙은 프로젝트의 sonar.java.source의 값이 7보다 낮은 경우(java7) 자동으로 비활성화됩니다. 규칙을 어긴 코드 List<String> strings = new ArrayList<String>(); // 규칙을 어긴 코드 Map<String,List&l...

더보기

Catch 블락은 가능한 결합 되어야 합니다

Java 7 이후부터는 여러 예외를 한 번에 catch할 수 있게 되었습니다. 따라서 여러 개의 catch 블록에 동일한 코드가 있는 경우, 가독성을 높이기 위해 하나로 결합하는게 더 낫습니다. 참고: 이 규칙은 프로젝트의 sonar.java.source의 값이 7보다 낮은 경우(java7) 자동으로 비활성화됩니다. 규칙을 어긴 코드 catch (IOException e) { doCleanup(); logger.log(e); } catch (SQLException e) { // 규칙을 어긴 코드 doCleanup(); logger.log(e); } catch (TimeoutException e...

더보기