클린코드(1)-의미있는이름

김재원·2022년 1월 19일
0

클린코드

목록 보기
1/2
post-thumbnail

소프트웨어에서 이름은 모든곳에 쓰인다. 함수, 변수, 클래스, 패키지등등에도 이름을 붙인다. 이렇듯 많이 사용하므로 이름을 잘 지으면 여러모로 편하다

위의 말은 로버트 C 마틴의 클린코드 책에 나온 말 입니다. 이름을 잘 정하면 정할땐 힘들지만 개발할때는 더 편하다는 말인데요, 그럼 어떻게 하면 의미있는 이름을 정할 수 있는지 알아 보도록 하겠습니다. 앞서, 아래 내용은 로버트 C 마틴의 클린코드 책을 참고했습니다😌.

의도를 분명히 밝혀라

의도가 분명히 밝혀진 이름을 가진 변수, 함수, 클래스등은 이름만 읽고도 다음과 같은 질문에 답할 수 있습니다.

  • 왜 이게 존재하지?
  • 어떤걸 수행하는데?
  • 어떻게 쓸 수 있는데?
fun jae() { 
   return "김재원"
}

위의 함수는 작성자의 이름을 반환하는 함수입니다. 하지만 함수 이름만 보고는 무슨함수인지 알수가 없습니다. 이를 보완하면 아래와 같을 수 있습니다.

fun fetchWriterName(): String {
   val writerName = "김재원"
   return writerName
}

이로써 함수이름만 보고도 무슨함수인지 알 수 있게되었습니다. 그리고 writerName이라는 변수를 만들어서 안에 "김재원" 이라는 값을 넣음으로써 "김재원"이 작성자 이름이라는것을 알 수 있습니다.

그릇된 정보를 피하라

그릇된 정보는 예를들어 실제 List가 아닌 값에 list라고 이름을 붙이는것입니다. 이름은 list이지만 실제자료형이 List가 아니라면 사용자에게 혼동을 줄 수 있습니다. 따라서 accountList라는 변수가 실제 List가 아니라면 accountGroup 혹은 bunchOfAccounts, 아니면 단순히 accounts라고 명명해야합니다.

의미 있게 구분하라

이름에 붙이나 마나 똑같은 단어들이 있을 수 있습니다. 예를들어 Product라는 클래스가 있는데, ProductInfo라는 클래스를 만든다면 두 클래스가 어떻게 다른 클래스인지 알 수 없습니다. 그렇기 때문에 Info는 큰 의미가 없는 불용어 인것입니다. 이름으로 구분할때는 읽는 사람이 차이를 알도록 이름을 지어야합니다.

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

코드를 보고 팀원과 소통할때 발음하기 어려운 이름이 있다면 소통이 어려워질 수 있습니다. 그렇기 때문에 더욱 지적인 소통을하기 위해서는 발음하기 쉬운 이름을 사용해야합니다.

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

IntelliJ 환경에서 개발하는 저의 입장에서는 Shipt+Shipt를 통해 변수나 함수를 검색하는것이 얼마나 편리한것인지 알면서도, 비슷한이름 때문에 찾기 힘든지도 알고있습니다. startLogin()이라는 이름은 구체적이어서 검색하기 쉽지만, e와 같이 거의 모든 이름에 들어가는 단어는 찾기가 정말 어렵습니다. 그래서 검색하기 쉬운 이름을 사용하는것이 좋습니다.

인코딩을 피하라

이름에 자료형을 표현하거나 멤버 변수임을 표현할 필요는 없습니다. 옛날에는 컴파일러가 타입을 점검하지 않았으므로 타입을 기억해야했지만 요즘에는 컴파일러가 다 해주기 때문에 타입을 인코딩할 필요가 없습니다. 오히려 타입을 변경하기에 어려움을 초례할 수 있습니다. 멤버 변수의 경우에도 IDE에서 색깔을 다르게하여 표현해주기 때문에 이름에 m_이라는 접두어를 붙일 필요가 없습니다. 다만, 인터페이스 클래스와 구현 클래스의 경우에는 인코딩이 필요합니다. 이럴때는 Imp을 접미어로 붙이는등으로 표현을 해야합니다.(하지만 접두사로 I만 붙이는건 오히려 주의를 흐트립니다)

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

자신만 기억할 수 있는 코드는 절대 좋은 코드가 될 수 없습니다. 좋은 코드란 남들이 쉽게이해할 수 있는 코드입니다. 따라서 자신이 r이라는 변수가 루틴이라는 뜻을 가진다는걸 기억할 자신이 있더라도 다른 읽는사람을 위해 변수이름을 직관적으로 정해야합니다.

클래스 이름

클래스 이름은 명사나 명사구가 적합합니다.(동사 사용x)

메서드 이름

메서드 이름은 동사나 동사구가 적합합니다.(접근자, 변경자, 조건자는javabean 표준에 따라 get,set,is를 앞에 붙입니다.)

기발한 이름은 피하라

이름이 너무 기발하면 비슷한 감각을 가진 사람들만 이해합니다. 이름을 정할때는 의도가 분형하고 솔직하게 표현되어야합니다.

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

예를들어 값을 가져오는 함수들이 있다고 가정해봅시다. 어떤함수는 fetch, 어떤함수는 retrieve, 어떤함수는 get... 이런식으로 제각각부르면 혼란스럽습니다. 일관성 있는 어휘는 코드를 사용할 프로그래머의 편리함을 제공해줄 수 있습니다.
여담으로, 안드로이드를 개발하는 저의 입장에서는 get은 기피하려고 합니다. 왜냐하면 databinding을 사용할때 자동으로 생성되는 viewModel 변수의 접근 함수의 이름이 get~ 인데, 이때 viewModel안에 제가 만든 함수의 이름도 get~이라면 충돌이 나서 get보다는 fetch를 사용하려고 하고 있습니다.

viewModel에서 저렇게 이름을 정한후, schoolRank를 databinding하면 빌드 오류가 발생합니다.

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

코드를 읽을 사람도 프로그래머 입니다. 따라서 전산용어, 알고리즘 이름등은 사용해도 괜찮습니다. 모든 이름을 문제 영역(domain)에서 가져오는건 바람직하지 않습니다.

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

적절한 프로그래밍 용어가 없다면 문제 영역에서 가져옵니다. 그러면 팀원중 문제 영역 전문가에게 의미를 물어 파악할 수 있기 때문입니다.

의미 있는 맥락을 추가하라

이름만 보고도 이 변수가 어떤 변수인지 알아야합니다. firstName, street, houseNumber을 열거했을때, 이 변수들이 주소와 관련됐다는걸 알 수 있습니다. 하지만 이름 하나만 보고는 무엇인지 알기 힘들죠.. 접두어로 addr을 붙이거나 Address라는 클래스를 생성(권장)하여 의미 있는 맥락을 추가해주어야합니다.

불필요한 맥락을 없애라

예를들어 부모님을 위한 애플리케이션을 만들때, 모든 클래스 이름을 Parents로 시작한다면, IDE의 장점을 전혀 살리지 못하게 됩니다. 중복되는 부분을 최소화 해야합니다.

이렇게 해서 클린코드책을 읽으며 내용을 요약해보았는데요, 개발자로써 한번쯤을 읽어보면 좋은 책인것 같습니다. 깨끗한 코드는 좋은 개발을 이끌 수 있습니다. 그럼 즐거운 개발되세요🤗.

참고
로버트 C 마틴, ⌜클린코드⌟, 박재호 이해영옮김, 22 ~ 38쪽

profile
항상 배울 것을 찾는 개발자입니다🔥.

0개의 댓글