본문 바로가기
공부 기록

[클린코드] 2장. 의미 있는 이름

by 매트(Mat) 2024. 4. 14.

2장. 의미 있는 이름

SW에서 이름은 변수, 함수, 인수, 클래스, 패키지 거의 모든 곳에서 쓰인다. 이렇듯 많이 사용하므로 이름을 잘 지으면 여러모로 편하다.

의도를 분명히 밝혀라

좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.

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

위의 이름들을 보고 어떤 로직인지 파악할 수 있을까? 이름만 제대로 지어도 많이 개선된다.

public class Sample1 {
    List<Cell> gameBoard = new ArrayList<>();
    public List<Cell> getFlaggedCells() {
        List<Cell> flaggedCells = new ArrayList<>();
        for (Cell cell : gameBoard) {
            if (cell.isFlagged()) {
                flaggedCells.add(cell);
            }
        }
        return flaggedCells;
    }
}
  • 단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌다.
  • 바로 이것이 좋은 이름이 주는 위력이다.

그릇된 정보를 피하라

  • 프로그래머는 코드에 그릇된 정보를 남겨서는 안된다.
    • 그릇된 정보는 일관성이 떨어지는 표기법을 말한다.
    • 예를 들면, 변수이름이 O1인 경우 'O'가 영어 O인지, 숫자 0인지 구분하기가 힘들다.
  • 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 된다.

의미 있게 구분하라

  • getActiveAccount();
  • getActiveAccounts();
  • getActiveAccountInfo();

개발자는 어느 함수를 호출할지 어떻게 알까?

즉, customerInfo와 customer, accountData와 account 처럼 구분이 안된다. 읽는 사람이 차이를 알도록 이름을 지어라.

발음하기 쉬운 이름을 사용하라

static class DtaRecrd102 {
    private Date genymdhms;
    private Date modymdhms;
    private final String pszqint = "102";
}
static class Customer {
    private Date generationTimestamp;
    private Date modificationTimestamp;
    private final String recordId = "102";
}
  • 둘 중 어느 것이 발음하기 쉬운가?

검색하기 쉬운 이름을 사용하라

문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다는 문제점이 있다.

  • realTaskDays
  • e

변수를 단순히 e라고 하면 검색시 e가 들어가는 파일 이름이나 모든 문장에 등장하기 떄문에 검색하기 힘들어진다.

인코딩을 피하라

  • 유형이나 범위 정보까지 인코딩에 넣으면 그만큼 이름을 해독하기 어려워진다.
  • 인코딩한 이름은 거의가 발음하기 어려우며 오타가 생기기 쉽다.
  1. 헝가리안 표기법

phoneString 처럼 변수명에 타입(String, int 등)을 적지 말자. 만약 타입이 변경되면 변수명을 모두 바꿔주어야 한다.

  1. 멤버 변수 접두어

멤버 변수라는 뜻으로 m_dsc 처럼 앞에 m_를 붙일 필요가 없다. 그냥 description이란 변수이름으로 명확하게 적는 것이 좋다.

  1. 인터페이스 클래스와 구현 클래스

때로는 인코딩이 필요한 경우도 있다. 인터페이스와 구현 클래스 이름 중 하나를 인코딩해야 한다면?

  • ShapeFactoryImpl -> O
  • CShapeFactory -> O
  • IShapeFactory -> X

자신의 기억력을 자랑하지 마라

코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수 이름은 바람직하지 못하다. 이는 일반적으로 문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택했기 때문에 생기는 문제다.

클래스, 메서드 이름

  • 클래스는 명사
  • 메서드는 동사

로 짓는 것이 좋다.

기발한 이름은 피하라

재미난 이름보다는 명료한 이름을 선택하라. 특정 문화에서만 사용하는 농담은 피하는 편이 좋다. 의도를 분명하고 솔직하게 표현하라

한 개념에 한 단어를 사용하라

똑같은 메서드를 클래스마다 fetch, retrieve, get로 제각각 부르면 혼란스럽다. 즉, 통일성으로 한 단어를 결정하고 그 단어를 써야 한다.

말장난을 하지 마라

한 단어를 두가지 목적으로 사용하지 말아야 한다. 다른 개념에 단어를 사용한다면 그것은 말장난에 불과하다.

예를 들어 더하기 메서드인 add를 사용했다면, 집합에 값을 추가한다는 단어는 insert나 append가 적절하다.

해법 영역에서 가져온 이름을 사용하라

코드를 읽는 사람은 프로그래머로써 전산용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다.

문제 영역에서 가져온 이름을 사용하라

적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다. 즉, 적절한 해법 영역이 없거나 문제 영역과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.

의미 있는 맥락을 추가하라

  • 클래스, 함수, namespace등으로 감싸서 맥락(Context)을 표현하라
  • 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.

불필요한 맥락을 없애라

  • 고급 휘발유 충전소(GSD)라는 애플리케이션을 짠다고 모든 클래스 이름을 GSD로 시작하겠다는 생각은 좋지 않다.
  • 이름에 불필요한 맥락을 추가하지 않도록 주의한다.

느낀 점.

변수나 메서드나 클래스 등 이름을 잘 짓는 것이 정말 중요하다. 이름을 잘 짓기 위해서는 명확해야 한다는 점과 여러 사람들이 같이 협업하기 때문에 여러 사람들이 알 수 있는 그러한 이름을 사용하는 것이 좋을 것 같다.

그리고 사내의 개발 컨벤션 같은 것이 있다면 거기에 맞는 이름 패턴들이 있을 것이다. 그 컨벤션에 맞게 잘 사용하는 것이 좋을 것 같다.

References

댓글