이 포스팅은 로버트 C. 마틴 의 "Clean Code" 라는 책을 요약한 내용입니다.
🐳 명명법은 왜 중요할까 ?
클린 코드는 하나의 정답이 존재하는 것이 아니다. 굵직한 개발자들도 정의하는 방법이 다양하다.
하지만 모두가 추구하는 바는 비슷하다. 바로 가독성이다. 그것을 어떻게 표현하는지에 따라 단어선택의 차이점이 있을 뿐이다.
이러한 측면에서 명명법은 중요하다고 볼 수 있다. 변수/메소드/클래스 등이 어떤 일을 하는지 명료하게 확인할 수 있기 때문이다.
그렇다면 "Clean Code"에서 소개하는 명명법에 대해 알아보자
🐳 명명법
1. 의도를 분명히 밝혀라
2. 그릇된 정보를 피하라
3. 검색하기 쉬운 이름을 사용하라
4. 클래스 이름은 명사로 메소드 이름은 동사를 사용하라
5. 기발한 이름을 사용하지 마라
6. 한 개념에 한 단어를 사용하라 - 한 단어를 두 가지 목적으로 사용하지 마라
7. 의미 있는 맥락을 추가하라 ! ( 이름의 통일성 )
8. 불필요한 맥락을 제거하라
간추려 보면 명명법의 원칙에는 위와 같은 방법이 있다. 여기서 중요한 것은 이 모든 것은 "명료함"을 위한 것이라는 것이다. 이러한 맥락에서 위의 8가지 방법들을 살펴 본다며 더 이해하기 쉬을 것이다.
1. 의도를 분명히 밝혀라
이는 변수/메소드/클래스의 존재 이유, 수행 기능, 사용 방법 등이 이름을 통해 명확히 이해 되는지 생각해 보면 될 것이다.
책에서는 아래와 같은 예시를 사용했다.
int d; // 경과 시간 : 날짜
d 라는 이름으 보고 경과 시간이라는 것을 바로 이해할 수 있는가 ? 아마 아닐 것이다.
그렇다면 어떻게 표현하는 것이 좋을까?
int daysSinceCreation;
이제는 무슨 의미인지 한 눈에 이해가지 않는가?
이처럼 의도를 분명히 밝히라는 것은 누가 읽어도 "명료"하게 알 수 있게 명명하라는 것이다.
2. 그릇된 정보를 피하라
그릇된 정보의 예시는 다음과 같다
- 비슷한 이름
- 헷갈리는 철자 ( ex. 대문자 I 와 소문자 l 처럼 헷갈리는 철자 )
- 개발자들이 생각하는 단어와 널리 쓰이는 단어의 혼돈 ( 장바구니 List 같은 경우 List가 목록을 의미하는데 이는 개발자들이 생각하는 List의 개념과 다르다 )
이처럼 혼동을 줄 수 있는 이름을 피하라는 것이다.
3. 검색하기 쉬운 이름을 사용하라
int a = 5;
위와 같은 변수가 있다고 생각해보자 IDE를 통해 찾을 수 있겠는가?
아마 이 변수와 관련 없는 많은 것들을 찾게 될 것이다.
하지만 아래의 변수는 어떨까?
int WEEK_DAYS = 5;
아마도 손 쉽게 검색할 수 있을 것이다.
항상 검색하기 쉬운 이름을 사용해야 한다.
4. 클래스 이름은 명사로 메소드 이름은 동사를 사용하라
클래스 이름은 명사로 메소드 이름은 동사를 사용하는 것이 좋다.
또한 클래스 이름의 경우 Data, Info, Manager, Processor 등의 단어를 피하는 것이 좋다.
한 가지 예를 들어보자
AccountData 클래스와 Account 클래스는 어떤 기능이 다른지 설명할 수 있겠는가 ?
아마 어떤 기능이 어떤 클래스에 포함 되어 있는지 불분명할 것이다.
무조건 사용하지 말라는 것은 아니지만 의미가 불 분명하니 피하는 것이 좋을 것이다.
메소드의 경우 보편 적으로 접근자, 변경자, 조건자의 경우 get, set, is 를 사용하는 것이 보편적이다.
이는 이미 많이 사용하고 있어 어렵지 않을 것이다.
5. 기발한 이름을 사용하지 마라
우리가 클린 코드를 구현해야 하는 이유는 무엇일까 ?
프로젝트는 한 사람이 구현하지 않고 구현했던 사람이 유지보수 하지 않는다. 이는 다른 사람이 나의 코드를 읽는 일이 빈번하다는 것이다.
코드는 나의 일기장이 아니다. 다른 사람을 위한 글이라고 생각하는 것이 편할 것이다.
그러므로 나만 아는 기발한 이름을 사용하는 것은 피하자
나 혼자 수박을 참외라고 부를 수는 없는 일 아닌가
6. 한 개념에 한 단어를 사용하라 - 한 단어를 두 가지 목적으로 사용하지 마라
여태까지의 내용은 하나의 변수/메소드/클래스의 이름을 명명할 때 사용되는 방법들이라면 한 개념에 한 단어를 사용하라는 것은 여러 개의 이름을 명명할 때 사용되는 개념이다.
아래의 코드를 살펴보자
def getUser(id):
def readAllUsers():
위의 getUser함수는 특정 id의 User를 가져 오는 함수이다.
아래의 readAllUser함수는 모든 유저를 가져오는 함수이다.
그런데 왜 위의 함수는 get 이라는 접근자 이름을 사용하고 아래의 함수는 read라는 접근자 이름을 사용하는 것일까?
같은 의미에 대해 여러가지 이름을 사용하는 것은 일관성을 해친다.
그러므로 한 개념에는 한 단어를 사용하는 것이 더 명료할 것이다.
7. 의미 있는 맥락을 추가하라 ! ( 이름의 통일성 )
이 또한 마찬가지로 한 개의 이름이 아닌 여러개의 이름들을 명명할 때 사용되는 개념이다.
예를 들어 아래의 변수 명들을 보자
name, address, email, password
위의 네 가지 변수명들은 모두 명확한 개념을 나타내고 있다.
하지만 이 네 가지 변수들이 모두 User라는 개념에서 사용된다는 것을 바로 알 수는 없다.
이처럼 의미 있는 맥락을 추가하라는 것은 여러 이름들에 공통된 맥락을 부여해 조금 더 "명료"하게 만들라는 것이다.
userName, userEmail, userAddress, userPassword 등으로 사용한다면 훨씬 명료하게 다가올 것이다.
이는 User 클래스를 만듦으로서도 해결할 수 있을 것이다.
8. 불필요한 맥락을 제거하라
이 내용은 위의 7번 내용과 상충되는 내용이다.
이는 무분별하게 맥락을 추가하지 말라는 것이다.
예를 들어 내가 운동기록 API를 구현하고 있어 모든 클래스, 메소드 이름 앞에 HealthRecord를 추가한다고 가정해 보자.
HealthRecordUser, HealthRecordBoard 등, 명료하게 느껴지는가?
아마 아닐 것이다. 과도한 맥락을 부여하는 행위는 오히려 명료함을 해칠 수 있다.
심지어 IDE를 통해 자동완성 기능을 사용하는 것조차 어려워질 것이다.
🐳 결론
위의 원칙들을 모두 지켜야 한다는 것은 아니다.
하지만 각각의 변수/메소드/클래스 차원에서 이름을 명료하게 짓고
이름의 집합 단위에서도 맥락을 "명료"하게 파악할 수 있어야 할 것이다.
이는 식당의 간판과도 같은 것이다.
우리 모두 김밥천국에는 분식을 기대하고 들어가지 않는가 !
김밥천국에 들어 갔는데 맥락없이 짜장면이 나온다면 모두 놀랄 것이다.
이처럼 이름은 변수/메소드/클래스의 기능을 명료하게 드러내야 한다.
'개발 지식' 카테고리의 다른 글
객체지향과 절차지향? 무엇을 선택할까 (0) | 2024.09.02 |
---|---|
[인코딩 규칙] ASCII, UNICODE, UTF-8, UTF-16 (3) | 2024.04.18 |
HTTP 메소드 PUT / PATCH 의 차이점 (0) | 2023.08.12 |
Docker는 무엇일까? 왜 사용해야 할까? (0) | 2023.08.02 |