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; // Unused
private int i = 5; // Unused
private 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
}
}권장방안: 메소드 선언 내에사용되지 않는 파라미터를 탐지 → 해당 소스 확인 후, 삭제 등의 조치
[펌]네이버개발자센터