2015년 1월 12일 월요일

[Code Complete 좋은 코딩습관 기르기] Chapter 11. 변수이름의 효과 (변수이름짓기)



개발자들들의 가장 큰 고민중 하나는 변수이름 짓기다. 코딩작업은 팀프로젝트가 대부분이고 코드를 공유하게 되는데, 이때 변수이름을 잘못 짓게 되면 다른사람이 코드를 읽는데 큰 어려움을 느낀다.

이번엔 코드컴플릿에서 제공하는 변수이릅 짓는 법에 대해 적고자 한다.

11.1 좋은 이름에 대한 고려사항

  • Naming에서 가장  중요한 고려사항은 변수 이름이 변수가 표현하고 있는 것을 완벽하고 정확하게 설명해야 한다는 것이다. 좋은 이름을 짓기위해 효율적인 기법은 변수가 표현하는 것을 단어로 표현하는 것이다. 예를들어 미국 올립픽 대표팀에 있는 선수의 수를 표현하는 변수 이름은 numberOfPeopleOntherUsOlympicTeam일 것이다. 운동장의 좌석수를 표현하는 변수 이름은 numberOfSeatsIntheStadium일 것이다. 조금 길지만 변수가 표현하는 것을 정확히 표현하고 있다. (일반적으로 최적의 변수 길이는 10~16문자라고 한다-프로그램을 디버깅하기위해 들이는 노력을 최소화 할수 있다는...) 


  • 좋은 이름은 문제지향성이다. 좋은 이름은 "어떻게" 보다 "무슨 문제"인가를 표현하는 경향이 있다. 
  • 변수 이름으로 잘 쓰이는 것들 중 하나는 sum, total, average, Max, min, record, string, pointer 와 같은 계산값이다. 이러한 계산값을 변수의 앞에 두는 것이 좋다. 이럴 때 장점은 1) 변수에서 가장 중요한 부분이기에 눈에 쉽게 띄어 의미전달이 잘된다. 2) 이러한 규칙을 만듦으로써 totalRevenue와 revenueTotal 같은 혼란을 막을 수 있다. 3) 일관성 있다. 
  • 일반적으로 변수 이름 앞에 있는 num 은 합계, 변수 뒤에 있으면 인덱스를 가리킨다. 
  • 반의어는 정확하게 사용한다 (begin/end, first/last , locked/unlocked, min/max, next/previous, old/new... )

11.2 데이터의 특정 타입에 대한 명명

  • 루프 인덱스로는 i, j, k와 같은 이름이 관습적으로 사용된다. 하지만 루프가 길어진다면 i가 무엇을 나타내는지 쉽게 잊게 되기 때문에, 루프의 인덱스에 더 의미있는 이름을 제공하는 것이 좋다. 특히 중접된 루프가 있다면 가독성을 향상시키기 위해 변수의 의도를 잘 파악할수 있는 이름이 좋다.
  • 상태 변수로는 flag 보다 더 좋은 이름을 생각하는 것이 좋다.  단순히 flag가 아닌 무엇을 의도하는지 정확하게 나타내야 한다.

  • 임시변수의 명명은 일반적으로 x, temp로 쓰지만 임시변수가 일시적으로 유지되어야 할 때는 임시변수가 하는 일이 무엇인지 나타내는 변수이름이 좋다

  • 다음은 전형적인 boolean 변수 이름이다. 
1) done : 무언가 수행되었다는 것을 가리키기 위해 쓴다. 
2) error : 오류가 발생했음을 가리키기 위해,
3) found : 값이 발견되었다는 것을 가리키기 위해.
4) success or OK : 연산이 성공적인지를 가리키기 위해. 

boolean 변수 이름은 참 거짓의 의미를 함축할 수 있는 것이 좋다. 

앞에 is를 붙여 isdone, isError, isFound 와 같이 의문문으로 변경해 쓰기도 하지만 isStatus와 같이 문법에 어긋나거나 문맥이 이상하는 것은 오히려 가독성을 떨어뜨린다. 

긍정적인 boolean 변수 이름을 사용하는 것이 좋다. notFound = true보다  found=false가 더 낫다. 

  • 열거형일때는 Color_, Planet_,Month_ 와 같은 접두사를 사용해 해당 타입의 멤버들이 같은 그룹에 속하는 것을 분명히 하자.

  • 상수는 상수가 가리키는 숫자 보다는 상수가 표현하는 추상적인 대상으로 명명한다. 

이러한 규약으로 인해 익숙지 않은 변수들이 무엇을 의미하는지 쉽게 이해해 새로운 프로젝트에서 더 빠르게 코드를 배울수 있다. 또한 불필요한 이름이 늘어나는 것을 방지하며 관련된 항목들 간의 관계를 강조할 수 있다. 



11.4 비형식적인 명명 규약 

  • 일반적으로 변수 이름은 소문자로 시작하고(variableName) 메소드이름(루틴)이름은 (MethodName()) 은 대문자로 시작한다. 

  • 클래스와 객체를 구별한다. 
1) LongerWidget longerWidget;  첫글자 대/소문자  
2) WIDGET widget;                   대문자 / 소문자
3) t_Widget Widget;                  타입에 t_ 접두사
4)Widget awidget;                    변수에 a 접두사
5)Widget employeeWidget;        보다 구체적인 변수의 이름 사용해 타입과 구분 

  • 전역변수를 식별한다 - 접두사(g_)를 붙인다 
  • 멤버변수를 식별한다 - 이 변수가 지역변수나 전역변수가 아니라는 것을 분명히 한다. (접두사 m_)
  • 형 선언을 식별한다. 모두 대문자를 사용하거나, 접두사 또는 접미사 사용한다. 
  • 상수를 식별한다 상수가 다른 변수에 있는 값을 할당하는 것인지, 상수에 있는 값을 변수에 할당하느고 있는것인지를 구분해야한다. (c_)와같은 접두사를 붙일 수 있다.
  • 열거 형의 요소 식별한다. 위에 설명한것과 같다
  • 가독성을 강화시키기 위해 이름을 형식화한다. 가독성을 위해 _ 과 같은 구별자의 사용도 허용한다. 

특정 언어의 규약을 위한 지침. codeComplete은 Microsoft에서 출판되었기 때문에 MS사가 만든 언어 C와 비주얼베이직을 설명이 많은 편이다. 하지만 나는 자바를 공부하는 초보이기 때문에...... 우선 자바 규약만 정리한다. 


자바 규약
  •  i와 j는 정수 인덱스 
  • 상수는 밑줄로 구분되는 대문자로 표현 
  • 클래스와 인터페이스 이름은 첫 번째 단어를 포함해 각 단어의 첫번째 단어를 대문자로 작성 (낙타등표기법) ClassorInterfaceName
  • 변수와 메서드이름은 첫번째 단어를 소문자로 작성하고 다음단어는 대문자로 작성 variableOrRoutinName 
  • 밑줄은 대문자로만 이루어진 이름을 제외하고는 구별자로 안씀 
  • 접두사 get과 set은 접근자 메서드에만 사용, 


11.5 표준화된 접두사들 

의미적 접두사 
  • c: count 
  • first : first 
  • g : 전역변수
  • i : 배열인덱스
  • last : last
  • m : 클래스 수준의 변수 
  • max/min
  • p : pointer 

11.6 읽기 쉬운 짧은 이름 

     일반적인 축약 지침 
  • 표준 축약어 사용한다 
  • 불필요한 모음 제거 한다 (index = idx, integer = intgr)
  • 관사 제거
  • 각 단어의 첫문자 또는 처음의 몇 글자 
  • 이름에서 가장 중요한 단어 최대 세단어까지
  • 각 단어의 첫번째와 마짐가 단어 유지 
  • 각 음절에서 뚜렷한 소리 나는것
  • 쓸모없는 접미사 제거

11.7 피해야 할 이름의 종류 

  • 오해의 소지가 있는 이름이나 축약어 
  • 유사한 의미를 갖는 이름
  • 의미는 다르지만 유사한 이름의 변수 
  • 비슷하게 들리는 이름
  • 숫자는 되도록 넣지 않는다 
  • 오타는 없이
  • 영어에서 일반적으로 잘못 표기되는 단어는 피한다. 
  • 대문자만으로 변수의 이름을 차별화하지 않는다 
  • 여러개의 언어사용 피한다 
  • 표준형, 변수, 루틴의 이름을 피한다 
  • 변수가 표현하는 것과 전혀 관련이 없는 이름 피한다 
  • 읽기 어려운 문자 포함하는 이름. 


[출저 : code Complete - steve Mcconnel ]


 

댓글 없음:

댓글 쓰기