Clean Code 3판을 읽고 정리한 글입니다
Ⅱ. 의미 있는 이름
이름을 잘 짖는 간단한 몇가지 규칙
- 의도를 분명히 밝혀라
- 변수명이나 메서드 명에서 정확하게 의도를 알 수 있는 이름
- 그릇된 정보를 피하라
- 그릇된 단서 : 널리 쓰이는 단어를 다른 의미로 사용, 자료구조 이름을 다른 뜻으롷 사용하는 등
- 역시 이름만 바꾸면 깨끗이 풀리는 문제들
- 의미 있게 구분하라
- 컴파일러/인터프리터만 통과하려는 식의 구현 : 의미 없는 이름 혹은 고민하지 않은 이름들
- 이름이 달라야 한다면 의미도 달라져야한다
- 읽는 사람이 차이를 알도록 이름을 지어야 한다
- 발음하기 쉬운 이름을 사용
- 발음하기 어려운 이름은 커뮤니케이션도 어려움
- 검색하기 쉬운 이름을 사용
- 예제 책등에서 보이는 문자 하나를 사용하는 이름/상수는 쉽게 눈에 띄지 않는다
- ex) e는 영어에서 가장 많이 쓰이는 문자 → 검색을 해서 follow하기가 불가능
- 검색하기 쉬운 이름이 상수보다 좋다
- 이름 길이는 범위 크기에 비례해야한다
- 아주 간단한 메서드의 로컬 변수는 한 문자 사용 가능
- 변수나 상수를 코드 여러 곳에서 사용한다면 그만큼 검색하기 쉬운 이름이 바람직
- 인코딩을 피하라
- 이름에 인코딩(!)할 정보는 어차피 아주 많음
- 인코딩한 이름은 거의 발음하기 어려우며 오타가 생긴다
- 대표적인 예시 : 이제 필요없는 기법들
- 헝가리식 표기법(인코딩 대표방법)
- 멤버 변수 접두어
- 필요한 경우 : 인터페이스와 구현 클래스
- 굳이 하나를 인코딩해야 한다면 구현 클래스의 이름 ex)~~~FactoryImp
- 자신의 기억력을 자랑하지 마라
- 문자 하나만 사용 피하라
- 루프의 반복횟수를 세는 변수 i,j,k는 ok(l은 절대안된다!)
- 최악 이미 a와 b를 사용하므로 c를 사용
- 프로그래머들으 대체로 똑똑 : 자신의 능력을 과시하고 싶음
- 똑똑한 vs 전문가 : 전문가는 명료함이 최고라는 사실을 이해한다
- 클래스 이름
- 클래스 이름, 객체 이름은 명사,명사구가 적합
- Manager, Processor, Data, Info등의 단어는 피하고 동사 사용 X
- 메서드 이름
- 메서드 이름은 동사,동사구가 적합
- 접근자,변경자,조건자는 javabean표준에 따라 get,set,is를 붙인다
- Construct를 overload할때는 정적 팩토리 메서드를 사용한다(생성자 제한으로 private해버리기)
- 기발한 이름은 피하라
- 유머코드, 농담 코드를 넣지 말자
- 특정 문화에서만 사용되는 단어/농담은 피하라
- 재미난 이름보다는 명료한 이름을 선택 : 의도분명, 솔직하게 표현
- 한 개념에 한 단어 사용
- 추상적 개념 하나에 한 단어 고수 : 아니면 어느 클래스에서 어떤 단어를 썼는지 알기 어려움
- 동일 코드에 다른 이름? 읽는 사람은 클래스도 다르고 타입도 다르리가고 생각함
- 말장난 금지
- 한 단어를 2가지 목적으로 사용하지 마라
- 한 개념에 한 단어를 사용하라 하더라도 기존과 맥락이 다르다면 이름을 다르게 해야한다
- 집중적 탐구가 아니라 대충 훑어봐도 이해할 코드 작성이 목표
- 문제 영역에서 가져온 이름 사용하라
- 문제영역과 해법영역을 구분할 것
- 적절한 프로그래머 용어가 없는 문제 영역 개념과 관련이 깊은 코드라면 문제영역에서 이름을 가져온다
- 유지보수 프로그매러가 도메인 전문가에게 의미를 물어 파악 가능
- 의미 있는 맥락을 추가
- 스스로 의미 있는 이름 먼저 → 클래스, 함수, 이름공간에 넣어 맥락 부여 → 전부 실패하면 최후의 방법으로 접두어
- 불필요한 맥락을 없애라
- 의미가 분명한 경우라면 짧은 이름이 긴 이름보다 좋다 : 불필요한 맥락 추가X
구글 자바 스타일 가이드
- p31 인터페이스 클래스와 구현 클래스 부분
- 밥 아저씨는
ShapeFactoryImp
가 좋다고 하지만CircleFactory
가 훨씬 좋음
- 밥 아저씨는
- 구글 자바 스타일 가이드에서 5번째 : https://google.github.io/styleguide/javaguide.html
- 패키지 이름 : 모두 소문자, 언더스코어 없이
- 클래스 이름
- UpperCamelCase(대문자 시작)
- 명사/명사구
- 인터페이스도 명사/명사구이지만 때때로 형용사/형용사구 ex)
Readable
(그러면 클래스는ClassImplReadable
이런식으로) - 테스트 클래스는
Test
로 끝나야 한다
- 메서드 이름
- lowerCamelCase(소문자 시작)
- 동사/동사구
- JUnit test 메서드에서 한해서 언더스코어 등장
- 패턴 :
<methodUnderTest>_<state>
, for examplepop_emptyStack
- 패턴 :
- 상수 이름
- 상수 : 완전 불변,ㅡ 메서드 감지 가능한 부작용 없는 static final
- 인스턴스의 상태가 변경될 수 있는 경우 상수가 아님 : 단순히 객체변형을 막는것이 목적이 아니다
- CONSTANT_CASE : 모두 대문자, 언더스코어(_)로 각 단어 구분
- 상수가 아닌 필드 이름
- lowerCamelCase
- 정적이나 다른것들 ㅂ포함
- 파라미터
- lowerCamelCase
- public 메서드일때 한 글자 파라미터 이름은 피해야 한다
- 지역 변수
- lowerCamelCase
- final, 불변이어도 지역변수는 상수로 간주 되지 않으며, 상수 스타일 지정하지 말아야
- Type 변수 이름
- 단일 대문자, 추가적으로 한자리 숫자가 따라올수 있음(
E
,T
,X
,T2
) - 클래스 명명 규칙+ T : (
RequestT
,FooBarT
)
Related POST
- [Clean Code] Ⅰ. 깨끗한 코드
- [Clean Code] Ⅱ.의미 있는 이름
- [Clean Code] Ⅲ. 함수
- [Clean Code] Ⅳ. 주석
- [Clean Code] Ⅴ. 형식 맞추기
- [Clean Code] Ⅵ. 객체와 자료구조
- [Clean Code] Ⅶ. 오류 처리
- [Clean Code] Ⅷ. 경계
- [Clean Code] Ⅸ. 단위 테스트
- [Clean Code] Ⅹ. 클래스
- [Clean Code] Ⅺ. 시스템
- [Clean Code] Ⅻ. 창발성(創發性)
- [Clean Code] XIII. 동시성
- [Clean Code] XIV. 점진적 개선(SUCCESSIVE REFINEMENT)
- [Clean Code] XV. JUnit 들여다보기
- [Clean Code] XVI. SerialDate 리팩터링
- [Clean Code] XVII. 냄새와 휴리스틱
- [Clean Code] 다 읽었다~