클린코드 2장은 의미있는 이름을 정하는 것의 중요성과 방법에 대해 설명한다. 여러가지 조건들이 있는데, 필요하고 중요하다는 것은 알지만 막상 코드를 작성하다보면 지키지 않게 되는 부분들이 있다. 그래서 앞으로는 적용하고자 기억하고 싶은 내용을 정리해보려고 한다.
한 개념에 한 단어를 사용하라
똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다. 어느 클래스에서 어떤 이름으로 작성했는지 기억하기 어렵기 때문이다. 마찬가지로 controller, manager, driver를 섞어 쓰면 혼란스럽다. DeviceManager와 ProtocolController는 근본적으로 어떻게 다른가? 일관성있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다.
의미있는 맥락을 추가하라
firstName, lastName, street, state, houseNumber, city, zipcode라는 변수를 보면 주소라는 사실을 알아차린다. 하지만 어느 메서드가 state라는 변수 하나만 사용한다면? 변수 state가 주소 일부라는 사실을 금방 알아챌까?
이때 addr이라는 접두어를 추가하면 맥락이 좀 더 분명해진다. 변수가 좀 더 큰 구조에 속한다는 사실이 적어도 독자(프로그래머)에게는 분명해진다. 물론 Address라는 클래스를 생성하면 더 좋다. 그러면 변수가 좀 더 큰 개념에 속한다는 사실이 컴파일러에게도 분명해진다. 두 코드를 비교해보며 맥락을 분명하게 변수를 작성하는 것을 이해해보자.
아래의 코드는 맥락이 불분명한 변수로 작성된 코드이다. 처음 봤을때는 만약 나도 비슷한 코드를 작성해야한다면 이런식으로 작성하지 않을까 싶었다. 하지만 책에 따르면, 다음과 같은 개선점을 찾을 수 있다.
//맥락이 불분명한 변수
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 voide createPluralDependentMessageParts(int count) {
if(count === 0) {
thereAreNoLetters();
} else if (count === 1) {
thereIsOneLetter();
} else {
thereAreManyLetters(count)
}
}
private voide 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";
}
}