Clean Code 2. 의미있는 이름

3 minute read

목차


의도를 분명히 밝혀라

  • 변수의 존재 이유, 수행 기능, 사용 방법이 드러나야 함
  • 코드의 단순성이 아닌 함축성이 의도를 파악하는데 방해가 됨
  • 이름 수정으로 함수가 하는일을 이해하기 쉬워짐
    int d;
    int portWorkDays;
    
    public List<int[]> getThem() {
      List<int[]> list1 = new ArrayList<int[]>();
      for (int[] x : theList)
        if (x[0] == 4)
          list1.add(x);
      return list1;
    }
      
    public List<int[]> getFlaggedCells() {
      List<int[]> flaggedCells = new ArrayList<int[]>();
      for (int[] cell : gameBoard)
        if (cell[STATUS_VALUE] == FLAGGED)
          flaggedCells.add(cell);
      return flaggedCells;
    }
    

그릇된 정보를 피하라

  • 일관성 있는 표기법 사용
  • Type이 List가 아니라면 List를 붙이지 않도록 함
  • 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안됨
    var tc = new TextConverter();
    

의미 있게 구분하라

  • 연속적인 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절치 못함
    Copy(Type a1, Type a2);
    Copy(Type source, Type destination);
    
  • 읽는 사람이 차이를 알도록 naming 해야 한다.
    class Account; class AccountInfo;
    class AccountData; class AccountInfo;
    

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

  • 발음이 어려우면 토론하기 어렵고 혼란이 생김
    DateTime genymdhms; // general date, year, month, day, hour, minute, second
    DateTime generationDateTime;
    DateTime generalTimeStamp;
    

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

  • 문자 하나를 사용하는 이름이나 상수는 눈에 띄지 않음
    int d;
    const int DaysInWeek = 7;
    const int WorkDaysPerWeek = 5;
    

인코딩을 피하라

  • 변수 이름에 타입을 인코딩 할 필요가 없음
    • IDE가 많이 발전하여 컴파일 하지 않고도 타입 오류를 알 수 있음
    • 타입을 바꾸기 어려워짐
      string phoneString;
      PhoneNumber phoneString;
      
  • 접두어를 붙일 필요가 없음
    • IDE가 멤버 변수 색상을 다르게 표시해줌
      string m_dsc;
      string description;
      
  • 인터페이스와 구현 클래스 접두어 문제
    • 과도한 정보
      class ShapeFactory : IShapeFactory;
      class CShapeFactory : ShapeFactory;
      
      class VoyageSheet : ISheet;
      class VoyageSheet : Sheet;
      

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

  • 문자 하나만 사용하는 변수 이름은 문제가 많음
    • 단, 루프에서 반복 횟수를 세는 i, j, k는 예외
  • 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 바람직하지 않음
    string u;
    string url;
    

클래스 이름

  • 명사 혹은 명사구가 적합. 동사는 사용하지 않음
  • Manager, Processor, Data, Info 같은 단어는 피해야 함

메서드 이름

  • 동사 혹은 동사구가 적합
  • 접근자는 get, 변경자는 set, 조건자는 is를 붙임
  • 생성자를 overload 할 때는 정적 팩토리 메서드를 사용
    • 정적 팩토리 메서드만 사용 할 때 생성자를 private으로 선언
      var complex = new Complex(23.0);
      var complex = Complex.FromRealNumber(23.0);
      
      var accountData = new AccountData();
      var accountInfo = new AccountInfo(accountData);
      var accountInfo = AccountInfo.Of(accountData);
      

기발한 이름을 피하라

  • 재밌는 이름보다 명료한 이름을 선택해야 함
    CalculateByYhjang();
    Calculate();
    
  • 의도는 분명하게 해야 함

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

  • 똑같은 동작을 하는 메서드를 클래스마다 제각각으로 부르면 혼란
    • Fetch, Retrieve, Get
  • 똑같은 동작을 하는 클래스를 제각각으로 부르면 혼란
    • Controller, Manager, Drive
  • 일관성 있는 어휘를 사용하여 코드를 작성

말장난을 하지 마라

  • 한 단어를 두가지 목적으로 사용하면 안됨
  • 다른 개념에 같은 단어를 사용하면 안됨
  • 일관성을 유지한다고 해서 다른 동작을 같은 이름으로 쓰면 안됨
    • Add, Append

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

  • 기술 개념에는 기술 이름이 가장 적합
  • 코드를 읽는 사람도 프로그래머이기 때문에 알고리즘 이름, 패턴 이름, 수학 용어를 사용
    • ServiceFactory (Factory Pattern)

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

  • 적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 사용
    QuickSearch();
    HashSearch();
    

의미 있는 맥락을 추가하라

  • 접두어를 붙임
    • 접두어를 붙이는 것보다 클래스를 생성하는 것이 바람직한 방법
      string firstName, secondName, state;
      string addrFirstName, addrSecondName, addrState;
      class Address 
      {
      string firstName;
      string secondName;
      string state;
      }
      

불필요한 맥락을 없애라

  • 클래스 이름에 접두어로 프로그램 이름 약자를 붙이는 것은 바람직하지 못함
  • 긴 이름보다 짧은 이름이 좋음
    class TPEstimationWorkbook;
    class EstimationWorkbook;
    

결론

  • 우리는 대다수 자신이 짠 클래스 이름과 메서드 이름을 모두 암기하지 못한다.
  • 그러므로 문장이나 문단처럼 읽히는 코드를 짜는데 집중해야 한다.
  • 누가 질책한다고 해서 노력을 멈추면 안된다.

과제

  • 본인이 작성한 코드에 규칙 하나 이상 적용하여 가독성 높이기
    과제코드

Leave a comment