다음 글들의 내용을 취합해서 정리한 내용입니다.
- https://a-nickels-worth.blogspot.kr/2016/04/a-guide-to-naming-variables.html
- http://journal.stuffwithstuff.com/2009/06/05/naming-things-in-code/
- http://nikas.praninskas.com/javascript/2016/11/28/naming-things-handlers/
- http://codelegance.com/semantic-method-naming/
- http://codebuild.blogspot.kr/2012/02/15-best-practices-of-variable-method.html
# 클래스, 인터페이스
- 명사여야 한다.
: Happy -> Happiness
- 명확한 형용사를 사용하라.
- Manager, Helper 같은 무의미한 단어를 사용하지 말라.
: 만약 사용해야할 필요가 있다면, 이름이 안좋거나 설계가 안좋은 것인데 후자일 가능성이 높다. 클래스나 인터페이스는 자기 자신을 manage하거나 help해야만 한다.
: ConnectionManager -> Connection
: XmlHelper -> XmlDocument, XmlNode, etc.
- 만약 클래스명이 뭔가를 이해하기 쉽게 표현하지 못한다면 구체적인 은유(메타포)를 사용해라.
: IncomingMessageQueue -> Mailbox
: CharacterArray -> String
: SpatialOrganizer -> Map
# 메소드
- 동사를 사용해서 지어라.
- 간결하게 지어라.
: list.GetNumberOfItems() -> list.count()
- 그렇다고 너무 간결하지 짓지는 말아라.
: list.Verify() -> list.ContainsNull()
- 축약어를 쓰지 말아라.
: list.Srt() -> list.Sort()
- 서로 다른 타입을 리턴하는 메소드가 있을 때에만 리턴 타입을 메소드명에 포함시킨다.
: list.GetCountInt() -> list.GetCount()
: message.GetIntValue(), message.GetFloatValue()
- And, Or를 쓰지 말아라.
: 만약 접속사를 쓰게 된다면 메소드가 너무 많은 기능을 하는 것일 수 있으니 기능을 쪼개고 이름도 그에 맞게 지어라.
: mail.VerifyAddressAndSendStatus() -> mail.VerifyAddress(), mail.SendStatus()
: 만약 원자적인 동작을 보장하고 싶은 경우라면, 전체 동작에 대한 이름을 짓거나 전체를 캡슐화하는 클래스를 만드는 것을 고려해봐라.
- 만약 이름 짓는데 애를 먹고 있다면 설계가 잘못된 가능성이 있을 수 있다. 너무 많은 일을 한번에 하거나 뭔가 중요한 것을 놓쳤을지도 모른다. 보통 설계가 잘안되면 이름도 잘 안지어지고 이름이 잘지어지면 설계도 마음에 드는 경우가 많다.
- process, compute는 좋지 않은 선택이다. 대부분의 코드가 뭔가 process하거나 compute한다.
- 메소드에 의미있는 이름을 지어라. 메소드의 정확한 액션을 기술해야하고 대부분 동사로 시작해야 한다.
- 메소드 주석을 다는 습관을 들이면 메소드가 무엇을 하는지 기술하게됨으로써 메소드 이름을 정확하게 짓는데 도움이 된다.
메소드 주석이 좋으면 메소드명은 주석에서 몇 단어를 선택하는 것만으로 잘 지을 수 있다. 만약 주석과 메소드명이 서로 다르다면 둘 중 하나는 잘못된 것이다.
- O(1) 복잡도를 가지는 메소드만 get접두어를 사용해라. 그 외에는 더 구체적인 동사를 사용해라.
e.g 데이터베이스에서 데이터를 가져오는 메소드 : getData() -> fetchData()
- do를 사용하지 말아라. 모든 메소드가 뭔가 한다. do는 어떤 추가 정보도 제공하지 못한다.
call, execute, run, prepare도 비슷한 유형이니 사용하는게 항상 안좋은건 아니지만 다른 단어가 없는지 한번쯤 더 생각해보자.
- boolean을 리턴하는 메소드는 is, are, was, were, can, could, may, might, must, shall, should, will, would 같은 단어로 시작하게 하자.
- 만약 메소드가 속한 객체를 통해 행위의 목적어를 알 수 있다면 메소드명에서 동사만 사용해도 충분하다.
e.g message.saveMessage() -> message.save()
- 메소드명에 파라미터를 기술하지 말아라. 메소드 시그니쳐는 메소드명과 파라미터를 포함하는 개념이다. 파라미터를 메소드명에 기술하는 것은 중복이다.
e.g findUserByUserIdAndToken(userId, token) -> findUser(userId, token)
- 메소드 이름을 handleClick과 같이 짓지 말아라.
: 메소드가 어떻게 사용되는지 적은 메소드명이 가장 게으른 메소드명이다. 메소드명은 무엇을 하는지 나타내야 한다.
: 메소드 재사용이 불가능하다.
- 하지만 외부 인터페이스 후크 메소드에서만큼은 어떻게 호출되는지를 표현하는게 권장된다. 그게 더 명료한 최선의 선택이다.
: onClick() 같은 메소드
- initAndDisplaySettingMenu()와 같은 행위 나열보다는 한단계 더 추상적인 레벨에서 표현하는게 좋다.
: 행위가 늘어날 때마다 AndXXX를 붙일 것인가?
# 변수명
- 변수의 scope에 따라 충분히 짧거나 긴 변수명을 사용해라.
: 루프 카운터 변수 : 1자
: 조건문, 반복문 변수 : 1단어
: 메소드 : 1~2단어
: 클래스명 : 2~3단어
: 글로벌 변수 : 3~4단어
- 한 메소드나 조건문에서 같은 변수를 다른 목적으로 재사용하지 말고 다른 이름을 가지는 새로운 변수를 만들어라.
- 50자 이상되는 긴이름을 짓지 말아라. 읽기 힘들다.
- 변수 타입을 변수명에 넣지 말아라.
: IDE로 변수 타입을 확인하는게 어려운 일이 아니다. 이름에 타입을 넣는 것은 불필요하다.
* hostInputStream -> rawHostData
* hostString -> hostText, hostJson, hostKey
* intPort -> portNumber
: 컬렉션 타입 변수는 복수형을 사용하고 타입 대신 그 변수가 무엇인지를 표현해라.
* hostList -> hosts
- 되도록 구체적인 표현을 사용해라
: unhealthyHostFinder -> overloadedCPUFinder
- 간단한 주석은 변수명에 포함시켜라
: name // First and last name -> fullName
- 진부한 단어를 피하라
: val, value, result, retval, tmp, str ...
- 진부하더라도 널리 사용되는 관용적인 표현은 괜찮다.
: 반복문의 i, j
: limit, quantity를 위한 n
: catch 구문의 e
- 다음과 같은 경우에는 한두자 정도의 변수명을 써도 괜찮다.
: 선언과 사용이 5라인 이내인 경우
: 타입 이외에 더 나은 이름이 없는 경우
: 코드 읽는 사람이 코드 그 부분에서 너무 많은 것들을 기억하고 있지 않은 경우
- 무분별한 일회성 변수를 사용하지 말라
: 일회성 변수가 유용할 때도 있지만 그렇지 않다면 안쓰는게 낫다.
- 일회성 변수가 유용할 때는 다음과 같다.
: 한 라인이 너무 길어질 때
: 복잡한 표현식을 쪼갤 때
: 이해하기 힘든 코드에 대한 설명으로 변수명을 사용할 때
'개발 > 리팩토링' 카테고리의 다른 글
클린 코드 독서 노트 (0) | 2017.08.30 |
---|---|
클린 코드 - 2장 의미 있는 이름 요약 (0) | 2017.05.18 |
읽기 좋은 코드가 좋은 코드다 - 노트 (0) | 2017.03.18 |
자바 코드 리팩토링 시 주의해야할 점 몇 가지 (0) | 2016.11.03 |