개발 - 고급/convention

네이밍 컨벤션

wooweee 2023. 11. 2. 09:07
728x90

1. java naming Convention

1.1.공통

  1. 대소문자가 구분되며 길이에 제한이 없다.
  2. 예약어를 사용해선 안된다.
  3. 숫자로 시작하면 안된다.
  4. 특수문자는 _ $ 만 사용 가능
    ps. 구글 컨벤션에선 $ 쓰지 말라고 했던 거 같음
  5. PascalCase, camelCase 사용
  6. 반의어는 반드시 대응하는 개념으로 사용
반의어 영어 반의어 한글
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. 메서드 이름으로 자주 사용되는 동사

  1. 멤버에 접근하는 메서드 명의 접두사는'get','set'을 사용
    • public void setDisplayName
    • public void getDisplayName

  2. 데이터를 조회하는 메소드명의 접두사는 find를 사용한다.
    • public void findData(String data){}
  3. 데이터를 입력하는 메소드명의 접두사는 input을 사용한다.
    • public void inputData(HashMap data){}
  4. 데이터를 변경하는 메소드명의 접두사는 modify를 사용한다.
    • public void modifyData(HashMap data){}
  5. 데이터를 삭제하는 메소드명의 접두사는 delete를 사용한다.
    • public void deleteData(String data){}
  6. 데이터를 초기화하는 메서드 명의 접두사는 initialize을 사용한다.
    • public void initData(String data){}
  7. 반환 값의 타입이 boolean인 메서드는 접두사로 is를 사용한다.
    • public boolean isNumber(){}
  8.  데이터가 있는지 확인하는 메소드명의 접두사는has를 사용한다.
    • public boolean hasData(){}
  9. 할 수 있는지 없는지 확인하는 메소드명의 접두사는 can을 사용한다.
    • public boolean canOrder(){}
  10. 데이터를 불러오는 메서드 명의 접두사는 load를 사용한다.
    • public void loadData(){}

  11. 새로운 객체를 생성 후 해당 객체를 리턴해주는 메서드 명의 접두사는 create를 사용한다.
    • public Board create(){}
  12. 해당 객체를 다른 형태의 객체로 변환해주는 메서드 명의 접두사는 to를 사용한다.
    • public String toString(){}

  13. 해당 객체가 복수인지 단일인지 구분하는 메서드 명의 접미사는 s를 사용한다.
    • public void getMembers(){}

  14. B를 기준으로 A를 하겠다는 메소드명의 전치사는 By를 사용한다.
    • public void getUserByName(String name){}

 

3. 심화

3.1. 네이밍시 고려사항 기본

  1. 왜 존재해야 하는가 why
  2. 무슨 작업을 하는가 what
  3. 어떻게 사용하는가 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
  • 발음하기 쉬운 이름
  • 검색하기 쉬운 이름
  • 인코딩을 피해라 (타입 유추 표기법 피하기)

 

추가로 참고할 네이밍 규칙

 

효과적인 이름짓기 - Remotty Tech Blog

지금 아내의 뱃속에 15주 된 아기가 자라고 있다. 태명은 “행복”이다. 아내와 난 뱃속의 아기에게 “우리 복이~~” 이렇게 부르고 있다. 이름처럼 참 행복하다. ^^ 요즘은 우리 아기가 평생동안

remotty.github.io

 

4. Unit test 네이밍 컨벤션

  • 네이밍 컨벤션을 선정하기 이전에 그 테스트가 왜 필요한지 테스트의 목적은 무엇인지 먼저 생각
  • 테스트 네이밍을 하는데 다음과 같은 몇 가지 추천 방법
    1. 테스트명은 특정한 필요조건을 명시해야 한다.
    2. 테스트명에는 기대되는 인풋이나 상태와 그에 상응하는 결과값을 포함시킬 수 있다.
    3. 테스트명은 워크플로우와 아웃풋을 명시하는 선언이나 사실들로 나타내야 한다.
    4. 테스트명에는 테스트 메서드나 클래스의 이름을 포함할 수 있다.
  • 테스트 네이밍 컨벤션에 대한 몇 가지 예시.
    1. 메서드명_테스트하고자하는상태_예상되는결과
      • 단점: 메서드 이름이 바뀌면 테스트명을 변경해주어야 함.
      • ex: isAdult_AgeLessThan18_False

    2. 메서드명_예상되는결과_테스트하고자하는상태
      • 단점: 메서드 이름이 바뀌면 테스트명을 변경해주어야 함.
      • ex: isAdult_False_AgeLessThan18

    3. test테스트진행중인기능명
      • 단점: “test” prefix가 중복된다
      • ex: testIsNotAnAdultIfAgeLessThan18

    4. 테스트중인기능명
      • 단점: 이름만으로는 어떤 결과를 원하는지 유추할 수 없다.
      • ex: IsNotAnAdultIfAgeLessThan18

    5. Should_예상되는결과_When_테스트중인상태
      • 단점: `should`와 `when`가 중복되고 이름이 길어진다.
      • ex: Should_ThrowException_When_AgeLessThan18

    6. When_테스트중인상태_Expect_예상되는결과
      • 단점: `when`와 `expect`가 중복됨
      • ex: When_AgeLessThan18_Expect_isAdultAsFalse

    7. Given_조건_When_테스트중인상태_Then_예상되는결과 — Behavior-Driven Development (BDD)
      • 단점: `given`, `should`, `when`가 중복되고 이름이 매우 길어진다.
      • ex: Given_UserIsAuthenticated_When_InvalidAccountNumberIsUsedToWithdrawMoney_Then_TransactionsWillFail