728x90
1. java naming Convention
1.1.공통
- 대소문자가 구분되며 길이에 제한이 없다.
- 예약어를 사용해선 안된다.
- 숫자로 시작하면 안된다.
- 특수문자는 _ $ 만 사용 가능
ps. 구글 컨벤션에선 $ 쓰지 말라고 했던 거 같음 - PascalCase, camelCase 사용
- 반의어는 반드시 대응하는 개념으로 사용
반의어 영어 | 반의어 한글 | ||
get | set | 받다 | 받다 |
add | remove | 추가 | 제거 |
create | destroy | 창조 | 파괴하다 |
start | stop | 시동 | 정지 |
insert | delete | 삽입 | 삭제 |
increment | decrement | 증가 | 감소 |
old | new | 구 | 신 |
begin | end | 시작 | 끝 |
girst | last | 기어, 먼저, 처음 | 마지막 |
up | down | 위 | 아래 |
min | max | 최소 | 최대 |
next | previous | 다음 | 이전 |
open | close | 열다 | 닫다 |
show | hide | 보이다 | 숨기다 |
suspend | resume | 일시 정지 | 재개하다 |
parent | child | 부모 | 아이 |
1.2. 개별
- [com].[Company].[project-a].[toppackage].[lowerpackage]
1.2.1.프로젝트
- 대소문자 구분없이 시작 가능
1.2.2. 패키지
- 소문자
- 표준 패턴을 따른다.
- 가급적 1단어
1.2.3. 클래스
- 파스칼 표기법
- 명사
1.2.4. 인터페이스
- 파스칼 표기법
- 형용사
1.2.5. 메서드
- 카멜 표기법
- 동사
1.2.6. 변수
- 카멜 표기법을 사용한다.
- 길이 제한은 없다.
1.2.7. 상수
- 전부 대문자로 표기한다.
- 스네이크케이스를 사용하여 '_'로 구분한다.
- collection 같은 경우 내부의 요소 조차 변경되지 않아야 상수이다.
2. 메서드 이름으로 자주 사용되는 동사
- 멤버에 접근하는 메서드 명의 접두사는'get','set'을 사용
- public void setDisplayName
- public void getDisplayName
- 데이터를 조회하는 메소드명의 접두사는 find를 사용한다.
- public void findData(String data){}
- 데이터를 입력하는 메소드명의 접두사는 input을 사용한다.
- public void inputData(HashMap data){}
- 데이터를 변경하는 메소드명의 접두사는 modify를 사용한다.
- public void modifyData(HashMap data){}
- 데이터를 삭제하는 메소드명의 접두사는 delete를 사용한다.
- public void deleteData(String data){}
- 데이터를 초기화하는 메서드 명의 접두사는 initialize을 사용한다.
- public void initData(String data){}
- 반환 값의 타입이 boolean인 메서드는 접두사로 is를 사용한다.
- public boolean isNumber(){}
- 데이터가 있는지 확인하는 메소드명의 접두사는has를 사용한다.
- public boolean hasData(){}
- 할 수 있는지 없는지 확인하는 메소드명의 접두사는 can을 사용한다.
- public boolean canOrder(){}
- 데이터를 불러오는 메서드 명의 접두사는 load를 사용한다.
- public void loadData(){}
- public void loadData(){}
- 새로운 객체를 생성 후 해당 객체를 리턴해주는 메서드 명의 접두사는 create를 사용한다.
- public Board create(){}
- 해당 객체를 다른 형태의 객체로 변환해주는 메서드 명의 접두사는 to를 사용한다.
- public String toString(){}
- public String toString(){}
- 해당 객체가 복수인지 단일인지 구분하는 메서드 명의 접미사는 s를 사용한다.
- public void getMembers(){}
- public void getMembers(){}
- B를 기준으로 A를 하겠다는 메소드명의 전치사는 By를 사용한다.
- public void getUserByName(String name){}
3. 심화
3.1. 네이밍시 고려사항 기본
- 왜 존재해야 하는가 why
- 무슨 작업을 하는가 what
- 어떻게 사용하는가 how
Example
public List<Piece> findPiecesByColor(Color color){}
// 왜 존재해야 하는가 - color에 대해 존재하는 piece들을 알기 위해.
// 무슨 작업을 하는가 - color에 맞는 piece들을 가져온다.
// 어떻게 사용하는가 - 체스판에서 흑색(or 백색)의 piece들을 가져와서 점수를 계산.
3.2. 네이밍 고려사항 심화
3.2.1. 협업 염두해서 짓기
- i+=2 가 어떤 의미인지 알기 힘들다.
- 의미있는 변수명을 붙여주면 의미 파악이 쉽다.
// before
private void validateNumericPosition(String[] expressionAsArray) {
for (int i = 0; i < expressionAsArray.length; i += 2) { // 2가 어떤 의미인지 파악 힘듬
...
}
}
// after
private void validateNumericPosition(String[] expressionAsArray) {
int numberIndex = 2;
for (int i = 0; i < expressionAsArray.length; i += numberIndex) {
...
}
}
3.2.2. 맥락을 고려해서 짓기
- 의도가 불분명한 짧은 이름보다는 의미있고 맥락이 있는 긴 이름이 좋다.
- 그러나, 쓸데없이 구구절절한 이름은 오히려 독이다.
- class에 user라는 정보를 담고 있기 때문에 굳이 멤버변수의 이름에 user를 넣을 필요가 없다.
// before
public class User{
String userName;
int userAge;
...
}
// after
public class User{
String name;
int age;
...
}
3.2.3. 불린 변수의 네이밍
- 전형적인 불린 변수의 이름을 사용할 것
- done, error, found, success, ok
- 어떤 true인지 정확히 설명할 수 있는 구체적인 이름 존재시, 대체 하는 것을 권장
- found, processignComplete
- 참이나 거짓의 의미를 함축하는 불린 변수는 의미가 명백하지 않기 때문에 권장하지 않는다.
- 참 거짓이 명백하게 이름을 작성한다.
- 나쁜 예 : status, sourceFile
- 변경 : statusOK, sourceFileAvailable, sourceFileFound
- 긍정적인 불린 변수 이름 사용
// before
if(notFound == false) {...}
// after
if(found == true) {...}
- java는 접두어 is를 사용해서 불린 메서드나 변수명을 짓지만 is가 없어도 이름을 읽고 이해하기가 쉬운 경우 제거한다.
// before
if(isfound) {...}
// after
if(found) {...}
3.2.4. 메서드가 여러번 호출된 한눈에 보기 힘든 코드
- splitSymbol, content 변수를 선언해 줌으로써 이전보다 훨씬 읽기가 쉬워진다.
// before
private static final String FORMAT_SYMBOL = "//(.*)\\\\n(.*)";
public static List<String> customSplit(String input) {
Matcher matcher = Pattern.compile(FORMAT_SYMBOL).matcher(input);
if (matcher.find()) {
return Arrays.asList(matcher.group(2).split(Pattern.quote(matcher.group(1))));
}
...
}
// after
private static final String FORMAT_SYMBOL = "//(.*)\\\\n(.*)";
public static List<String> customSplit(String input) {
Matcher matcher = Pattern.compile(FORMAT_SYMBOL).matcher(input);
if (matcher.find()) {
String splitSymbol = matcher.group(1); // 변수로 선언
String content = matcher.group(2); // 변수로 선언
return Arrays.asList(content.split(Pattern.quote(splitSymbol)));
}
...
}
3.2.5. 변수 이름에 자료형이 있는 경우
- 변수의 타입을통해 충분히 어떤 변수인지 파악이 가능하므로 복수형 s를 넣어준다.
// before
private List<Double> numberList = new ArrayList<>();
private List<String> operatorList = new ArrayList<>();
// after
private List<Double> numbers = new ArrayList<>();
private List<String> operators = new ArrayList<>();
3.3. clean code 내용
- 너무 다양하니깐 일단 위에 조건부터 익숙해지면 그다음에 적용하도록 하자
- 의미 있게 구분
- a1,a2 X
- Name VS NameString
- getActiveAccount() VS getActiveAccounts() VS getActiveAccountInfo()
- money VS moneyAmount
- message VS theMessage
- 발음하기 쉬운 이름
- 검색하기 쉬운 이름
- 인코딩을 피해라 (타입 유추 표기법 피하기)
4. Unit test 네이밍 컨벤션
- 네이밍 컨벤션을 선정하기 이전에 그 테스트가 왜 필요한지 테스트의 목적은 무엇인지 먼저 생각
- 테스트 네이밍을 하는데 다음과 같은 몇 가지 추천 방법
- 테스트명은 특정한 필요조건을 명시해야 한다.
- 테스트명에는 기대되는 인풋이나 상태와 그에 상응하는 결과값을 포함시킬 수 있다.
- 테스트명은 워크플로우와 아웃풋을 명시하는 선언이나 사실들로 나타내야 한다.
- 테스트명에는 테스트 메서드나 클래스의 이름을 포함할 수 있다.
- 테스트 네이밍 컨벤션에 대한 몇 가지 예시.
- 메서드명_테스트하고자하는상태_예상되는결과
- 단점: 메서드 이름이 바뀌면 테스트명을 변경해주어야 함.
- ex: isAdult_AgeLessThan18_False
- 메서드명_예상되는결과_테스트하고자하는상태
- 단점: 메서드 이름이 바뀌면 테스트명을 변경해주어야 함.
- ex: isAdult_False_AgeLessThan18
- test테스트진행중인기능명
- 단점: “test” prefix가 중복된다
- ex: testIsNotAnAdultIfAgeLessThan18
- 테스트중인기능명
- 단점: 이름만으로는 어떤 결과를 원하는지 유추할 수 없다.
- ex: IsNotAnAdultIfAgeLessThan18
- Should_예상되는결과_When_테스트중인상태
- 단점: `should`와 `when`가 중복되고 이름이 길어진다.
- ex: Should_ThrowException_When_AgeLessThan18
- When_테스트중인상태_Expect_예상되는결과
- 단점: `when`와 `expect`가 중복됨
- ex: When_AgeLessThan18_Expect_isAdultAsFalse
- Given_조건_When_테스트중인상태_Then_예상되는결과 — Behavior-Driven Development (BDD)
- 단점: `given`, `should`, `when`가 중복되고 이름이 매우 길어진다.
- ex: Given_UserIsAuthenticated_When_InvalidAccountNumberIsUsedToWithdrawMoney_Then_TransactionsWillFail
- 메서드명_테스트하고자하는상태_예상되는결과