의미가 분명한 이름 짓기
2장에서 다룰 내용은 이름짓기이다.
클래스명, 메서드명, 변수명을 봤을때 의미가 분명해야한다.
모호하면 안된다.
첫번째 예시로 든 코드이다.
public List<int[]> getThem(){
List<int[]> list1 = new ArrayList<>();
for(int[] x : theList){
if(x[0] == 4){
list1.add(x);
}
}
return list1;
}
위의 코드를 보고 뭐하는 코드인지 알 수 있는가?
모른다.
위의 코드에 부가정보를 제공해보겠다.
- 위의 코드는 지뢰찾기에서 칸 상태를 뜻한다.
- theList는 보드판이다.
- x[0] == 4이면, 깃발이 꽂힌 상태이다.
- 깃발이 꽂힌 상태인 칸들을 list1에 담아 반환해야한다.
위의 정보들 없이 코드만 봐서는 아무것도 알수가 없다.
이럴 때 코드에 유의미한 이름을 짓자.
그리고 배열에 값을 저장하지 말고 클래스를 하나 만들어보자
public List<Cell> getFlaggedCells(){
List<Cell> flaggedCells = new ArrayList<Cell>();
for(Cell cell : gameBoard){
if(cell.isFlagged()){
flaggedCells.add(cell);
}
}
return flaggedCells;
}
Cell 클래스를 만들고, 깃발이 꽂힌 상태를 확인할 수 있는 메서드(isFlagged())를 하나 만들었다.
이제 이 게임이 지뢰찾기란 것만 알아도 대충 뭐하는 메서드인지 알 수 있게 되었다.
이처럼 클래스(Cell), 메서드(isFlagged), 필드(flaggedCells, gameBoard)에
유의미한 이름을 지으면 코드의 의미가 분명해진다.
클래스, 객체 이름은 명사나 명사구가 적합하다.
Customer, WikiPage, Account, AddressParser 등이 좋은 예다.
Manager, Processor, Data, Info 와 같은 단어는 피하고, 동사는 사용하지 않는다.
메서드 이름은 동사나 동사구가 적합하다.
postPayment, deletePage, save 등이 좋은 예다.
접근자, 변경자, 조건자는 javabean 표준에 따라 각각
get, set, is 를 붙인다.
맥락에 맞는 이름을 사용해라.
스스로의 의미가 분명한 이름도 있다. 그러나 대다수의 이름은 그렇지 못하다.
그래서 클래스, 메서드, 이름 공간에 넣어 맥락을 부여한다.
마지막 수단으로는 접두어를 붙인다.
만약 유저의 주소정보를 저장해야한다고 생각해보자.
(미국은 주소에 firstName, lastName이 있는 것 같다.)
- firstName
- lastName
- street
- state
라는 변수가 필요하다고 해보자.
이보다는
- addrFirstName
- addrLastName
- addrStreet
- addrState
이렇게 쓰면 조금 더 알아보기 쉽다.
추가로, Address란 클래스를 만드는 것이 더 낫다고 한다.
이름은 길어져도 된다.
어차피 IDE에서 첫 몇글자만 입력하면 자동완성이 되기 때문에,
명확하고 의미있는 이름을 짓기위해 이름의 길이가 길어지는 것을 감수해도 된다.
(물론 짧을수록 좋다.)
for문에 i, j, k를 사용하지 마라.
왠만하면 for문을 enhanced for문으로 바꿔라.
물론 배열을 순회할 때 index를 이용하기 위해서는 i, j, k 를 사용해야 하지만,
이외의 경우에는 사용하지 마라.
Java 8 이후에 제공되는 람다식을 사용하는것도 좋은 방법이다.
//기본 for문
for(int i=0;i<messages.size();i++){
// ...
}
//enhanced for문(향상된 for문)
for (String message : messages) {
// ...
}
//람다식 사용
messages.stream().forEach( message -> // ...)
i, j, k에도 의미있는 이름을 부여할 수 있다.
i, j => row, col / width, height
i, j, k => row, col, depth
통일성 있는 이름을 사용하라.
Member / Customer / User
세가지 다 고객이 될 수 있다.
어디에서는 고객을 Member라는 이름으로 사용하고, 어디서는 고객을 Customer이라는 이름으로 사용하면 안된다.
Service / Manager
Repository / Dao
위의 두개도 비슷한 예다.
변수명에 타입을 넣지 마라.
이름은 당연히 문자열일 것이고, 가격은 당연히 숫자일것이다.
Account[] 배열의 변수명에 Array를 넣을 필요도 없다.
String nameString; => name
int itemPriceAmount; => itemPrice
Account[] accountArray; => accounts
Map이나 List같은 자료구조에는 타입을 명시해도 좋다.
Map<Account> accountMap;
List<Account> accountList;
Google Java Naming Guide
Package Naming Guide
All lower case, no underscores
com.example.helloworld => O
com.example.helloWorld => X
com.example.hello_world => X
Class Naming Guide
Uppercase로 시작
//클래스, 인터페이스는 명사나 명사구로 나타낸다.
User, Customer, Account
//테스트 클래스는 "Test"로 끝내기
UserTest, CustomerTest, AccountTest
Method Naming Guide
LowerCamelCase
//메서드는 동사, 동사구
sendMessage, save
//JUnit 테스트에서는 snake_case로 사용되기도 한다.
//<methodUnderTest>_<state> 패턴
save_fail
save_success
- camelCase : createAccount와 같이 소문자로 시작하여, 단어가 바뀔때마다 대문자를 넣어준다.
- snake_case : create_account와 같이 모두 소문자이고, 단어가 바뀔때마다 underscore(' _ ')를 넣는다.
Java에서는 camelCase를 주로 사용하고, DB에서는 snake_case를 주로 사용한다.
'기타 > Book Review' 카테고리의 다른 글
[CleanCode] 클린코드 리뷰_6장 : 객체와 자료구조 (0) | 2023.06.21 |
---|---|
[Clean Code] 클린코드 리뷰_ 5장 : 형식 맞추기 (1) | 2023.06.17 |
[CleanCode] 클린코드 리뷰_ 4장 : 주석 (0) | 2023.06.16 |
[Clean Code] 클린코드 리뷰_ 3장 : 함수 (0) | 2023.06.15 |
[Clean Code] 클린코드 리뷰_ 1장 : 깨끗한 코드 (0) | 2023.06.13 |