-
Notifications
You must be signed in to change notification settings - Fork 0
2장 의미있는 이름
김윤수 edited this page Jul 24, 2022
·
1 revision
목표 - 이름을 잘 짓는 간단한 규칙을 소개한다
- 존재이유, 수행기능, 사용방법이 드러나게 지어야한다
ex1) theList
public List<int[]> getThem(){
List<int []> list1 = new ArrayList<int[]>();
for(int[] x: theList)
if(x[0] == 4)
list1.add(x);
return list1;
}
위 코드에 대한 의문
- theList에 무엇이 들어있는가
- theList에서 0번째 값이 어째서 중요한가?
- 값 4는 무슨 의미인가?
- 함수가 반환하는 리스트 list1을 어떻게 사용하는가?
ex2) theList 위 개념을 개선한 코드
public List<int[]> getFlaggedCells(){
List<int[]> flaggedCells new ArrayList<int[]>();
for(int[] cell: gameBoard)
if(cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
ex3) theList에 명시적인 함수 추가(isFlagged)
public List<Cell> getFlaggedCells(){
List<Cell> flaggedCells = new ArrayList<Cell>();
for(Cell cell: gameBoard)
if(cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
-
그릇된 단서를 남기지마라
- 널리 쓰이는 단어를 다른의미로 사용하지마라
ex) hp, aix, sco 유닉스 플랫폼이나 변종을 가르키는 이름
- 서로 흡사한 이름을 사용하지않도록 주의
ex) XYZControllerForEfficientHandlingOfStrings 와 XYZControllerForEfficientStorageOfStrings 두 개를 사용할 경우, 소문자L, O 변수
- 컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 noise word를 추가하는 방식은 적절하지 못하다.
ex)
public static void copyChars(char a1[], char a2[]){
for(int i =0; i < a1.length; i++){
a2[i] = a1[i];
}
}
- 위 코드의 parameter 이름을 source, destinationm으로 사용한다면 코드 읽기가 훨씬 쉬울것이다.
- noise word : a, the, they, 변수-variable , table, object
- 읽는 사람이 차이를 알도록 이름짓기
ex) 발음하기 힘든 예시
class DtaRcrd102{
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
};
ex) 발음하기 쉬운 예시
class Custormer{
private Date generationTimestamp;
private Date modificationTimestamp;
private final String recordId = "102";
}
- 변수 이름에 타입을 넣지마라
- 접두어는 사용하지 않는 것이 좋다. 멤버 변수를 다른 색상으로 표시하거나 눈에 띄게 해주는 IDE를 사용하자
public class Part{
private String m_dsc;
void setName(String name){
m_dsc = name;
}
}
public class Part{
private String description;
void setDescription (String description){
this.description = description;
}
}
- 자바는 변수이름에 타입을 인코딩할 필요가 없다.
PhoneNumber phoneString;
- 멤버 변수 접두어를 붙일 필요 없다.
- 인터페이스 클래스와 구현 클래스
- 자신이 아는 이름으로 변환하는 것이 아니라 명료한 단어를 선택하자
- 클래스 이름과 객체 이름은 명사나 명사구가 적합함
- Customer, WikiPage, Account, AddressParser 등은 좋은 예다.
- Manager, Processor, Date, Info와 같은 단어는 피하자
- 동사는 사용하지 않는다.
- 메서드 이름은 동사나 동사구가 좋다
- postPayment, deletePage, save 등은 좋은 예
- 접근자, 변경자, 조건자는 javabean 표준에 따라 get, set, is를 붙인다
- 생성자를 중복정의할 때는 정적 팩토리 메서드를 사용한다.
- 좋은 예시) Complex fulcrumPoint = Complex.FromRealNumber(23.0);
- 나쁜 예시) Complex fulcrumPoint = new Complex(23.0);
- 생성자 사용을 제한하려면 해당 생성자를 private로 선언한다(싱글톤 패턴이랑 비슷하네?)
- 특정 문화에서만 사용하는 농담은 피하고 의도를 분명하고 솔직하게 말하자
- 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
- ex) 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
- 마찬가지로 동일 코드에 controller, manager, driver를 섞어 쓰면 혼란스럽다
- 일관성있게 단어를 사용하자
- 한 단어를 두 가지 목적으로 사용하지마라
- 전산용어, 알고리즘 이름, 패턴 이름, 수학용어 등을 사용하자
- 기술 개념에는 기술 이름이 적합한 선택이다.
- 프로그래밍 용어가 없으면 문제 영역(도메인 관련 전문 이름)을 가져오자
- 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야한다
?: 보통 문제내용에 대한 것들은 주석처리하지않나? 다음장에서 더 공부해봐야할거같음.
- 클래스, 함수, 이름 공간에 맥락을 부여한다. 모든 방법이 실패하면 접두어 붙이자
- 이름에 불필요한 맥락을 추가하지 않도록 주의해야한다.
⏳ 2회차(7.17) - 2, 3장
⏳ 3회차(7.31) - 4, 5장
⏳ 4회차(8.14) - 6, 7장
⏳ 5회차(8.28) - 8, 9장
⏳ 6회차(9.11) - 10, 11장
⏳ 7회차(9.25) - 12, 13장
⏳ 8회차(9.25) - 14, 15장
⏳ 9회차(9.25) - 16, 17장