티스토리 뷰

공부

[Clean Code] 2장 : 의미있는 이름

Zedd0202 2018. 2. 11. 18:46
반응형

안녕하세요 :) Zedd입니다.

클린코드 2장 ~.~ 의미있는 이름챕터네요..!!!

이 챕터에서는 이름을 잘 짓는 간단한 규칙을 몇가지 소개할거에요.


의미있는 이름




의도를 분명히 밝혀라

- "의도가 분명하게 이름을 지으라"고 말하기는 쉽지만....좋은 이름을 지으려면 시간이 걸린다. 

==> 하지만 좋은 이름으로 절약하는 시간이 훨씬 더 많음.



그릇된 정보를 피하라

- 프로그래머는 코드에 그릇된 단서를 남겨서는 안된다. 그릇된 단서는 코드 의미를 흐린다. 

- 널리쓰이는 의미가 "있는" 단어를 다른 "의미"로 사용하면 안된다.

- 서로 흡사한 이름을 사용하지 않도록 주의한다. ==> 유사한 개념은 유사한 표기법을 사용한다. 이것도 정보기 때문에, 일관성이 떨어지는 표기법은 그릇된 정보다. 



의미있게 구분하라. 

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

- 컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하기 못하다. 이름이 달라야 한다면 의미도 달라져야 한다.

ex ) Product클래스가 있다고 가정, 다른클래스를 ProductInfo, ProductData라 부른다면 개념을 구분하지 않은 채 이름만 달리한 경우임. Info나 Data는 a, an, the와 마찬가지로 의미가 불분명한 불용어다. 

- 불용어는 중복임. Customer클래스와 CustomerObject라는 클래스의 차이를 알겠니..?:;;



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

- 발음하기 어려운 이름은 토론하기도 어렵다. 프로그래밍은 사회활동이기 때문.



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

- 문자 하나를 사용하는 이름과 상수는 코드에서 눈에 띄지 않는다. ex) 만약 7이라는 이름으로 만들었다면? 검색할때 7이 들어가는 파일이나 코드가 다 검색됨ㅋ;;만약 e라는 문자로 변수이름을 지었다면?? e는 영어에서 가장 많이 쓰이는 문자로, 검색할때 거의 모든 문장에서 검색이 될거임

- (이 저자 개인적으로)간단한 메소드에서 로컬변수만 한 문자로 사용한다. => 이름 길이는 범위 크기에 비례해야 한다. (로컬은 범위가 작으니까 한문자도 가능하지만, 전역이라면 길게 해야한다..뭐 이런거임)




인코딩을 피하라.

- 인코딩한 이름은 거의 발음하기 어려우며 오타가 생기기도 쉽다.



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

- 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수 이름은 바람직하지 못하다.(이 말이 이해가 잘 안가실 수 있는데, 만약 URL을 나타내는 변수 이름을 r로 나타냈다면? 그 코드를 읽는 사람은 아..이게 URL를 나타내는 구나..하고 이 r라는 변수 이름을 내가 아는 이름인 URL로 변환해야 한다면 이 r이라는 변수이름은 바람직 하지 못하다는겁니다.)


- 문자 하나만 사용하는 변수 이름은 문제가 있다. 루프에서 반복횟수를 세는 변수 i, j, k는 괜찮다. 최악은 a와 b를 사용하므로 c를 선택한다는 논리다.

- 전무가 프로그래머는 명료함이 최고라는 사실을 이해한다. 전문가 프로그래머는 자신의 능력은 좋은 방향으로 사용해, 남들이 이해하는 코드를 내놓는다.



클래스 이름

- 클래스 이름과 객체 이름은 명사나 명사구가 적합하다. Manager, Processor, Data, Info등과 같은 단어는 피하고(뜨끔), 동사는 사용하지 않는다.



메소드 이름

- 메소드 이름은 동사나 동사구나 적합하다.



기발한 이름은 피하라.

- 재미난 이름보다 명료한 이름은 선택하라. 

- 특정 문화에서만 사용하는 농담은 피하는 편이 좋다. 

- 의도를 분명하고 솔직하게 표현하라.



한 개념에 한 단어를 사용하라.

- 추상적안 개념 하나에 단어 하나를 선택해 이를 고수한다. 

ex ) 똑같은 메소드를 클래스 마다 fetch, retrieve, get으로 제각각 부르면 혼란스러움

- 마찬가지로, controller, manager, driver를 섞어 쓰면 혼란스러움

- 이름이 다르면 독자는 당연히 클래스도 다르고 타입도 다르리라 생각함.



말장난을 하지마라.

- 한 단어를 두가지 목적으로 사용하지 마라. 다른 개념에 같은 단어를 사용한다면 그것은 말장난에 불과하다. 


어 위에서 "한 개념에 한 단어를 사용하라."고 그랬지?? add라는 메소드가 있다고 생각해봅시다. 모든 add메소드의 매개변수와 반환값이 의미적으로 똑같다면 문제가 없지만....프로그래머가 같은 맥락이 아닌데도 '일관성'을 고려해 add라는 단어를 선택한다면? 예를들어, 이때까지의 add메소드는 두개를 더하거나 이어서 새로운 값으로 만들었었다고 했는데, 새로 작성하는 add메소드는 집합에 값 하나를 추가한다고 생각해봅시다. '일관성'을 지키려고 add라는 메소드를 붙히는 것은 바람직하지 못하다는 거죠. 이 집합에 값 하나를 추가하는 것은 기존 add메소드와 맥락이 다르기 때문입니다. insert나 append라는 이름이 적당하죠.


- 프로그래머는 코드를 최대한 이해하기 쉽게 짜야한다. 집중적은 탐구가 필요한 코드가 아니라, 대충 훑어봐도 이해할 코드 작성이 목표다.



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

- 코드를 읽을 사람도 프로그래머를 사실을 명심하라.

- 기술개념에는 기술이름이 가장 적합한 선택이다.



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

- 적절한 '프로그래머 용어'가 없다면, 문제 영역에서 이름을 가져온다.

- 우수한 프로그래머와 설계자라면 해법 영역과 문제 영역을 구분할 줄 알아야 한다. 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.



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

- 예를들어, firstName, lastName, street, houseNumber, city, state라는 변수가 있다고 했을 때 -> 어떤 메소드는 state만 사용한다면? -> 변수 이름을 쭉 훑어보면 주소와 관련된 변수이름이라고 알 수 있지만, state혼자만 보면 이게 주소와 관련된지 뭔지 모른다. -> 이럴때 addr라는 점두어를 추가해서 맥락을 분명하게 하라.



불필요한 맥락을 없애라.

- 오...위에서 "의미있는 맥락을 추가하라."고 했지ㅎㅎ 고급 휘발유 충전소(Gas Station Deluxe)라는 애플리케이션을 짠다고 했을 때 모든 클래스 이름에 GSD를 붙힌다는 생각은 바람직하지 못함.

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

==> 즉 그냥 불필요하게 구구절절 변수이름을 짓지마라.



마치면서..

- 우리들 대다수는 자신이 짠 클래스 이름과 메소드 이름을 모두 암기하지 못함. -> 암기는 요즘 나오는 도구에게 맡기고, 우리는 문장이나 문단처럼 읽히는 코드 / 적어도 표나 자료구조처럼 읽히는 코드를 짜는데만 집중해야함. 

- 여느 코드 개선과 마찬가지로, 이름 역시 나름대로 바꿨다가는 누군가 질책할지도 모름.

 => 그렇다고 코드를 개선하려는 노력을 중단해서는 안됨!!!!!



저도 나름대로.........이름에 신경을 쓴다고 쓴다고는 하는데...많이 반성을 하게 되네요 ㅎㅎ.....

제가 중요하다고 생각하는건 볼드체를 해놨는데 아무튼 꼭! 사서 읽어보시는 걸 추천드려요 :)




반응형