nyximos.log

[Clean Code] 2장, 의미 있는 이름 본문

Books

[Clean Code] 2장, 의미 있는 이름

nyximos 2022. 2. 11. 17:49

 

클린 코드,  애자일 소프트웨어 장인정신

Robert C. Martin

 

 

들어가면서

소프트웨어에서 이름은 어디에나 쓰인다.

많이 사용하므로 이름을 잘 지으면 편하다.

이 장에서는 이름을 잘 짓는 간단한 규칙을 소개한다.

 

의도를 분명히 밝혀라

변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다.

  1. 변수(혹은 함수나 클래스)의 존재 이유는?
  2. 수행 기능은?
  3. 사용 방법은?

따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다.

의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.

중요한 것은 코드의 함축성이다.

int d; // 경과 시간(단위 : 날짜)

int elapsedTimeIndays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

 

그릇된 정보를 피하라

  • 프로그래머는 코드에 그릇된 단서를 남겨서는 안 된다.
    → 그릇된 단서는 코드 의미를 흐린다. (List)
  • 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안된다.
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.
  • 유사한 개념은 유사한 표기법을 사용한다.
  • 안 좋은 예) 소문자 L이나 대문자 O를 변수로 사용하면 1과 0으로 보이므로 사용하지 않도록 하자.

 

의미 있게 구분하라

  • 컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하려는 프로그래머는 스스로 문제를 일으킨다.
  • 동일한 범위 안에서는 다른 두 개념에 같은 이름을 사용하지 못한다.
  • 컴파일러를 통과하더라도 연속된 숫자를 덧붙이거나(a1, a2),
    불용어 noise word(변수이름에서 variable, 표이름에 table 등)를 추가하는 방식은 적절하지 못하다.
  • 읽는 사람이 차이를 알도록 이름을 지어라.

 

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

  • 발음하기 어려운 이름은 토론하기도 어렵다.
  • 프로그래밍은 사회 활동이므로 발음하기 쉬운 이름은 중요하다.
class DdtaRcrd102 {
	private Date genymdhms;
	private Date modymdhms;
    private final String pszqint = "102";
}

class Customer {
	Date generationTimestamp;
	Date modificationTimestamp;
	private final String recordId = "102";
}

 

 

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

  • 문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다.
  • 검색 또한 어렵다.
  • 긴 이름이 짧은 이름보다 좋다.
  • 검색하기 쉬운 이름이 상수보다 좋다. (ex. 5 와 WORK_DATYS_PER_WEEK)
  • 이름 길이는 범위 크기에 비례해야 한다.
  • 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.

 

인코딩을 피하라

  • 인코딩한 이름은 거의 발음하기 어려우며 오타가 생기기도 쉽다.
  • 자바 프로그래머는 변수 이름에 타입을 인코딩할 필요가 없다. (phoneString)
  • 코드를 읽을수록 접두어(또는 접미어)는 관심 밖으로 밀려난다.(멤버 변수의 경우 '_m')
  • 눈에 띄게 보여주는 IDE를 사용하자.

때로는 인코딩이 필요한 경우도 있다. (인터페이스 클래스와 구현 클래스)

  • 두 클래스 중 하나를 인코딩 한다면 구현 클래스 이름을 택하자.
  • 인터페이스 클래스 - ShapeFactory
  • 구현 클래스 - ShapeFactoryImpl

 

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

  • 전문가 프로그래머는 명료함이 최고라는 사실을 이해한다.
  • 전문가 프로그래머는 자신의 능력을 좋은 방향으로 사용해 남들이 이해하는 코드를 내놓는다.

 

클래스 이름

  • 클래스 이름과 객체 이름은 명사명사구가 적합하다.
  • 좋은 예) Costomer. WikiPage, Account, AddressParser
  • 동사, Manage, Processor, Data, Info 등의 단어는 피하자. 

 

메서드 이름

  • 동사동사구가 적합하다.
  • 좋은 예) postPayment, deletePage, save 등
  • 접근자 Accessor, 변경자 Mutator, 조건자 Predicate의 경우, javabean 표준에 따라 값 앞에 get, set, is를 붙인다.
  • 생성자 사용을 제한 하려면 해당 생성자를 private로 선언한다.
  • 생성자 constructor를 중복정의 overload 할 때는 정적 팩토리 메서드를 사용한다.
  • 메서드는 인수를 설명하는 이름을 사용한다.
Complex fulcrumPoint = Complex.FromRealNumber(23.0); // 좋은 예

Complex fulcrumPoint = new Complex(23.0);

 

기발한 이름은 피하라

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

 

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

  • 추상적인 개념 하나에 단어 하나를 선택해 고수한다.
  • 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란 스럽다.
  • 마찬가지로, 동일 코드 기반에 controller, manager, driver를 섞어 쓰면 혼란스럽다.

 

말장난을 하지 마라

  • 한 단어를 두가지 목적으로 사용하지 마라.
  • 같은 맥락이 아닌데도 '일관성'을 고려하여 똑같은 단어를 사용하지 마라. (add, insert, append)
  • 프로그래머는 코드를 대충 훑어봐도 최대한 이해하기 쉽게 짜야한다.

 

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

  • 코드를 읽을 사람도 프로그래머이니 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다.
  • 모든 이름을 문제 영역 domain 에서 가져오는 정책은 현명하지 못하다.
  • 기술 개념에는 기술 이름이 가장 적합한 선택이다.

 

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

  • 적절한 '프로그래머 용어'가 없다면 문제 영역에서 이름을 가져온다.
  • 우수한 프로그래머와 설계자라면 해법 영역과 문제 영역을 구분할 줄 알아야 한다.
  • 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.

 

의미 있는 맥락을 추가하라

  • 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
  • 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.

맥락이 불분명한 변수

private void printGuessStatistics(char candidate, int count){
	String number;
    String verb;
    String pluralModifier;
    if(count==0){
    	number = "no";
        verb = "are";
        pluralModifier = "s";
    } else if (count==1){
    	number = "1";
        verb = "is";
        pluralModifier = "";
    } else {
		number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
	}
    String guessMessage = String.format(
    	"There %s %s %s%s", verb, number, candidate, pluralModifier
    );
    print(guessMessage);
}

 

맥락이 분명한 변수

public class GuessStatisticsMessage{
	private String number;
    private String verb;
    private String pluralModifier;
    
    public String make(char candidate, int count){
    	createPluralDependentMessageParts(count);
        return String.format(
        	"There %s %s %s%s",
            verb, number, candidate, pluralModifier);
	}
    
    private void createDependentMessageParts(int count){
    	if(count==0){
        	thereAreNoLetters();
        } else if(count==1){
        	thereIsOneLetter();
        } else{
        	thereAreManyLetters(count);
        }
   	}
    
    private void thereAreManyLetters(int count){
    	number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
    }
    
    private void thereIsOneLetter(){
        number = "1";
        verb = "is";
        pluralModifier = "";
    }
    
    private void thereAreNoLetters(){
    	number = "no";
        verb = "are";
        pluralModifier = "s";
    }
}

 

불필요한 맥락을 없애라

  • 의미가 분명한 경우에 한해서 일반적으로는 짧은 이름이 긴 이름보다 좋다.
  • 이름에 불필요한 맥락을 추가하지 않도록 주의한다.

 

마치면서

  • 이 장에서 소개한 규칙 몇 개를 적용해 코드 가독성이 높아지는지 살펴보라.
  • 다른 사람이 짠 코드를 손본다면 리팩터링 도구를 사용해 문제 해결 목적으로 이름을 개선하라.
  • 단기적인 효과는 물론 장기적인 이익도 보장한다.

 

 

'Books' 카테고리의 다른 글

[Clean Code] 6장, 객체와 자료 구조  (0) 2022.02.22
[Clean Code] 5장, 형식 맞추기  (0) 2022.02.18
[Clean Code] 4장, 주석  (0) 2022.02.16
[Clean Code] 3장, 함수  (0) 2022.02.12
[Clean Code] 1장, 깨끗한 코드  (0) 2022.02.10