2장. 의미있는 이름

백현균·2023년 1월 2일
0

1. 의도를 분명히 밝혀라

"의도가 분명하게 이름을 지으라" 의도가 분명한 이름이 정말 중요하다는 것을 거듭 강조.

좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많음.

변수, 함수 등 주석이 필요하다는 것은 의도를 드러내지 못했다는 것임

1) 변수선언

- 나쁜 예시
	int d; -- 경과 시간(단위: 날짜)
    
- 좋은 예시
	int elapsedTimeInDays; -- 경과시간
    int daysSieceCreation; -- 생성시간
	int datSineModofication; -- 수정시간
    int fileAgeInDay; -- 파일 입력 시간    

2) 함수 선언

2. 그릇된 정보를 피하라

나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해선 안됨

- 예약어 혹은 널리 알려진 용어들(유닉스 표현 용어인 hp, sco, aix) 등을 사용했을 경우 혼란을 일으킴
- 예시로 계정그룹을 묶을 때 실제 컨테이너가 List가 아닐 경우 변수 이름에 List를 붙이지 말자 
  	ex) accountList, xxxList 등

서로 흡사한 이름을 사용하지 않도록 주의해야 됨

예) 한 모듈에서 XYZControllerForEfficientHandlingOfString를 다른 모듈에선 
XYZControllerForEfficientStorageOfStrings를 사용했을 경우 차이를 알 수 없음

유사한 표기법사용하지만, 일관성이 떨어지면 그릇된 정보임

예) 소문자 L은 숫자 1처럼 보이고, 대문자 O는 숫자 0처럼 보이기 때문에, 유사한 표기 형태 사용 시 주의 필요
int a = l;
if( o == l)
a = O1;
else
l = 01;

3. 의미있게 구분하라

컴파일러나, 인터프리터만 통과하려는 생각으로 코드를 구현하는 프로그래머는 스스로 문제를 일으킴

연속된 숫자나 불용어를 추가하는 것은 적절하지 못함

예1) Product클래스가 존재할 때, 각각의 ProductInfo, ProductData클래스를 만들 경우 둘의 의미가 불분명함. 
예2) Customer vs CustomerObject
결론적으로 읽는 사람이 차이를 알 수 있도록 이름을 지어야 함.

4. 발음하기 쉬운 이름을 사용하라

프로그래밍은 사회적 활동이기 때문에 발음하기 쉬워야됨

5. 검색하기 쉬운 이름을 사용하라

문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않음

- 예시로 숫자 7을 사용 했을 때, 검색을 하게 될 경우 7을 포함한 파일 이름이나 수식 모두 포함하여 검색이 어려움
  MAX_CLASSES_PER_STUDETN = 7; 처럼 사용할 경우 검색이 쉬워짐

- 이러한 관점에서 볼 때 짧은 코드보다 조금은 길지만 긴 코드형태가 검색하기 용이함

6. 인코딩을 피하라

인코딩한 이름은 발음하기 어렵고, 오타가 생기기 쉬움

- 헝가리안 표기법
	DWORD dwCount의 타입이 Int로 바뀌었을 경우 해당 사용된 부분은 int nCount로 전부 변경해야 함.  
    
- 변수에 접두어를 붙이지 말자
	예전에는 클래스의 멤버임을 표현하기 위해 m_xxx 이런식으로 표현했으나, 최근에는 IDE에서 구분할 수 있기에 
    붙일 필요가 없음
    
- 인터페이스 클래스와 구현 클래스의 이름 중 하나를 인코딩해야 할 경우 구현클래스를 선택
	인터페이스: ShapeFactory
    	- IShapeFacotry vs ShapeFactory
        	: 요근래 I를 붙이는것은 주의를 흐트리고, 과도한 정보를 제공하고, 해당 클래스가 인터페이스라는 것을
			  숨기기 싶기에 I를 붙이지 않음
    구현클래스: ShapeFactoryImpl
    

7. 자신의 기억력을 자랑하지 마라

독자가 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수는 바람직한 변수 명이 아님

예시) 호스트와 프로토콜을 제외한 소문자 URL을 r이라는 변수로 표현할 경우

👍 예외적으로 반복문 루프 변수는 i,j,k..n는 사용 가능
	-> 포트란언어에서 시작된 전통적인 방식(l은 제외)

8. 클래스 이름

클래스 혹은 객체의 이름은 명사나 명사구가 적합

좋은 예시) Customer, WikiPage, Account, AddressParser
나쁜 예시) Manager, Processor, Data, Info 등을 비롯한 동사는 사용 X

9. 메소드 이름

메소드의 이름은 동사나 동사구가 적합

좋은 예시) postPayment, deletePage, save... 등

생성자를 중복정의 할 때는 정적 팩토리 메소드 사용

예시) Complex fulcrumPoint = new Complex(23.0) ->
	 Complex fulcrumPoint = Complex.FromRealNumber(23.0)
     👍 생성자를 제한하려면 Private 생성자를 선언

10. 기발한 이름은 피하라

이름이 기발하면 저자와 유머관이 비슷한 사람, 농담을 기억하는 동안만 기억함

재미난 이름보다 명료한 이름을 선택하라

11. 한 개념에 한 단어를 사용해라

추상적인 개념 하나에 단어 하나를 선택해 이를 고수

예를 들어 각각의 클래스마다 fetch, retrieve, get 등으로 제각각으로 부르면 혼란스러움

12. 말장난을 하지 마라

한 단어를 두 가지 목적으로 사용하지 마라

public static String add(String message, String messageToAppend); 
public List<Element> add(Element element);

프로그래머는 코드를 최대한 이해하기 쉽게 작성해야하며, 대충 훑어봐도 이해할 코드를 작성해야함

13. 해법 영역에서 가져온 이름을 사용하라

코드를 읽는 사람도 개발자이기에, 전산용어, 알고리즘, 패턴이름, 수학용어 등의 이름을 사용해도 괜찮음

모든 이름을 문제영역에서 가져오는 정책은 현명하지 않음

14. 문제 영역에서 가져온 이름을 사용하라

13번 항목에서 가져올 이름이 없거나, 문제영역과 관련이 깊을 경우 문제영역의 용어를 사용해야함

15. 의미있는 맥락을 추가하라

클래스, 함수, 네임스페이스(패키지)에 맥락을 부여하며, 모든 방법이 실패하면 마지막 수단으로 접두어를 붙임

쉽게 얘기하면 다때려 박지 말아라.


16. 불필요한 맥락을 없애라

일반적으로 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서임, 이름에 불필요한 맥락을 추가하지 않도록 함

- Gas Station Deluxe(고급 휘발유 충전소)라는 어플리케이션을 만든다고 가정할 때, 모든 클래스 앞에 GSD같은 이름을 붙이는 것은 바람직하지 못함

- GSDAddress 대신 Address로 표현해도 충분함

0개의 댓글