SW개발/개발이야기

좋은 변수명을 짓는 것에 대하여 (feat. 읽기 좋은 코드가 좋은 코드다)

개발자라면 늘 고민하게 되는 부분이 있습니다. 바로 "변수명, 함수명을 어떻게 지어야 할까?" 에 대한 이야기 입니다. 변수명을 짓는 것에 늘 고민이 많은 것은 사실이지만, 대부분은 습관에 의해 자주 사용한 변수명만 사용하게 되는 것 같습니다. 혹은 너무 생각을 많이한 나머지 잘 사용되지 않거나 어색한 네이밍이 나오기도 합니다.

 

대체 어떻게 지어야 명확하고 모두가 이해하기 쉬울까..라는 생각을 하다가 알게된 책이 있어 읽으면서 좋았던 내용을 정리해보고자 합니다.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788979149142 

 

읽기 좋은 코드가 좋은 코드다 - 교보문고

더 나은 코드를 작성하는 간단하고 실전적인 테크닉 | ♣ 더 나은 코드를 작성하는 간단하고 실전적인 테크닉!이 책은 매우 읽기 편한 코드를 작성하는 방법을 설명한다. 이 책을 관통하는 핵심

www.kyobobook.co.kr

해당 책에는 좋은 코드를 작성하기 위한 테크닉들을 많이 소개해주고 있습니다. 언어의 장벽과는 별개로 프로그래밍 전반적으로 통용되는 이야기들이 주로 담겨져 있어 개발하는 사람이라면 누구나 읽기 쉽게 되어있습니다.

저도, 주니어 개발자로서 이 책을 읽고 짧은시간에 굉장히 많은 도움이 되었던 것 같습니다.

 

이름에 정보를 담아보자

특정한 단어 고르기

생각보다 프로그래밍에 사용되는 대다수의 이름들은 많은 정보를 포함하고 있지 않습니다. (tmp, size,  get 등) 예를들어, 다음과 같은 함수에 사용된 'get'은 지나치게 보편적입니다.

def get_page(self):
    ...
    pass

이 함수에서 get은 많은 의미를 전달하고 있지 않습니다. 과연 이 함수는 로컬 캐시, 데이터베이스, 인터넷 중 어느 곳에서 page를 가져오는지 함수의 네이밍만으로 파악할 수 있을까요? 따라서, 인터넷에서 가져오는 것이라고 한다면, fetch_page, download_page와 같은 네이밍이 더욱 적합할 것입니다.

 

또다른 예시로, def stop() 이라는 함수가 있다고 가정하겠습니다. 만약 다시는 되돌릴 수 없는 최종 동작을 수행하는 것 과 같은 경우에는 def kill(), 되돌릴 수 있는 경우라면 def resume() & pause()와 같은 네이밍이 조금 더 적합할 것입니다.

 

tmp, for i, j 같은 보편적인 이름 피하기

tmp는 두 변수를 서로 교환하는 전형적인 알고리즘에서 완벽한 이름입니다.

tmp의 좋은 예시 ⭕️
tmp = right
right = left
left = tmp

다만, 임시저장소의 역할이 아닌 다른 용도로 사용되는 경우 적합하지 못합니다. 

tmp의 나쁜 예시 ❌
String tmp = user.name();
tmp += " " + user.phone_number();
tmp += " " + user.email();
...
template.set("user_info", tmp);

위의 코드의 경우에는 tmp 보다는 user_info와 같은 이름이 더 적절합니다.

 

i, j 는 반복문에서 매우 흔하게 사용됩니다. 여기에 조금의 정보를 추가한다면 더 좋게 만들 수 있습니다.

i, j의 나쁜 예시 ❌
for (int i = 0; i < clubs.size(); i++)
    for (int j = 0; j < member.size(); j++)
    
i, j의 좋은 예시 ⭕️
for (int clubs_i = 0; clubs_i < clubs.size(); i++)
    for (int members_j = 0; members_j < member.size(); j++)

위의 코드처럼 어느 배열의 인덱스인지에 대한 정보를 넣어주면 "i, j가 뭐더라...?" 하는 것과 같은 부작용을 없앨 수 있습니다.

 

세부 정보를 덧붙여라

밀리 초와 같은 값을 저장하는 변수라면 XXX_ms와 같이 단위를 포함해주는 것이 좋습니다. 이스케이핑을 수행하는 경우라면 raw_XXX처럼 세부 정보를 덧붙이는 것이 좋습니다.

 

사용 범위가 넓으면 긴 이름을 사용하라

여러 소스코드에 걸쳐 사용되는 변수의 이름이라면 하나로 축약하여 짓기 보다는 긴 문자로 구성하는 편이 오히려 더 좋습니다.

 

오해할 수 없는 이름이란?

경계를 포함하는 한계값을 다룰 때는 min, max를 사용하라

한계값을 다루기 위한 단어중에 하나로 limit이 존재합니다. 다만, 이경우 해당 수를 포함하는 지에 대한 여부가 분명하지 않습니다. min, max를 활용한다면 해당 수를 포함하는 것으로 한계에 대한 기준이 명확해지게 됩니다.

 

경계를 포함하는 범위에는 fisrt, last를 사용하라

경계의 양 끝을 포함하는 범위의 경우에는 first, last를 사용하는 것이 좋습니다. 혹은 위에서 언급한 min, max가 문맥적으로 의미있게 들린다면 또한 사용이 가능합니다.

 

경계를 포함하고/배제하는 범위에는 begin과 end를 사용하라

begin과 end는 범위의 한쪽 끝이 포함되지만 다른 한쪽 끝은 포함되지 않는 경우에 편리하게 사용됩니다.

 

불리언 변수에 이름 붙이기

아래와 같은 코드에서는 읽는 방법에 따라 정말 상반된 해석이 가능한 경우입니다.

bool 변수의 나쁜 예시 ❌
bool read_password = true;
  1. 우리는 패스워드를 읽을 필요가 있다.
  2. 패스워드가 이미 읽혔다.

이 경우에는 read 라는 단어 대신, need_password, user_is_authenticated 와 같은 네이밍으로 대체하는 것이 좋다.

일반적으로 불리언 변수에는 is, has, can, should와 같은 단어를 더하면 의미가 명확해진다.


책을 읽으면서 중요하다고 생각되는 부분들을 정리하게 되었습니다. 단순히 네이밍과 관련된 부분만 적었는데 다른 부분들도 좋은 내용들이 꽤 많아 한번쯤 읽어보시는 것도 좋을 것이라고 생각됩니다. 다음 포스팅에서는 주석과 관련된 내용을 정리해볼 예정입니다.

 

읽어주셔서 감사합니다 :)

 

728x90