본문 바로가기

플밍 is 뭔들/Clean Code

1-11. 이름을 잘 짓는 간단한 규칙 (의미 있는 맥락을 추가하기)

아래와 같은 경우는 함수 이름은 맥락의 일부만 제공하며, 알고리즘이 나머지 맥락을 제공한다. 그래서 함수를 끝까지 읽어보고 나서야 member, verb, pluraModifier라는 변수 세개가 통계 추측이라는 메시지를 사용한다는 사실이 드러난다. 불행이도 독자가 맥락을 유추해야만 한다. 그냥 메서드만 훑어서는 세 변수의 의미가 불분명하다.

//맥락 불분명 예시
private void printGuessStatistics(char candidate, int count){
	String number;
	String verb;
	String pluraModifier
	   
	if(count == 0) {
		number = "no";
		verb = "are";
		pluraModifier = "s";
	} else if(count == 1){
		number = "1";
		verb = "is";
		pluraModifier = "";
	} else {
		number = Integer.toString(count);
		verb = "are";
		pluraModifier = "s";
	}
	
	String guessMessage = String.format(
		"There %s %s %s%s", verb, number, candidate, pluraModifier
	);
	
	print(guessMessage);
	
}

 

 

  
위 함수를 수정하여 맥락을 분명하게 만들어 보자. 일단 함수가 좀 길다. 그리고 세 변수를 함수 전반에서 사용한다. 함수를 작은 조각으로 쪼개고자 GuessStatisticsMessage라는 클래스를 만든 후 세 변수를 클래스에 넣었다. 그러면 세 변수는 맥락이 분명해진다. 즉 세 변수는 확실하게 GuessStatisticsMessage에 속한다. 이렇게 맥락을 개선하면 함수를 쪼개기가 쉬워지므로 알고리즘도 더 명확해진다.

//맥락 명확한 예시
public class GuessStatisticsMessage {
	String number;
	String verb;
	String pluraModifier;
	
	public String make(char candidate, int count){
		createPluralDependentMessageParts(count);
		return String.format(
			"There %s %s %s%s", 
			verb, number, candidate, pluraModifier
		);
	}
	
	public void createPluralDependentMessageParts(int count){
		if(count == 0) {
			thereAreNoLetters();
		} else if(count == 1){
			thereIsOneLetters();
		} else {
			thereIsManyLetters();
		}
	}
	
	private void thereAreNoLetters(int count){
		number = "no";
		verb = "are";
		pluraModifier = "s";
	}
	
	private void thereIsOneLetters(int count){
		number = "1";
		verb = "is";
		pluraModifier = "";
	}
	
	private void thereIsManyLetters(int count){
		number = Integer.toString(count);
		verb = "are";
		pluraModifier = "s";
	}
}