[이 포스팅은 아래 서적을 읽고 작성한 글입니다]
http://www.yes24.com/Product/Goods/11681152
우리는 수많은 곳에 이름을 붙여 사용한다. 가령 시계를 예로 들자면, '시간을 알려준다'는 용도는 동일하지만 그 생김새와 특성에 따라 괘종시계, 손목시계, 아날로그시계, 디지털시계 등등 다양한 이름을 가지게 된다. 만약 누군가 '손목시계를 봤다'라고 한다면 우리는 손목에 찬 작은 시계를 바라보는 행동을 상상할 수 있을 것이다. 커다란 괘종시계를 손목에 차고 다니지는 않을 테니 말이다. 이렇게 우리는 이름만 가지고도 그와 관련한 특정한 행동이나 결과를 상상하거나 추측해볼 수 있다.
코드 역시 마찬가지다. 변수와 함수를 시작으로 인수와 패키지, 각종 파일에 이르기까지 프로젝트는 이름의 집합이라고 해도 과언이 아닐 정도로 도처에서 이름을 사용한다. 자연스레 프로그래머는 이름을 지을 일도 많아지는데, 이때 그 코드의 이름만 보고도 어떤 기능을 하는지 추측할 수 있을 만큼 잘 짓는 것이 클린 코드의 가장 기초라고 할 수 있다.
의도를 분명히 밝혀라
변수나 함수, 그리고 클래스 이름은 존재 이유와 수행 기능, 사용 방법과 같은 의도를 분명히 드러내야한다.
다음과 같은 코드는 주석이 없다면 어떤 값을 담고 있는 변수인 지 쉽게 알 수 없다.
int d;
하지만 다음과 같이 작성한다면, 날짜를 담고 있는 변수라는 것을 쉽게 알 수 있다.
int day;
마찬가지로 다음과 같은 함수는 어떤 값을 리턴하는 함수인지 알기 힘들다.
int func()
{
return list.Count();
}
하지만 다음과 같이 작성한다면, 주석 없이도 리스트에 저장된 학생의 수를 리턴하는 함수라는 사실을 쉽게 추측할 수 있을 것이다.
int studentNum()
{
return studentList.Count();
}
단순히 이름만 변경했는데도 코드가 어떤 동작을 하는지 이해하기 쉬워진 것을 알 수 있다.
그릇된 정보를 피하라
인터넷 서핑을 자주 하던 사람이라면 몇 년 전 인터넷에 돌아다니던 아래의 짤을 봤을 지도 모른다.
진실 여부는 알 수 없고 장난처럼 느껴지는 글이기도 하지만, 한 가지 확실한 것은 코드명을 작성 할 때 생각보다 자주 일어날 수 있는 상황이라는 것이다. 만약 당신이 전체 조류의 수에서 조류 독감에 걸린 조류의 비율을 구하는 다음과 같은 함수를 작성했다고 해보자. 이때 조류 독감(Avian Influenza)의 약자인 AI와 비율(Rate)를 합쳐 다음과 같은 변수명을 생성할 수 있다.
double getAIRate()
{
double aiRate;
aiRate = aiNum / allNum;
return aiRate;
}
위는 조류 독감의 비율을 '조류 독감에 걸린 수 / 전체 수 '로 구한 뒤 이를 리턴해주는 함수이다.
하지만 이 함수가 조류 독감에 걸린 비율을 구하는 것이라는 사실을 알지 못한다면, 코드를 읽는 사람은 인공지능(Artificial Intelligence)의 성능을 구하는 함수라고 착각할 수도 있다. 개발자의 의도와는 완전히 다른 기능을 수행하는 것으로 오해 받을 수 있는 것이다. 따라서 이렇게 혼란을 야기할 수 있는 변수명은 최대한 지양하는 것이 좋다.
다른 예시로, 다음과 같은 클래스가 있다고 하자.
class Logln{
}
이 클래스를 읽는 개발자들은 아마 로그인과 관련된 클래스라고 추측했을지 모르겠지만, 사실 위의 클래스가 Log + ln이 합쳐져 만들어진 로그를 구하는 클래스라고 한다면 이 역시 잘못된 명칭 지정일 것이다.
소문자 L과 숫자 1 역시 유사하게 보일 수 있으며, 대문자 O와 숫자 0도 혼동될 수 있다. 때론 폰트를 변경하여 쉽게 구분을 할 수 있도록 만드는 것도 하나의 방법이 될 수 있지만, 모든 프로그래머가 같은 폰트를 사용하는 것이 아니므로 원초적인 해결책은 될 수 없다. 따라서 서로 흡사하거나 혼동 될 수 있는 단어를 조합하여 사용하는 것도 조심하는 것이 좋다.
의미 있게 구분하라
개발 시 유사한 기능을 하는 두 변수가 있을 때, 충돌을 피하기 위해 개념은 같지만 이름만 달리한 변수를 짓지 않도록 한다.
예를 들어 ProductInfo 변수에는 가격과 같은 상품의 기본 정보가, ProductData에는 이 상품을 구매한 고객의 정보가 들어있다고 해보자. 하지만 번역하면 두 변수 모두 모두 제품의 정보를 가지고 있다는 뜻으로, 정확히 어떤 정보를 가지고 있는 지 알기 힘들며 따라서 개발 시 어떤 데이터를 참고해야할 지 명확하지 않다.
a와 an, the와 같이 큰 의미가 없는 불용어(의미가 불분명한 언어)도 이름의 길이만 길어질 뿐 의미를 구별하는 데에는 큰 역할을 하지 않는다. 따라서 읽는 사람이 명확한 차이를 알도록 불용어를 사용하지 않고 이름을 짓도록 명심해야한다.
'Programming > Clean Code' 카테고리의 다른 글
[Clean Code] 의미 있는 이름 (3) (0) | 2021.12.07 |
---|---|
[Clean Code] 2장 의미 있는 이름 (2) (0) | 2021.11.24 |
[Clean Code] 1장 깨끗한 코드 (0) | 2021.11.17 |
댓글