의미 있는 이름
1) 의도를 분명히 밝혀라
2) 그릇된 정보를 피하라
3) 의미 있게 구분하라
4) 발음하기 쉬운 이름을 사용하라
5) 검색하기 쉬운 이름을 사용하라
6) 인코딩을 피하라
7) 자신의 기억력을 자랑하지 마라
8) 기발한 이름은 피하라
9) 한 개념에 한 단어를 사용하라
10) 말장난을 하지 마라
11) 해법 영역에서 가져온 이름을 사용하라
12) 문제 영역에서 가져온 이름을 사용하라
13) 의미 있는 맥락을 추가하라
14) 불필요한 맥락을 없애라
Google Java Naming Gudie - 5. Naming 번역
https://google.github.io/styleguide/javaguide.html#s5-naming
5.1 모든 식별자에 적용되는 규칙 📚 ( Rules common to all identifiers )
- 식별자는 ASCII 문자 , 숫자만 사용해야 함
- 단, 일부의 경우 언더 스코어(_)를 사용하기도 함.
- 그러므로 유효한 식별자 이름은 정규식 \w+ 와 매칭됨
- Google Style 에서는 특별한 prefix(접두사), suffixe(접미어) 사용 x
- 좋지 않은 예시 : name_ , mNames, s_name, kName //💩
5.2 식별자 타입별 규칙 ( Rules by identifier type )
5.2.1 패키지명 ( Package names )
- 소문자와 숫자 사용 ( '_' 언더 스코어 없음 )
- 연속된 단어는 연결함
예시
com.example.deepspace //👍
com.example.deepSpace //💩
com.example.deep_space //💩
5.2.2 클래스명 ( Class names )
- UpperCamelCase 로 작성
- 클래스명은 일반적으로 명사 또는 명사구로 나타냄 ( ex. Character , ImmutableList )
- 그러나 때로는 형용사 또는 형용사구를 사용할 수 도 있음 ( ex. Readable )
- Test class는 클래스명 뒤에 Test를 붙임
예시
public class HashTest {..}
public class HashIntegerationTest {..}
5.2.3 메소드명 ( Method names )
- lowerCamelCase 로 작성
- 메소드명은 일반적으로 동사 또는 동사구로 나타냄
- JUnit test 에서는 논리적인 구성요소로 분리시키기 위해 언더 스코어(_)이 나올 수 있다.
- 이때 각 컴포넌트 이름은 lowerCamelCase 로 쓰여야 함 (예시. void transferMoney_deductsFromSource(){..} )
- JUnit test 에서 메소드명을 짓는 정확한 답은 정해져 있지 않다.
예시
void sendMessage ();
void stop();
Object findById();
5.2.4 상수명 ( Constant names )
- UPPER_SNAKE_CASE 로 작성
- 각 단어는 대문자로 나타내고 언더 스코어로 구분/연결하는 형식
- 상수는 static final 필드이면서, 불변이고 메서드에는 side effect가 없어야 한다.
- 상수명은 일반적으로 명사 또는 명사구 사용
예시
primitives(원시), strings, immutable(불변) 타입의 불변 collection을 포함한다. 만약 어떤 인스턴스의 상태가 바뀔 수 있다면 이는 상수가 아니다.
// 상수 ( Constants )
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);
static final Joiner COMMA_JOINER = Joiner.on(','); // Joiner가 불변(immutable)이기 때문
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }
// 상수 아님 ( Not Constants )
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final ImmutableMap<String, SomeMutableType> mutableValues = ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
5.2.5 상수가 아닌 필드명 ( Non-constant field names )
- lowerCamelCase 로 작성
- 명사 또는 명사구로 작성 ( 예) computedValues , index , id , zipcode .. )
5.2.6 매개변수명 ( Parameter names )
- lowerCamelCase 로 작성
- 공용 메서드(public method)에서 한 문자 매개변수 이름(a,b,c, a1 ..)은 피해야 함
5.2.7 지역 변수명 ( Local variable names )
- lowerCamelCase 로 작성
- final 또는 immutable 한 경우에도 지역 변수는 상수로 간주되지 않으며, 상수 스타일로 지정되어서도 안됨
5.2.8 타입 변수명 ( Type variable names )
각 타입 변수는 두가지 스타일 중 하나로 지어짐
- 하나의 대문자, 혹은 뒤에 하나의 숫자가 따라올 수 있음 (ex. E, T, X, T2)
- 클래스를 위해 사용되는 (5.2.2절 클래스 이름 참조) 이름 형식에 T 대문자가 따라오는 형식 (ex. RequestT, FooBarT)
5.3 Camel case 정의 ( Camel case: defined , 낙타표기법 )
가끔 영어 구를 Camel case로 바꾸는 이유가 하나 이상 있다. 예로 두문자어나 "IPv6"또는 "iOS"와 같은 특이한 구조가 존재한다.
예측 가능성을 향상시키기 위해, Google Style 은 다음과 같은 결정적 체계를 지정한다.
산문 형태의 이름으로 시작 :
1. 구를 일반적인 ASCII로 변환하고 어포스트로피를 없앤다. 예를들어 Müller's algorithm은 Muellers algorithm로 변환
2. 결과를 단어로 나누고 남은 공백과 구두점으로 나눈다. (일반적으로 하이픈)
참고.
어떤 단어가 이미 전통적인 Camel case 이 쓰인다면 이것을 구성하는 부분들로 나눈다. (예를들어 "AdWords"를 "ad words"로). "IOS"는 Camel case가 아니다. 이 부분은 어떠한 약속에도 위배되므로 적용되지 않는다.
3. 이제 모두 lowercase로 바꾸고 (심지어 두음문자도) 그리고 첫 번째 글자를 대문자로 바꾼다.
예시
산문 형태 | 정확 | 부정확 |
---|---|---|
"XML HTTP request" | XmlHttpRequest | XMLHTTPRequest |
"new customer ID" | newCustomerId | newCustomerID |
"inner stopwatch" | innerStopwatch | innerStopWatch |
"supports IPv6 on iOS?" | supportsIpv6OnIos | supportsIPv6OnIOS |
"YouTube importer" | YouTubeImporter , YoutubeImporter* |
*허용하지만, 추천하진 않음
참고.
영어에서는 모호하게 하이픈이 있는 단어가 몇개 있다. 예로, nonempty 나 non-empty는 둘 다 맞다. 그래서 메소드 이름이 checkNonempty나 checkNonEmpty 둘다 맞다.
느낀점
읽기 좋은 네이밍은 가독성과 이해도를 높이고, 유지보수 용이하게 하는 효과를 지닌다. 🤔👍
참고로 작업 시 lowerCamelCase와 snake_case를 구분해서 사용했었다. 소스 코드의 경우 lowerCamelCase를 사용하고 DB Table/Column의 경우 snake_case 사용하여 명확히 구분할 수 있도록 하였다.
'독서 > 📚' 카테고리의 다른 글
[도서 리뷰] 비전공자를 위한 이해할 수 있는 IT 지식 (0) | 2022.05.06 |
---|---|
[클린코드] 5장. 형식 맞추기 (0) | 2022.02.22 |
[클린코드] 4장. 주석 (0) | 2022.02.22 |
[클린코드] 3장. 함수 (0) | 2022.02.22 |
[클린코드] 1장. 깨끗한 코드 (0) | 2022.02.22 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!