넘치게 채우기

Clean Code 2장. 의미 있는 이름 본문

개발/Clean Code

Clean Code 2장. 의미 있는 이름

riveroverflow 2023. 7. 25. 17:40
728x90
반응형

소프트웨어에서 이름은 어디나 쓰입니다. 우리는 변수, 함수, 인수, 클래스, 패키지, 파일과 폴더 등 모두 이름을 붙입니다.

이렇게 많이 쓰이는 이름을 처음에 한 번 잘지으면 앞으로의 개발이 편해집니다.

의도를 분명히 밝혀라

좋은 이름을 만드는데에는 시간이 걸릴 수 있으나, 그로인해 앞으로 절약될 시간은 더 큽니다.

개발을 하다가도, 더 나은 이름이 생각나면 모두 바꾸십시오.

 

변수나 함수, 클래스의 이름은

  • 존재 이유
  • 수행 기능
  • 사용 방법

을 주석 없이 표현할 수 있어야 합니다.

 

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

보다

int elapsedTimeInDays;
int daysSinceCreation;

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

 

그릇된 정보를 피하라

널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안되고, 유사한 이름을 써서도 안됩니다.

 

예를 들어, List라는 단어는 실제 리스트가 아니라면 함부로 이름에 사용하면 안됩니다. 실제 프로그래머에게 잘못된 정보를 전달할 수 있습니다.

 

 

의미 있게 구분하라

컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하면안됩니다.

연속적인 숫자를 붙이거나 불용어를 추가하는 방식은 적절하지 않습니다. 이름이 달라야 한다면 의미도 달라져야 합니다.

 

public static void copyChars(char a1[], char a2[]){
	for(int i = 0; i < a1.length; i++){
		a2[i] = a1[i];
	}
}

보다는

public static void copyChars(char source[], char destination[]){
	for(int i = 0; i < source.length; i++){
		destination[i] = source[i];
	}
}

가 더 적절한 표현일것입니다.

 

NameString과 Name, moneyAmount와 money 등도 함께 존재한다면 혼동될 이름들입니다.

 

읽는 사람들이 차이를 알 수 있도록 이름을 지어야 합니다.

 

 

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

우리의 뇌는 발음이 되는 단어들을 편하게 처리합니다.

프로그래밍은 사회 활동입니다. 타인과 코드를 같이 보고, 토론합니다.

getName()메서드를 “쥐 이 티 엔 에이 엠 이”라고 하는 것 보다, “겟네임”이라고 읽을 수 있는게 편합니다.

int registeredYymmdd; //가입일 변수
int registeredDate; 

위보다 아래가 더 보기에도 좋고, 읽기에도 더 좋습니다.

 

 

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

문자 하나를 쓰는 이름은 쉽게 눈에 띄지 않습니다. 특히 문자 e를 변수로 지으면 더더욱 찾기 힘듭니다.

영어 단어에서 가장 많이 쓰이는 알파벳이기 때문입니다.

이름을 의미 있게 지으면 코드가 길어질 수 있습니다. 그러나, 찾기에는 특히 쉬울 것입니다.

 

 

인코딩을 피하라

과거의 프로그래머들은 부실한 IDE를 가지고 있어서 변수나 함수 앞에 데이터 타입을 명시하도록 하였습니다.

이를 헝가리안 표기법이라고 하였습니다.

예를 들어, 클래스의 멤버 변수 앞에는 m_변수명과 같은 식으로 표기하였습니다.

 

그러나, 오늘날에는 개발 환경에서 자료형을 쉽게 볼 수 있습니다.

마우스 커서만 올려도 변수나 함수의 정보가 쉽게 뜹니다.

이제는 이러한 인코딩이 코드의 가독성을 떨어트립니다.

 

 

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

문자 하나만 사용하는 변수이름은 문제가 있습니다.

(단, 반복문에서의 i,j,k정도는 루프 범위가 아주 작고 다른 이름과 충돌하지 않는다면 괜찮습니다.)

 

똑똑한 프로그래머와 전문가 프로그래머의 차이 중 하나는

전문가 프로그래머는 명료함이 최고라는 것을 알고 있다는것입니다.

 

클래스 이름

클래스 이름과 객체 이름은 명사나 명사구가 적합합니다.

Customer, WikiPage 등.

메서드 이름

메서드 이름은 동사나 동사구가 적합합니다.

postPayment, save 등.

 

접근자, 변경자, 조건자는 앞에 각각 get, set, is를 붙입니다.

getName(), setState(), isPosted()

 

기발한 이름은 피하라

이름이 기발하면 농담을 기억하는 사람과, 재치 있는 일부의 사람들만 기억할 수 있습니다.

우리의 목표는 모든 개발자들이 이해할 수 있는 코드여야 합니다.

솔직하고 분명한 의도를 표현해야 합니다.

 

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

같은 메서드를 클래스마다 fetch, get, retrieve 등으로 제각각 부르면 혼란스러워집니다.

우리는 일관성 있는 어휘를 사용할 필요가 있습니다.

 

 

말장난을 하지 마라

예를 들어, 기존 두 문자열 을 더하는 add라는 메서드가 있는데,

새로운 문자열을 받아서 기존 문자열에 더하는 메서드명도 add라고 하면 문제가 생깁니다.

append라고 정하는 것이 적합합니다.

 

코드는 훑어도 읽기 쉽도록 짜야 합니다.

 

 

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

코드를 읽을 사람은 일반인이 아니라 프로그래머입니다.

프로그래머들이라면 이해할 알고리즘 이름, 용어 등을 사용해도 괜찮습다.

 

 

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

적절한 프로그래머 용어가 없다면, 문제 영역에서 이름을 가져오는게 좋습니다.

그러면 처음 코드를 보는 프로그래머는 분야 전문가에게 의미를 물어 파악할 수 있습니다.

 

의미 있는 맥락을 추가하라

스스로 의미가 분명한 이름을 사용해야 합니다.

firstName, lastName, street, houseNumber, state라는 변수가 있다고 해봅시다.

사람과 집 주소 관련 정보를 담는 것으로 유추할 수 있습니다.

만약에 이 중에서 state만 사용하는 메서드가 있다면?

 

우리는 혼동이 올 것입니다. 따라서 변수 하나만으로 그 변수의 목적을 유추할 수 있어야 합니다.

 

 

불필요한 맥락을 없애라

고급 휘발유 충전소(Gas Station Deleuxe)라는 애플리케이션을 짠다고 가정했을 때,

GSD를 클래스 이름 앞에 붙이는 것은 적합하지 않습니다.

IDE에서 G를 입력하면 가능한 모든 클래스를 열거하는데, 이러면 필터의 의미가 없어질 것입니다.

 

 

마무리

좋은 이름을 선택하려면 설명 능력이 뛰어나야 하고 문화적인 배경이 같아야 합니다.

 

사람들이 이름을 바꾸지 않으려는 이유는 다른 개발자가 반대할까봐인데,

전혀 그렇지 않습니다. 더 좋은 이름을 제안받으면 더 좋아할것입니다.

 

이 기법들은 단기적인 효과와 장기적인 이익 모두 보장할 것 입니다.

 

우리는 ‘나’만 알아보는 이름이 아닌, ‘우리’가 알아보는 이름을 지어야 합니다.

읽자마자 머릿속에서 바로 그려지는 이름을 만드는 센스를 길러봅시다!

 

728x90
반응형

'개발 > Clean Code' 카테고리의 다른 글

6장. 객체와 자료 구조  (0) 2023.08.04
5장. 형식 맞추기  (0) 2023.08.03
4장. 주석  (0) 2023.08.01
3장. 함수  (0) 2023.07.30
Clean Code 1장. 깨끗한 코드  (0) 2023.07.23