의미 있는 이름
소프트웨어에서 이름은 어디에나 쓰이므로, 이름을 잘 지으면 여러모로 편하다.
ex) 변수, 함수, 클래스, 패키지, 소스 파일, 디렉터리, jar파일, war 파일
의도를 밝혀야 한다.
변수, 함수, 클래스 이름은 다음 질문에 모두 답해야 한다.
적합한 이름
클래스 이름
- 명사나 명사구
- 좋은 예) Customer, WikiPage, Account, AddressParser
- 나쁜 예) Manager, Processor, Data, Info
메서드 이름
- 동사나 동사구
- 접근자, 변경자, 조건자는 javabean 표준에 따라 앞에 get, set, is를 붙인다.
- 생성자를 중복 정의할 때는 정적 팩토리 메서드를 사용한다.
- 메서드는 인수를 설명하는 이름을 사용한다.
- ex) new Complex(23.0) → Complex.FromRealNumber(23.0)
그릇된 정보를 전달하면 안 된다.
그릇된 단서를 남기면 안 된다.
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용할 경우
- 직각삼각형의 빗변(hypotenuse)의 이름을 hp로 사용하면 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름과 겹친다.
- 여러 계정을 그룹으로 묶을 때, 실제 List가 아님에도 accountList라 명명하는 경우
- 일관성이 떨어지는 표기법을 사용한 경우
- 구분하기 힘든 소문자 L과 대문자 O를 사용할 경우
의미 있게 구분하는 법
- 연속된 숫자를 덧붙이면 안 된다.
- 불용어(noise word)를 추가하면 안 된다.
- ProductInfo와 ProductData처럼 개념을 구분하지 않은 채 이름만 달리할 경우 (의미가 불분명한 불용어 사용)
- variable, table 등의 중복된 단어를 사용할 경우
- NameString 처럼 당연한 표현을 할 경우 (이 경우, Name이 String이 아니면 그릇된 정보를 제공하게 된다.)
쉬운 이름을 사용하라
- 발음하기 쉬운 이름을 사용하라
- 검색하기 쉬운 이름을 사용하라
인코딩을 피하라
- 헝가리식 표기법은 사용하지 말자.
- phoneString처럼 타입을 이름에 명시하는 행위
- 멤버 변수에 접두어를 붙이지 말자.
- 인터페이스는 클래스 명처럼 사용하고, 구현 클래스는 인코딩하여 표기한다.
- 내가 다루는 클래스가 인터페이스라는 사실을 남에게 알리지 않는다.
- 구현 클래스 좋은 예) ShapeFactoryImp, CShapeFactory
명료한 이름을 사용하자
- 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면, 바람직하지 못한 이름이다.
- 문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택했기 때문에 생기는 문제
- 문자 하나만 사용하는 변수 이름은 적절하지 못하다.
- 루프에서 반복 횟수를 사용하는 경우를 제외한 나머지 경우
- 기발한 이름은 피하라.
- 좋아하는 책에서 따오는 것처럼, 누구나 알 수 없는 이름
- 구어체나 속어를 이름으로 사용하는 경우: kill() → whack()
단어와 이름
- 한 개념에 한 단어를 사용하라
- 추상적인 개념 하나에 단어 하나를 선택해 이를 고수해야 한다.
- 똑같은 메서드를 클래스마다 fetch, retrieve, get 등으로 부른다.
- 한 단어를 두 가지 목적으로 사용하지 마라.
- 다른 개념에 같은 단어를 사용하는 경우
- add 메서드가 기존 값 두 개를 더하거나 이어서 새로운 값을 만드는 경우, 집합에 값 하나를 추가하는 메서드를 새로 구현할 경우 이 메서드의 이름은 add가 아닌 insert나 append가 되어야 한다.
영역과 이름
- 해법 영역에서 가져온 이름을 사용하라
- 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등
- 적절한 ‘프로그래밍 용어’가 없다면 문제 영역에서 가져온 이름을 사용한다.
- 코드를 보수하는 프로그래머는 전문가에게 의미를 물어 파악할 수 있다.
- 단, 모든 이름을 문제 영역에서 가져오면 매번 고객에게 의미를 물어야 한다.
맥락과 이름
- 의미 있는 맥락을 추가하라
- 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
- 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.
- 불필요한 맥락은 없애라
- 고급 휘발유 충전소(Gas Station Deluxe)라는 애플리케이션을 짠다고 가정할 때, 모든 클래스 이름을 GSD로 시작하는 경우
- 의미가 분명한 경우에 한해 짧은 이름이 긴 이름보다 좋다.
Reference
참고 서적
📔 Clean Code