[Clean Code] 의미 있는 이름
글 작성자: 망고좋아
반응형
📖 Clean Code - 의미 있는 이름
- 의미 있는 이름
📝 기억하고 싶은 내용
- 의미 있게 구분하라 (p. 25)
- 발음하기 쉬운 이름을 사용하라 (p. 27)
- 검색하기 쉬운 이름을 사용하라 (p. 28)
- 인코딩을 피하라 (p. 29)
- 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
- Customer, WikiPage, Account, AddressParser 등이 좋은 예다.
- Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다. (p. 32)
- 메서드 이름은 동사나 동사구가 적합하다.
- postPayment, deletePage, save 등이 좋은 예다.
- 접근자 Accessor, 변경자 Mutator, 조건자 Predicate는 javabean 표준 4에 따라 값 앞에 get, set, is를 붙인다. (p. 32)
- 기발한 이름은 피하라 (p. 32)
- 한 개념에 한 단어를 사용하라
- 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다. 예를 들어, 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
- 일관성 있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다. (p. 33)
- 의미 있는 맥락을 추가하라
- addr라는 접두어를 추가해 addrFirstName, addrLastName, addrState라 쓰면
맥락이 좀 더 분명해진다. (p. 35)
- addr라는 접두어를 추가해 addrFirstName, addrLastName, addrState라 쓰면
💡 오늘 깨달은 것
- 개발자에게 변수 이름 짓기란 간단하면서도 점심 메뉴를 고르는 것과 같이 최대 고민 중 하나 일 것이다.
- 최근 입사 과제를 진행하면서
모호한 네이밍이 있어 아쉬웠습니다.
라는 피드백을 받았다. 이러한 부분을 어떻게 개선할 수 있을까 고민하면서 책, 구글링 등을 하였다. 그리고 과거의 작성한 변수, 함수명을 보았는데 위와 같은 피드백을 왜 받았는지 알겠으며 반성하게 되었다. - 나만의 규칙을 가지고 변수/함수 이름 짓기를 했는데 프로젝트 때마다 일관성이 부족했던 점을 발견하였다.
- 이번 기회에 노션에 나만의 네이밍 규칙을 문서화하고 이 규칙에 따라 변수/함수명을 지어보자!
🏷 요약
📕 의미 있는 변수 이름 사용
// Bad
function between<T>(a1: T, a2: T, a3: T): boolean {
return a2 <= a1 && a1 <= a3;
}
// Good
function between<T>(value: T, left: T, right: T): boolean {
return left <= value && value <= right;
}
📕 발음할 수 있는 변수 이름을 사용
// Bad
type DtaRcrd102 = {
genymdhms: Date;
modymdhms: Date;
pszqint: number;
}
// Good
type Customer = {
generationTimestamp: Date;
modificationTimestamp: Date;
recordId: number;
}
📕 동일한 유형의 변수는 동일한 단어 사용
// Bad
function getUserInfo(): User;
function getUserDetails(): User;
function getUserData(): User;
// Good
function getUser(): User;
📕 검색할 수 있는 이름을 사용
// /Bad, 86400000이 도대체 뭐지?
setTimeout(restart, 86400000);
// Good, 대문자로 이루어진 상수로 선언하세요.
const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000;
setTimeout(restart, MILLISECONDS_IN_A_DAY);
📕 의도를 나타내는 변수를 사용
// /Bad
declare const users: Map<string, User>;
for (const keyValue of users) {
// users 맵을 순회
}
// Good
declare const users: Map<string, User>;
for (const [id, user] of users) {
// users 맵을 순회
}
📕 불필요한 문맥은 추가하지 마세요
- 클래스/타입/객체의 이름에 의미가 담겨있다면, 변수 이름에서 반복하지 마세요.
// /Bad
type Car = {
carMake: string;
carModel: string;
carColor: string;
}
function print(car: Car): void {
console.log(`${car.carMake} ${car.carModel} (${car.carColor})`);
}
// Good
type Car = {
make: string;
model: string;
color: string;
}
function print(car: Car): void {
console.log(`${car.make} ${car.model} (${car.color})`);
}
📕 short circuiting이나 조건문 대신 기본 매개변수를 사용
- 기본 매개변수는 short circuiting보다 보통 명료하다.
// /Bad
function loadPages(count?: number) {
const loadCount = count !== undefined ? count : 10;
// ...
}
// Good
function loadPages(count: number = 10) {
// ...
}
📕 의도를 알려주기 위해 enum
을 사용하세요
// /Bad
const GENRE = {
ROMANTIC: 'romantic',
DRAMA: 'drama',
COMEDY: 'comedy',
DOCUMENTARY: 'documentary',
}
projector.configureFilm(GENRE.COMEDY);
class Projector {
// Projector의 선언
configureFilm(genre) {
switch (genre) {
case GENRE.ROMANTIC:
// 실행되어야 하는 로직
}
}
}
// Good
enum GENRE {
ROMANTIC,
DRAMA,
COMEDY,
DOCUMENTARY,
}
projector.configureFilm(GENRE.COMEDY);
class Projector {
// Projector의 선언
configureFilm(genre) {
switch (genre) {
case GENRE.ROMANTIC:
// 실행되어야 하는 로직
}
}
}
📌 참고
반응형
'프로그래밍 > Clean Code' 카테고리의 다른 글
[Clean Code] 함수 (0) | 2022.05.01 |
---|---|
[Clean Code] 깨끗한 코드 (0) | 2022.04.23 |
[Clean Code] 클린 코드 시작 (0) | 2022.04.22 |
댓글
이 글 공유하기
다른 글
-
[Clean Code] 함수
[Clean Code] 함수
2022.05.01 -
[Clean Code] 깨끗한 코드
[Clean Code] 깨끗한 코드
2022.04.23 -
[Clean Code] 클린 코드 시작
[Clean Code] 클린 코드 시작
2022.04.22