클린코드에 나오는 코드들을 Dart로 정리해보았다
좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다
예를 들어 아래와 같은 코드는
void copyStrings(String a, StringBuffer b) {
for (int i = 0; i < a.length; i++) {
b.write(a[i]);
}
}
이렇게 source, destination 으로 구분해주면 의미가 명확해진다.
void copyStrings(String source, StringBuffer destination) {
for (int i = 0; i < source.length; i++) {
destination.write(source[i]);
}
}
이 부분은 그냥 말이 되는 영어 단어를 쓰라는 뜻인 것 같다.
ex) genymdhms 보다는 generationTimestamp같은 명칭을 써라
e, 7 같은 알파벳, 숫자는 너무 많이 검색되기 때문에 변수명으로 좋지 않다
WORK_DAYS_PER_WEEK같이 명확하고 검색이 바로 되는 이름을 써라
변수 이름에 타입을 인코딩할 필요가 없다?
당연한 거 아닌가.. Java스러운건가? 여기는 잘 모르겠다
인터페이스 클래스 앞에 I를 붙이지 않는 것이 좋다고 하는데, 니꼬쌤은 TypeScript Interface 선언할 때 I를 붙이는 편이 낫다고 한 것같은데 좀 다르네
클래스 이름은 명사나 명사구가 적합하다
메서드 이름은 동사나 동사구가 적합하다
하는 역할이 같다면 controller, driver, manager 등 단어는 하나로 통일해라
코드를 읽을 사람도 프로그래머이니 전산 용어, 알고리즘 이름, 패턴 명, 수학 용어 등을 사용해도 된다
적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.
firstName, lastName, street, state, zipcode 등의 변수가 뭉쳐있으면 주소를 뜻하는 것을 알 수 있다
하지만 state라는 변수만 따로 떨어져있으면?
-> addrFirstName, addrLastName, addrState 처럼 주소를 뜻하는 addr 접두어를 붙이면 좋다
클래스, 함수, 이름 등을 추가해서 맥락을 부여하는 것이 좋지만 어려울 때는 마지막 수단으로 접두어를
void printGuessStatistics(String 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 = count.toString();
verb = 'are';
pluralModifier = 's';
}
String guessMessage = 'There $verb $number $candidate$pluralModifier';
print(guessMessage);
}
위의 코드는 함수가 길고, 세 변수 number, verb, pluralModifier를 함수 전반에서 사용한다
함수를 작은 조각으로 쪼개기 위해 GuessStatisticsMessage라는 클래스를 만들고 세 변수를 클래스에 넣으면 맥락이 분명해진다
아래와 같이 수정해보았다
class GuessStatisticsMessage {
late String number;
late String verb;
late String pluralModifier;
void thereAreManyLetters(int count) {
number = count.toString();
verb = 'are';
pluralModifier = 's';
}
void thereIsOneLetter() {
number = '1';
verb = 'is';
pluralModifier = '';
}
void thereAreNoLetters() {
number = 'no';
verb = 'are';
pluralModifier = 's';
}
void createPluralDependentMessageParts(int count) {
if (count == 0) {
thereAreNoLetters();
} else if (count == 1) {
thereIsOneLetter();
} else {
thereAreManyLetters(count);
}
}
String make(String candidate, int count) {
createPluralDependentMessageParts(count);
return 'There $verb $number $candidate$pluralModifier';
}
}