본문 바로가기

PMD 설치 및 설정 방법 plug-in 설치 1. 이클립스를 실행 후 Help -> Install New Software를 선택하자. 2. add 버튼을 클릭하자. 3. 다음과 같은 창에 PMD의 다운로드 위치를 입력하자. PMD - http://sourceforge.net/projects/pmd/files/pmd-eclipse/update-site/ 4. 이후 다음과 같은 화면에서 해당하는 이클립스 버젼을 선택하자. Juno는 4, Indigo는 3이다 5. 그 다음은 NEXT NEXT FINISH로 설명을 생략. PMD 설정하기 1. window -> Preferences를 선택하자 2. Preferences 창에서 PMD -> Rule Configuration에서 자신이 필요로 하는 룰들을 선택해서 프로젝트에 적용하자. 더보기
[한글화 시리즈-21] Controversial Rules Controversial Rules이 룰셋은 어떤 이유이던 논란이되는 룰들을 포함한다. PMD의 모든 룰들은 custom ruleset을 통해서 적절하게 사용할 수 있으므로, 여기의 룰들도 필요에 따라서 적용하자. 이 룰셋의 룰들은 몇몇이 필요하다고 주장하지만 대부분은 좋아하지 않는 룰들을 포함한다. UnnecessaryConstructor이 룰은 생성자가 불필요한 경우를 경고한다. 생성자가 불필요한 경우는 클래스 내에 하나의 public 생성자외에는 어떤 한 것도 들어있지 않은 경우이다. (이거... 왜 필요하지?)public class Foo { public Foo() {} } NullAssignment변수를 정의한 이후 변수에 null을 할당하는 것은 일반적으로 나쁜 방법이다. 때로는 이런 배치가 .. 더보기
[한글화 시리즈-20] Unused Code Rules Unused Code Rules이 룰셋은 사용되지 않은 코드를 확인하는 룰들을 포함한다. UnusedPrivateFieldprivate로 접근제한된 클래스 맴버 변수들 중에 정의 되었거나 값이 할당되었지만 사용되지 않은 경우를 경고한다.public class Something { private static int FOO = 2; // FOO는 사용되지 않았다. private int i = 5; // i는 사용되지 않았다. private int j = 6; public int addOne() { return j++; } } UnusedLocalVariable지역변수들 중에 정의되었거나 값이 할당되었지만 사용되지 않은 경우를 경고한다.public class Foo { public void doSomethin.. 더보기
[한글화 시리즈-19] Security Code Guidelines Security Code Guidelines이 룰셋은 Sun이 배포한 보안 가이드라인을 확인하는 룰들을 포함한다. MethodReturnsInternalArray클래스 내부의 배열을 직접적으로 반환하면 사용자는 외부에서 임의로 내부 배열을 수정할 수 있다. 이는 매우 치명적인 오류를 발생시킬 수 있는 원인이 된다. 안전한 방법은 내부의 배열을 복사하여 전달하는 방법이다.public class SecureSystem { UserData [] ud; public UserData [] getUserData() { // 절대로 내부의 배열을 직접적으로 반환하지 말자. // System.arraycopy등을 이용하여 배열을 복사하여 전달하자. return ud; } } ArrayIsStoredDirectly생성자.. 더보기
[한글화 시리즈-18] String and StringBuffer Rules String and StringBuffer Rules이 룰셋은 String 및 StringBuffer 사용 상 발생되는 다양한 문제들에 관한 룰들을 포함한다.(단 StringBuffer는 사용 구조상 StringBuilder와 매우 비슷하다. 하지만, threadsafe 기능 때문에 StringBuilder보다는 느리지다. PMD에는 StringBuffer만 기술되어 있지만, StringBuffer와 StringBuilder는 매우 비슷하므로, 스레드 동기화 등의 기능이 필요하지 않다면, StringBuilder 사용을 고려하자.) AvoidDuplicateLiterals중복되는 문자열은 하나의 상수 필드(constant field)로 정의하는 것이 효율적이다.PMD는 기본적으로 4개 이상의 중복된 문자.. 더보기
[한글화 시리즈-17] Strict Exception Rules Strict Exception Rules이 룰셋은 오류 처리에 관한 엄격한 가이드라인을 제공한다. AvoidCatchingThrowableThrowable을 catch절에서 처리하지 말자. java.lang.Throwable은 모든 오류 및 예외에 대한 수펴클래스이며, 이 객체로 오류 처리를 하면 명확한 오류 처리를 수행할 수 없다.public class Foo { public void bar() { try { ... //throwable로 오류 처리를 하지말자. //너무 범위가 넓어 명확하지 않은 오류 처리이다. } catch (Throwable th) { th.printStackTrace(); } } } SignatureDeclareThrowsException오류 처리를 위하여 Exception을 반.. 더보기
[한글화 시리즈-16] Optimization Rules Optimization Rules이 룰셋은 성능 향상을 위한 최적화 룰들을 포함한다. LocalVariableCouldBeFinal지역 변수가 한번만 할당된다면 final로 정의할 수 있다.public class Bar { public void foo () { //이후 다시 설정되지 않는다면 final로 정의하자 String a = "a"; final String b = "b"; } } MethodArgumentCouldBeFinal전달인자가 전달된 이후 다시 할당되지 않는다면 final로 정의하자public void foo (String param) { // 위의 인자가 다시 할당되지 않는다면 아래와 같이 정의하자 // public void foo (final String param) { } Avoid.. 더보기
[한글화 시리즈-15] Naming Rules Naming Rules이 룰셋은 명명 규칙을 포함한다. (너무 길거나, 짧거나, 벗어난 명명들을 찾는다) ShortVariable너무 짧은 클래스 맴버 변수, 지역변수, 전달 인수는 피하자.public class Something { private int q = 15; // 너무 짧은 클래스 맴버 변수 public static void main( String as[] ) { // 너무 짧은 전달 인자 int r = 20 + q; // 너무 짧은 지역 변수 for (int i = 0; i 더보기
[한글화 시리즈-14] Migration Rules Migration Rules이 룰셋은 JDK 버젼별 이전에 관한 룰들을 포함하며, 이 룰셋은 바로 사용하지 말고, 각 버젼별로 포장된 룰셋을 사용하자. ReplaceVectorWithList만약 list 객체가 필요할 경우, 실행 비용이 비싼 threadsafe(멀티스레드에서 안전한 접근을 제공하는 기능)기능이 필요 없을 경우 Vector보다 조금 더 최근에 나온 java.util.ArrayList 사용을 고려하자. 하지만 threadsafe가 필요하면 Vector를 사용해야한다.public class Foo { void bar() { //threadsafe가 필요하면 Vector를 //JDK 1.5 이하 List v = new Vector(); //JDK 1.6 이상은 Generics 형을 정해야한다... 더보기
[한글화 시리즈-13] Java Logging Rules Java Logging Rules이 룰셋은 logger 사용에 관한 룰들을 포함한다. MoreThanOneLogger각 클래스마다 logger는 일반적으로 하나만 사용된다.class Foo{ Logger log = Logger.getLogger(Foo.class.getName()); // 이렇게 2개의 logger를 사용하는 경우는 매우 드믄 경우이다. // 계층에 따라서 로그 정보가 다중화 될 수 있다. Logger log2= Logger.getLogger(Foo.class.getName()); } LoggerIsNotStaticFinal대부분의 경우, logger는 static final로 정의될 수 있다.class Foo{ Logger log = Logger.getLogger(Foo.class.ge.. 더보기