PMD요구수준 [펌]네이버개발자센터
하루업무가 종료되기전 오늘 짠코드들을 PMD 및 Findbugs로 돌린다.
현재 진행중인 프로젝트 요구사항으로 .
.....Rule#01. EmptyCatchBlock설명: 빈 catch문 사용오류코드:public void doSomething() {try{FileInputStream fis = new FileInputStream("/tmp/bugger");}catch (IOException ioe){//}}권장방안: Catch Block에 반드시 예외를 다루는 코드를 작성--------------------------------------------------------------------------------Rule#02. EmptyIfStmt설명: 빈 if문 사용오류코드:public class Foo {void bar(int x) {if (x == 1) {//}}}권장방안: 빈 if 구문의 사용을 피하도록 함--------------------------------------------------------------------------------Rule#03. EmptyWhileStmt설명: 빈 while문 사용오류코드:public class Foo {void bar(int a, int b) {while (a == b) {//}}}권장방안: 빈 while 구문 사용을 피하도록 함--------------------------------------------------------------------------------Rule#04. EmptyTryBlock설명: 빈 try 블록 사용오류코드:public class Foo {public void bar() {try{}catch (Exception e){e.printStackTrace();}}}권장방안: 내용이 없는 try 블록이 없어야 함--------------------------------------------------------------------------------Rule#05. EmptyFinallyBlock설명: 빈 finally 블록 사용오류코드:public class Foo {public void bar() {try{int x=3;}finally{//}}}권장방안: 내용이 없는 finally 블록이 존재하지 말아야 함--------------------------------------------------------------------------------Rule#06. UnnecessaryConversionTemporary설명: 불필요한 String 변환작업오류코드:public String convert(int x) {String foo = new Integer(x).toString();return foo;}권장방안: 기본 데이터 타입을 String으로 변환할 때 불필요한 임시 변환 작업을 피하도록 함--------------------------------------------------------------------------------Rule#07. EmptyStatementNotInLoop설명: 필요없는 ;문장 존재오류코드:public class MyClass {public void doit() {;System.out.println("look at the extra semicolon");;}}권장방안: 필요없는 문장 (;)이 없어야 함--------------------------------------------------------------------------------Rule#08. WhileLoopsMustUseBraces설명: 중괄호 없는 while문오류코드:public void doSomething() {while (true)x++;}권장방안: 중괄호없이 사용된 while문의 사용은 바람직하지 못한 코딩 습관임 (피해야 함)--------------------------------------------------------------------------------Rule#09. AssignmentInOperand설명: 피연산자 내 할당문 사용오류코드:public class Foo {public void bar() {int x = 2;if ( (x = getX() ) == 3) {System.out.println("3!");}}private int getX() {return 3;}}권장방안: 피연산자내에 할당문이 없어야 함. 해당 코드를 복잡하고 가독성이 떨어지게 만듬--------------------------------------------------------------------------------Rule#10. UnnecessaryParentheses설명: 불필요한 괄호사용오류코드:public class Foo {boolean bar() {return (true);}}권장방안: 괄호가 없어도 되는 상황에서 불필요한 괄호를 사용할 경우 마치 메소드 호출처럼 보여서 소스 코드의 가독성을 떨어뜨릴 수 있음--------------------------------------------------------------------------------Rule#11. SimplifyBooleanExpressions설명: 불필요 boolean 연산 시도오류코드:public class Bar {private boolean bar = (isFoo() == true);public isFoo() {return false;}}권장방안: boolean 사용 시 불필요한 비교 연산을 피하도록 함--------------------------------------------------------------------------------Rule#12. SwitchStmtsShouldHaveDefault설명: default 없는 switch 구문 사용오류코드:public class Foo {public void bar() {int x = 2;switch (x) {case 2;int j = 8;}}}권장방안: Switch구문에는 반드시 default label이 있어야 함--------------------------------------------------------------------------------Rule#13. AvoidReassigningParameters설명: parameter 값 재할당 시도오류코드:public class Foo {private void foo(String bar) {bar = "something else";}}권장방안: 넘겨받는 메소드 parameter 값을 직접 변경하지 말아야 함.--------------------------------------------------------------------------------Rule#14. FinalFieldCouldBeStatic설명: final field의 static 전환오류코드:public class Foo {public final int BAR = 42;}권장방안: final field를 static으로 변경하면 overhead를 줄일 수 있음--------------------------------------------------------------------------------Rule#15. EqualsNull설명: equals()을 이용한 null 비교오류코드:class Bar {void foo() {String x = "foo";if (x.equals(null)) {doSomething();}}}권장방안: null 값과 비교하기 위해 equals 메소드를 사용하지 말아야 함--------------------------------------------------------------------------------Rule#16. SimpleDateFormatNeedsLocale설명: 지역코드없는 SimpleDateFormat 사용오류코드:public class Foo {private SimpleDateFormat sdf = new SimpleDateFormat("pattern");}권장방안: SimpleDateFormat 인스턴스를 생성할때 Locale 을 지정하는 것이 바람직함--------------------------------------------------------------------------------Rule#17. ImmutableField설명: 생성자 지정 변수의 final 미적용오류코드:public class Foo {private int x;public Foo() {x = 7;}public void foo() {int a = x + 2;}}권장방안: 생성자를 통해 할당된 변수를 Final로 선언하는 것이 바람직함--------------------------------------------------------------------------------Rule#18. AssignmentToNonFinalStatic설명: static 필드의 잘못된 사용오류코드:public class StaticField {static int x;public FinalFields(int y) {x = y;}}권장방안: static 필드의 안전하지 않은 사용 가능성이 존재--------------------------------------------------------------------------------Rule#19. AvoidSynchronizedAtMethodLevel설명: synchronization의 과다적용오류코드:public class Foo {synchronized void foo() {}}권장방안: mothod 레벨의 synchronization 보다 block 레벨 synchronization 을 사용하는 것이 바람직함--------------------------------------------------------------------------------Rule#20. AbstractClassWithoutAbstractMethod설명: 추상클래스 정의 오류오류코드:public abstract class Foo {void int method1() {// ...}void int method2() {// ...}}권장방안: Abstract Class내에 Abstract Method가 존재하지 않음--------------------------------------------------------------------------------Rule#21. UncommentedEmptyMethod설명: 빈 메소드 주석표기오류코드:public void doSomething() {}권장방안: 빈 메소드에 빈메소드임을 나타내는 주석을 추가할 것--------------------------------------------------------------------------------Rule#22. AvoidConstantsInterface설명: 인터페이스에 상수 적용오류코드:public interface ConstantsInterface {public static final int CONSTANT1 = 0;public static final String CONSTANT2 = "1";}권장방안: Interface는 클래스의 behavior 을 구현하는 데에만 사용해야 함--------------------------------------------------------------------------------Rule#23. DuplicateImports설명: import문의 중복 선언오류코드:import java.lang.String;import java.lang.*;public class Foo {}권장방안: import문은 중복 선언이 없어야 함--------------------------------------------------------------------------------Rule#24. ImportFromSamePackage설명: 불필요한 import문 선언오류코드:package foo;import foo.Buz;import foo.*;public class Bar {}권장방안: 동일 패키지에 있을 때는 import문을 사용할 필요가 없음--------------------------------------------------------------------------------Rule#25. SystemPrintln설명: System.out.print 사용오류코드:class Foo{public void testA () {System.out.println("Entering test");}}권장방안: System.out.print 사용을 피해야 함. 전용 로거를 사용할 것을 권장--------------------------------------------------------------------------------Rule#26. VariableNamingConventions설명: 변수명에 밑줄 사용오류코드:public class Foo {public static final int MY_NUM = 0;public String myTest = "";DataModule dmTest = new DataModule();}권장방안: final이 아닌 변수는 밑줄을 포함하지 말아야 함--------------------------------------------------------------------------------Rule#27. MisleadingVariableName설명: 변수명에 잘못된 prefix 사용오류코드:public class Foo {public void bar(String m_baz) {int m_boz = 42;}}권장방안: non-field 이름이 m_ 으로 시작하지 말아야 함--------------------------------------------------------------------------------Rule#28. AvoidArrayLoops설명: 루프문을 이용한 배열복사오류코드:public class Test {public void bar() {int[] a = new int[10];int[] b = new int[10];for (int i=0;i<10;i++) {b[i]=a[i];}}}권장방안: 배열의 값을 루프문을 이용하여 복사하는 것 보다, System.arraycopy() 메소드를 이용하여 복사하는 것이 효율적이며 수행 속도가 빠름--------------------------------------------------------------------------------Rule#29. UnnecessaryWrapperObjectCreation설명: 불필요한 WrapperObject 생성오류코드:public int convert(String s) {int i, i2;i = Integer.valueOf(s).intValue();i2 = Integer.valueOf(i).intValue();권장방안: 불필요한 Wrapper Object가 생성되었음. 탐지된 코드는 삭제하고, 별도의 parse관련 전용 메소드 사용을 권장--------------------------------------------------------------------------------Rule#30. AvoidThrowingRawExceptionTypes설명: 비가공 Exception 사용오류코드:public class Foo {public void bar() throws Exception {throw new Exception();}}권장방안: 가공되지 않은 Exception을 throw하는 것은 비추천--------------------------------------------------------------------------------Rule#31. AvoidThrowingNullPointerException설명: NullPointerException 사용오류코드:public class Foo {void bar() {throw new NullPointerException();}}권장방안: NullPointerException을 throw하는 것은 비추천--------------------------------------------------------------------------------Rule#32. StringInstantiation설명: 불필요 String Instance 생성오류코드:public class Foo {private String bar = new String("bar");}권장방안: 불필요한 String Instance를 생성하는 코드가 없어야 함. 간단한 형태의 코드로 변경 필요--------------------------------------------------------------------------------Rule#33. StringToString설명: 불필요한 toString() 메소드 사용오류코드:public class Foo {private String baz() {String bar = "howdy";return bar.toString();}}권장방안: String 객체에서 toString()함수를 사용하는 것은 불필요함. 해당 코드 제거 필요--------------------------------------------------------------------------------Rule#34. InefficientStringBuffering설명: StringBuffer 함수내 결합코드 사용오류코드:StringBuffer sb = new StringBuffer( "tmp =" +System.getProperty("java.io.tmpdir") );권장방안: StringBuffer 함수내에서 비문자열 연산 이용하여 직접 결합하는 코드 사용을 탐지. append 메소드 사용을 권장--------------------------------------------------------------------------------Rule#35. InefficientEmptyStringCheck설명: 빈문자열 확인오류코드:public class Foo {void bar(String string) {if (string != null && string.trim().size() > 0) {doSomething();}}}권장방안: 빈 문자열 확인을 위해 String.trim().length() 을 사용하는 것은 피하도록 함. whitespace/Non-whitespace 확인을 위한 별도의 로직 구현을 권장--------------------------------------------------------------------------------Rule#36. UselessStringValueOf설명: 불필요한 String.valueOf 사용오류코드:public String convert(int i) {String s;s = "a" + String.valueOf(i);return s;}권장방안: String 을 append 할 경우, String.valueOf 함수를 사용할 필요 없음--------------------------------------------------------------------------------Rule#37. UnusedPrivateField설명: 미사용 private field오류코드:public class Something {private static int FOO = 2; // Unusedprivate int i = 5; // Unusedprivate int j = 6;public int addOne() {return j++;}}권장방안: 사용되지 않는 Private field의 탐지 → 해당 소스 확인 후, 삭제 등의 조치--------------------------------------------------------------------------------Rule#38. UnusedPrivateMethod설명: 미사용 private method오류코드:public class Something {private void foo() {} // unused}권장방안: 사용되지 않는 Private Method 선언을 탐지 → 해당 소스 확인 후, 삭제 등의 조치--------------------------------------------------------------------------------Rule#39. UnusedFormalParameter설명: 미사용 method parameter오류코드:public class Foo {private void bar(String howdy) {// howdy is not used}}권장방안: 메소드 선언 내에사용되지 않는 파라미터를 탐지 → 해당 소스 확인 후, 삭제 등의 조치[펌]네이버개발자센터






