Clean Code - 로버트 C. 마틴
2장, 의미 있는 이름
소프트웨어에서 이름: 변수, 함수, 인수, 클래스, 패키지, 소스파일, 디렉터리, jar, war, ear 등 이름을 많이 사용
➡ 이름을 잘 정하는 것이 중요하다.
1. 의도 밝히기
변수, 함수, 클래스 등 이름을 지을 때 이름에 의도를 담아야 함
🔗따로 주석이 필요하면 의도를 드러내지 못한 것
생각해봐야 할 질문
- 변수(or 함수 or 클래스)의 존재 이유는?
- 수행 기능은?
- 사용 방법은?
ex)
Bad Code
public List<int[]> getThem(){
List<int[]> list1 = new ArrayLists<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
- 변수의 의미가 명확하지 않음
- x[0]의 의미는? 4의 의미는? list1은 어떤 것을 담고 있는가?
Clean Code
- 위와 같은 코드이지만, 확실하게 각 변수들이 어떤 의미를 가지고 있는지 파악할 수 있음
2. 잘못된 정보 피하기
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용❌
ex1) hp(직사각형 빗변), aix, sco ➡️ 본래 의미로 사용할 것
ex2) List: List 형식이 아니라면 잘못된 정보를 제공하는 것 ➡️ List 형식이 아닐 경우 Group, Acoounts 등으로 명명
- 흡사한 이름 사용❌
ex) XYZControllerForEfficentHandlingOfStrings와 XYZControllerForEffcientStorageOfStrings의 차이점은?
- 일관성 있는 표기법 사용
- L과 O 주의 ➡️ 글씨체를 바꿔서 해결
💡 네이버 D2의 CodingFont 추천
3. 의미 있는 구분
- 동일한 범위 안에서 다른 두 개념에 같은 이름을 사용하지 못함
ex) class를 사용하지 못해 klass 사용 등 의미 없는 철자를 바꿔서 구분
- 연속적인 숫자(a1, a2, a3, ...): 정보 제공❌
- 불용어(중복)를 추가한 이름: 정보 제공❌
ex) ProuctInfo와 ProductData는 개념을 구분하지 않고 이름만 다르게 사용함
4. 발음하기 쉬운 이름
5. 검색하기 쉬운 이름
- 이름길이는 범위 크기에 비례해야 함
ex) const int WORK_DAYS_PER_WEEK = 5; 라는 변수는 5라는 상수를 검색할 때보다 쉽게 검색이 가능함
6. 인코딩❌
- 발음하기 어려움, 오타 발생이 쉬움
- 강한 타입(strongly-typed)인 자바의 경우, 클래스 이름을 바꾸어도 타입 이름을 바꾸지 않아도 됨
ex) PhoneNumber phoneString;
- 멤버 변수 접두어: 클래스와 함수는 접두어가 필요 없을 정도로 작아야 함
ex) 기존에는 멤버 변수에는 m_ 접두어를 붙임
- 멤버 변수를 다른 색상으로 표시하는 IDE 사용
- 인터페이스 클래스와 구현 클래스: 구현 클래스 이름을 인코딩
ex) ShapeFactory(인터페이스 클래스) ShaeFactoryImp(구현 클래스)
7. 기억력
- 명료함
- 실제 아는 이름으로 변수 이름을 변환하면 좋지 않은 변수 이름
- 문자 하나만 사용하는 변수의 경우 i, j, k까지만 허용
why? 루트 범위가 매우 작은 경우, 반복 횟수 변수를 주로 i, j, k를 이용하기 때문
8. 클래스 이름
- 클래스 이름과 객체 이름은 명사나 명사구가 적합
ex) 적합한 이름: Customer, WikiPage, Account, AddressParser
↔ Manager ,Processor, Data, Info 등의 단어는 좋지 않음
9. 메서드 이름
- 메서드 이름은 동사나 동사구가 적합
ex) 적합한 이름: postPayment, deletePage, save
- 접근자(Accessor) - get , 변경자(Mutator) - set , 조건자(Predicate) - is는 javabean 표준에 따라 작성
ex) getName(), setName("Mike"), isPosted()
- 생성자 중복정의(overload): 정적 팩토리 메서드 사용
ex) Complex fulcrumPoint = Complex.FromRealNumber(23.0);
Comple fulcrumPoint = new Complex(23.0); --> 해당 코드를 더 선호
10. 기발한 이름❌
11. 한 개념에 한 단어 사용
- fetch, retrieve, get 등 같은 개념에 여러 단어 사용 시 혼란스러울 수 있음
- 일관성 있는 이름 사용
12. 한 단어를 두 가지 목적으로 사용❌
- 일관성 있는 목적
ex) add, insert, append ➡ 비슷한 뜻이지만 각각 다른 목적을 가지고 사용
13. 해법 영역에서 가져온 이름 사용
- 프로그래머 용어(전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등) 사용 ➡ 코드를 읽는 사람도 프로그래머이기 때문
14. 문제 영역에서 가져온 이름 사용
- 코드를 보수하는 프로그래머가 분야 전문가에게 의미를 물어서 파악 가능하도록 함
15. 의미 있는 맥락 추가
ex) 주소를 나타내는 변수
Bad Code
firstName, lastName, street, houseNumber, city, state, zipcode ...
Clean Code
addrFirstName, addrLastName, addrStreet, addrHouseNumber, addrCity, addrState, addrZipcode ...
- 의미를 가지는 접두어를 포함하여 맥락을 분명하게 함
16. 불필요한 맥락❌
- Gas Station Deluxe 애플리케이션 작성 시 모든 클래스 이름을 GSD로 시작하는 것은 불필요한 맥락을 추가하는 것
- 의미가 분명한 경우에는 짧은 이름을 사용
'IT > 책' 카테고리의 다른 글
[Clean Code] 7장, 오류 처리 (0) | 2021.11.07 |
---|---|
[Clean Code] 6장, 객체와 자료 구조 (0) | 2021.11.05 |
[Clean Code] 5장, 형식 맞추기 (0) | 2021.10.30 |
[Clean Code] 4장, 주석 (0) | 2021.10.30 |
[Clean Code] 3장, 함수 (0) | 2021.10.28 |