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