📘 Read
클린 코드 | 의미 있는 이름
category
📘 Read
1. 의도를 분명히 밝혀라.2. 그릇된 정보를 피하라.3. 의미 있게 구분하라.4. 발음하기 쉬운 이름을 사용하라.5. 검색하기 쉬운 이름을 사용하라.6. 인코딩을 피하라.7. 자신의 기억력을 자랑하지 마라.8. 클래스 이름, 메서드 이름9. 기발한 이름은 피하라.10. 한 개념에 한 단어를 사용하라.11. 말장난을 하지 마라.12. 해법 영역에서 가져온 이름을 사용하라.13. 문제 영역에서 가져온 이름을 사용하라. 14. 의미 있는 맥락을 추가하라.15. 불필요한 맥락을 없애라.
소프트웨어에서 이름은 어디나 쓰인다. 이름을 잘 지으려면 여러 모로 편하다. 이름을 잘 짓는 간단한 규칙을 소개하겠다.
1. 의도를 분명히 밝혀라.
따로 주석이 필요한 코드는 의도를 분명히 드러내지 못했다는 말이다.
- 변수(혹은 함수나 클래스)의 존재 이유
- 변수의 수행 기능
- 변수의 사용 방법
// 변경 전 int d; //경과 시간 (단위: 날짜); // 변경 후 int daysSinceCreation;
2. 그릇된 정보를 피하라.
서로 흡사한 이름을 사용하지 않도록 주의한다.
- 이름으로 그릇된 정보를 제공하는 단어는 사용하지 말자.
int a = 1; if(O == 1) a = O1; else l = 01;
특히 소문자 L과 대문자 O변수다. L은 숫자 1로 보이고 O는 숫자 0처럼 보인다.
3. 의미 있게 구분하라.
컴파일러나 인터프리터만 통과하려는 생각으로 짠 코드는 문제를 일으킨다.
- 연속된 숫자를 덧붙이는 방식은 사용하지 않는다. 이름이 달라야 한다면 의미도 달라져야 한다.
public static void copyChars(char a1[], char a2[]){ for (int i = 0; i < a1.length; i++){ a2[i] = a1[i]; } }
- 불용어를 추가한 이름은 아무런 정보도 제공하지 못한다.
만약
Product
클래스가 있다하자. 다른 클래스를 ProductInfo
혹은 ProductData
라 부른다면 개념을 구분하지 않은 채 이름만 달리한 경우다. Info나 Data는 의미가 불분명한 불용어다.- 읽는 사람이 차이을 알도록 이름을 지어라.
4. 발음하기 쉬운 이름을 사용하라.
발음하기 쉬운 이름을 사용한다면 대화하기 편해진다.
private Date genymdhs; private Date generationTimestamp;
5. 검색하기 쉬운 이름을 사용하라.
문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다는 문제점이 있다.
- 이름 길이는 범위 크기에 비례해야 한다.
// 변경 전 for(int j=0; j>34; j++){ s += (t[j]*4)/5; } // 변경 후 : 검색도 가능하고, 이름의 의미를 쫒아 코드 파악이 가능하다. int realDaysPerIdealDay = 4; const int WORK_DAYS_PER_WEEK = 5; int sum = 0; for(int j=0; j < NUMBER_OF_TASKS; j++){ int realTaskDays = taskEstimate[j] * realDaysPerIdealDay; int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK); sum += realTaskWeeks; }
WORK_DAYS_PER_WEEK를 그냥 5로 사용한다면 5가 들어가는 이름을 모두 찾은 후 의미를 분석해야 하는 문제점이 있다. 검색을 고려한 이름을 사용하자.
6. 인코딩을 피하라.
인코딩한 이름은 거의 발음하기 어려우며 오타가 생기기도 쉽다.
- 클래스와 함수는 접두어가 필요없을 정도로 작아야 마땅하다.
// 멤버변수를 의미하는 접두어 m_ public class Part{ private String m_dsc; } public class Part{ private String description; }
7. 자신의 기억력을 자랑하지 마라.
독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수 이름은 바람직하지 못한다.
8. 클래스 이름, 메서드 이름
클래스 이름: 명사나 명사구
메서드 이름: 동사나 동사구
9. 기발한 이름은 피하라.
재미난 이름보다 명료한 이름을 선택하라.
- 의도를 분명하고 솔직하게 표현하라.
// 변경 전 function whack() {} // 변경 후 function kill() {}
10. 한 개념에 한 단어를 사용하라.
메서드 이름은 독자적이고 일관적이어야 한다.
11. 말장난을 하지 마라.
한 단어를 두 가지 목적으로 사용하지 마라.
- 일관성을 지켜야 한다.
// 새로운 값 추가 function addMovie() {} // 집합에 값 하나 추가 function addUser() {} // 수정 후 function addMovie() {} function insertUser() {}
추가하는 의미는 같지만 두 add는 일관성이 다르다.
일관성을 지킨다면
insert
나 append
라는 이름이 적당하다.12. 해법 영역에서 가져온 이름을 사용하라.
코드를 읽을 사람도 프로그래머라는 사실을 명심한다.
전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 된다.
13. 문제 영역에서 가져온 이름을 사용하라.
적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.
14. 의미 있는 맥락을 추가하라.
스스로 의미가 분명한 이름이 없지는 않다. 하지만 대다수 이름은 그렇지 못하다.
그래서 클래스, 함수, 이름 공간에 넣어 맥락을 부여 한다. 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.
// 하나만 사용하면 주소 관련 변수임을 모른다. String firstName, lastName, street, houseNumber, city, state, zipcode; // 접두어를 사용하면 맥락이 좀 더 분명해진다. String addrFirstName, addrLastName, addrStreet, addrHouseNumber, addrCity, addrState, addrZipcode; // 클래스를 생성 : 변수가 큰 개념임이 컴파일러에도 분명해진다. class Address{ String addrFirstName; String addrLastName; String addrStreet; String addrHouseNumber; String addrCity; String addrState; String addrZipcode }
15. 불필요한 맥락을 없애라.
일반적으로 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다. 이름에 불필요한 맥락을 추가하지 않도록 주의 한다.