본문 바로가기

PMD

[한글화 시리즈-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 < 10; i++) { // 반복문 내의 변수는 괜찮다.
      r += q;
    }
  }
}

LongVariable

너무 긴 클래스 맴버 변수, 지역변수, 전달 인수는 피하자. 17자 이상은 길다!

public class Something {
  int reallyLongIntName = -3;  // 너무 긴 클래스 맴버 변수
  public static void main( String argumentsList[] ) { //너무 긴 전달 인자
    int otherReallyLongName = -5; // 너무 긴 지역 변수 
    // 반복문에서도 너무 긴 변수는 피하자.
    for (int interestingIntIndex = 0;
             interestingIntIndex < 10;
             interestingIntIndex ++ ) {
    }
}

ShortMethodName

너무 짧은 메소드명은 피하자.

public class ShortMethod {
  public void a( int i ) { // 너무 짧은 메소드명
  }
}

VariableNamingConventions

변수 명명 규칙 - 이 규칙은 개발자가 원하는 방식으로 수정할 수 있다, 현재는, 상수(final variable) 는 대문자와 밑줄(_) 만 사용해야 하며, 상수가 아닌 변수는 밑줄을 사용할 수 없다.

public class Foo {
  //상수 명명 규칙
  public static final int MY_NUM = 0;
  //일반 변수 명명 규칙
  public String myTest = "";
  DataModule dmTest = new DataModule();
}

MethodNamingConventions

메소드 명명 규칙 - 메소드는 소문자로 시작되어야하고 밑줄(_)을 포함할 수 없다.

public class Foo {
  //정상적인 메소드명
  public void fooStuff() {
  }
}

ClassNamingConventions

클래스명은 대문자로 시작해야한다.

public class Foo {}

AbstractNaming

추상화 클래스의 접두어(prefix)는 Abstract이다. 사용 예: AbstractXXX

//일반 클래스는
public class Foo {
}

//추상화 클래스는 
public abstract class AbstractFoo {
}

AvoidDollarSigns

$ 특수문자는 변수/메소드/클래스/인터페이스 명 어디에도 사용하지 않는다.

public class Fo$o {  //아놔!
  private String v$lue; //아놔!!

  public void m$thod(){} //아놔!!!
}

MethodWithSameNameAsEnclosingClass

생성자 이외에 어떤 메소드도 클래스명과 같은 메소드명을 갖을 수 없다.

public class MyClass {
  // 이런 메소드명은 사용하지 말자.
  public void MyClass() {}
  // 생성자만 사용하자.
  public MyClass() {}
}

SuspiciousHashcodeMethodName

hashCode() 메소드와 혼동될만한 메소드는 만들지 말자. 

public class Foo {
  public int hashcode() {
    // hashCode 메소드를 만들려고 의심됨
  }
}

SuspiciousConstantFieldName

대문자로 이루어진 변수명은 Sun의 자바 명명규칙에 따르면 상수이다. final을 설정하자. 일반 변수라면 대문자 쓰지 말자.

public class Foo {
  //아래와 같은 경우 임의로 PI의 값을 변경할 수 있어서,
  //상수로써 기능을 할 수 없다.
  double PI = 3.16;
  //상수는 명확하게 다음과 같이 설정하자
  final double PI = 3.16;
}

SuspiciousEqualsMethodName

equals 메소드를 오버라이드 해서 쓴 것과 오인될 수 있는 메소드들은 사용하지 말자!

public class Foo {
  public int equals(Object o) {
    // boolean으로 값을 반환하는 equals 아닌지 의심된다.
  }
  public boolean equals(String s) {
    // Object로 전달 인수를 받아야 하는 equals 아닌가?
  }
}


AvoidFieldNameMatchingTypeName

클래스 명과 그 클래스에 포함된 필드명이 같다면 매우 혼동스럽다.

public class Foo extends Bar {
  // foo보다 다른 더 나은 이름을 쓰자
  int foo;
}

AvoidFieldNameMatchingMethodName

필드명과 메소드명이 같으면 매우 혼동스럽다. 하나의 클래스 내에서 필드명과 메소드명이 같은 경우 생성하는데 문제가 없지만, 명명 규칙에서 볼 경우 이건 매우 불분명하다.

public class Foo {
  // bar는 변수? 메소드? 아님 둘다?
  Object bar;
  
  void bar() {
  }
}

NoPackage

클래스나 인터페이스는 package가 무조건 정의되어야 한다.

// package는 어디에 정의가 되어있지?
public class ClassInDefaultPackage {
}

PackageCase

package 명은 대문자를 포함할 수 없다.

package com.MyCompany;  // 소문자로 변경하자!
public class SomeClass {
}

MisleadingVariableName

클래스 맴버 변수는 m_로 시작할 수 있다. 그러므로 다른 메소드나 지역변수가 m_로 시작하는 것을 피하자.

public class Foo {
  private int m_foo; // 클래스 맴버 변수로 가능
  public void bar(String m_baz) {  // 메소드명이므로 X
    int m_boz = 42; // 지역변수이므로 X
  }
}

BooleanGetMethodName

boolean에 대한 접근 메소드는 getX와 같은 형식이 아닌 isX로 설정해야한다.

public boolean getFoo(); //좋지 않은 방식
public boolean isFoo(); // 좋은 방식
public boolean getFoo(boolean bar); 
//다음과 같으면 가능하다 checkParameterizedMethods=true

GenericsNaming

자바의 Generics 명은 대문자 한 글자로 만들어야 한다.

public interface GenericDao<E extends BaseModel, K extends Serializable> extends BaseDao {
   // 충분하다
}

public interface GenericDao<E extends BaseModel, K extends Serializable>{
   // 가능하다
}

public interface GenericDao<e extends BaseModel, K extends Serializable>{
   // 'e' 를 대문자 'E'로 바꾸자
}

public interface GenericDao<EF extends BaseModel, K extends Serializable>{
   // EF가 아닌 한 글자로 바꾸자.
}

해당 URL: http://pmd.sourceforge.net/pmd-4.2.6/rules/naming.html