cleancode - 네이밍

김규빈·2022년 6월 19일
2

주니어 필수 완독 도서 클린코드에 대해 아라보자

네이밍

정말 중요한 네이밍.. 내가 만든 코드인데도 일주일만 지나면 기억이 흐릿하다.
어? 이 함수가 왜 필요했지? 라는 말을 해봤다면 포함이다.

this.xlsxData.map((obj, id, key) => {
              	copyData.filter(el => {
                	if (el.id === obj[0] && obj[9] === "주식 출고 요청 대기" && obj[10] === 1) {
                    this.seleteRequest.push(el)
                    el.seleted = true
                }
              });
            });

실제로 내가 만든 코드이다.
xlsxData는 뭔지, 어디서 가져온건지 copyData에서 el은 뭔지 obj[0]은 뭘까, obj[9]라는데 이건 어디서 온걸까, obj[10]에 1은 뭘까.. 어지럽다...

나름의 규칙

public List<int[]> getThem() {
    List<int[]> list1 = new ArrayList<int[]>();
    for (int[] x: theList)
    if (x[0] == 4)
        list1.add(x);
    return list1;
}

간단한 함수에도 네이밍일 신경쓰지 않는다면 파악 불가능한 함수로 전락된다.
코드 맥락을 전혀 모르겠는 함수이다.
theList에 무엇이 들어있는지, 0번째 값을 왜 체크하는지? 값 4는 무슨 의미인가
반환하는 리스트를 어떻게 사용하는지 ?

public List<int[]> getFlaggedCells() {
    List<int[]> flaggedCells = new ArrayList<int[]>();
    for (int[] cell: gameBoard)
        if (cell.isFlagged())
            flaggedCells.add(cell);
    return flaggedCells;
}

네이밍만 신경썼어도 별다른 설명이 필요없는 함수

여러 계정을 그룹으로 묶을 때, 실제 List타입이 아니라면 accountList라 명명하지 말아야 한다. 프로그래머에게 List는 특수한 의미이기 때문에, accountGroup, Accounts 등으로 붙혀준다.

서로 비슷한 이름을 사용하지 않아야 한다. 한 모듈에서
XYZControllerForEfficientHandlingOfStrings라는 이름과
XYZControllerForEfficientStorageOfStrings라는 이름을 사용한다면,
최악이다.

컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 않다. 이름이 달라야 한다면 의미도 달라져야 한다.

연속적인 숫자를 덧붙인 이름(a1,a2, ... ,aN)은 그릇된 정보를 제공하는 이름은 아니지만, 아무런 정보를 제공하지 못하는 이름일 뿐. 저자 의도가 전혀 드러나지 않다.

bool를 추가한 경우 역시 아무런 정보도 제공하지 못한다. Product라는 클래스가 있을 때, 다른 클래스를 ProduectInfo 혹은 ProductData라 부른다면 개념을 구분하지 않은 채 이름만 달리한 경우이다. 마치 a, an, the처럼 의미가 불분명한 불용어를 사용한 것과 같다. 불용어의 쓰임은 중복을 낳을 수 밖에 없습니다.Name과 NameString, Customer와 CustomerObject 등과 같이 차이가 전혀 와닿지 않는다.

발음과 검색이 쉬운 이름
발음하기 어려운 이름은 토론하기도 어려움

class DtaRcrd102 {
    private Date genymdhms;
    private Date modymdhms;
    private final String pszqint = "102";
}
class Customer {
    private Date generationTimestamp;
    private Date modificationTimestamp;
    private final String recordId = "102";
}

문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다는 문제가 있습니다. 만약 day라는 변수를 위해 d라고 네이밍을 했다면, 그 변수를 찾기 위해 d를 검색했을 상황을 상상해봐라. 최악이다. 네이밍에 신경써 WORK_DAYS_PER_WEEK라는 이름이었다면, 훨씬 찾기 쉬웠을 것. 이름 길이는 범위 크기에 비례해야 한다. 변수나 상수를 코드 여러 곳에서 사용한다면 뜻을 내포한 검색하기 쉬운 이름이 적절.

인코딩을 피해라

유형이나 범위 정보처럼 이름에 인코딩할 정보는 아주 많다. 인코딩을 붙힐 케이스는 내부 변수의 의미인 (_)을 제외한 어떠한 것도 사용 하지마

한 개념에 한 단어

추상적인 개념 하나에 단어 하나를 선택해 이를 고수해야 한다. 같은 메스드를 클래스마다 fetch, retrieve, get 혹은 controller, manager, driver 등의 경우처럼 제각각 부르면 혼란만 가중될 뿐.

더불어 한 단어를 두 가지 목적으로 사용하면 안된다. add라는 기존 메서드가 값 두 개를 더하거나 이어서 새로운 값을 만든다고 할 때, 집합에 값 하나를 추가하는 메서드를 add라 명명하는 것은 좋지 않다. 두 메서드는 맥락이 다르므로 insert나 append라는 이름이 적절.

의미있는 맥락 추가

예를 들어, firstName, lastName, street, city, state, zipcode라는 변수가 있다면 이들이 주소를 표현함을 금방 알아챌 수 있다. 하지만 어느 메서드가 state 변수 하나만 사용한다면 주소 일부라는 걸 쉽게 알아차리지 못한다. 따라서 addr라는 접두어를 추가해 addrState라 쓰거나, Address라는 클래스에 속하도록 수정 해주는 것이 좋다.

적합한 이름

클래스 혹은 객체 이름에는 명사나 명사구를 사용하는 것이 좋다. Customer, WikiPage, Account, AddressParser 등이 좋은 예시이다. Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는 것이 좋다.

메서드 이름은 동사나 동사구가 적합하다. postPayment, deletePage, save 등이 좋은 예시. 접근자, 변경자, 조건자에는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.

profile
FrontEnd Developer

0개의 댓글