본문 바로가기
Programming/Clean Code

[Clean Code] 2장 의미 있는 이름 (1)

by eungbbang 2021. 11. 22.
반응형

[이 포스팅은 아래 서적을 읽고 작성한 글입니다]

 

http://www.yes24.com/Product/Goods/11681152

 

Clean Code 클린 코드 - YES24

애자일 소프트웨어의 혁명적인 패러다임을 제시하는 책이다. 저자 로버트 마틴은 오브젝트 멘토(Object Mentor)의 동료들과 힘을 모아 ‘개발하며’ 클린 코드를 만드는 최상의 애자일 기법을 정제

www.yes24.com

 


 

 

우리는 수많은 곳에 이름을 붙여 사용한다. 가령 시계를 예로 들자면, '시간을 알려준다'는 용도는 동일하지만 그 생김새와 특성에 따라 괘종시계, 손목시계, 아날로그시계, 디지털시계 등등 다양한 이름을 가지게 된다. 만약 누군가 '손목시계를 봤다'라고 한다면 우리는 손목에 찬 작은 시계를 바라보는 행동을 상상할 수 있을 것이다. 커다란 괘종시계를 손목에 차고 다니지는 않을 테니 말이다. 이렇게 우리는 이름만 가지고도 그와 관련한 특정한 행동이나 결과를 상상하거나 추측해볼 수 있다. 

 

코드 역시 마찬가지다. 변수와 함수를 시작으로 인수와 패키지, 각종 파일에 이르기까지 프로젝트는 이름의 집합이라고 해도 과언이 아닐 정도로 도처에서 이름을 사용한다. 자연스레 프로그래머는 이름을 지을 일도 많아지는데, 이때 그 코드의 이름만 보고도 어떤 기능을 하는지 추측할 수 있을 만큼 잘 짓는 것이 클린 코드의 가장 기초라고 할 수 있다. 

 

의도를 분명히 밝혀라

 

변수나 함수, 그리고 클래스 이름은 존재 이유와 수행 기능, 사용 방법과 같은 의도를 분명히 드러내야한다. 

 

다음과 같은 코드는 주석이 없다면 어떤 값을 담고 있는 변수인 지 쉽게 알 수 없다.

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

댓글