Skip to content

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;
}

위 코드에 대한 의문

  1. theList에 무엇이 들어있는가
  2. theList에서 0번째 값이 어째서 중요한가?
  3. 값 4는 무슨 의미인가?
  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;
	}
}
💡 헝가리식 표기법 이름 길이가 제한된 언어를 사용하던 옛날에는 어쩔수없이 규칙을 위반했다. 윈도우 c API는 모든 변수가 정수 핸들, long 포인터, void 포인터, (속성과 용도가 다른) 여러 '문자열' 중 하나였다. 요즘에는 컴파일러가 타입을 기억하고 강제하고, 클래스와 함수는 점차 작아진다
  • 자바는 변수이름에 타입을 인코딩할 필요가 없다.
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를 섞어 쓰면 혼란스럽다
  • 일관성있게 단어를 사용하자

말장난을 하지마라

  • 한 단어를 두 가지 목적으로 사용하지마라

해법 영역에서 가져온 이름을 사용하라

  • 전산용어, 알고리즘 이름, 패턴 이름, 수학용어 등을 사용하자
  • 기술 개념에는 기술 이름이 적합한 선택이다.

문제 영역에서 가져온 이름을 사용하라

  • 프로그래밍 용어가 없으면 문제 영역(도메인 관련 전문 이름)을 가져오자
  • 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야한다

?: 보통 문제내용에 대한 것들은 주석처리하지않나? 다음장에서 더 공부해봐야할거같음.

의미있는 맥락을 추가하라

  • 클래스, 함수, 이름 공간에 맥락을 부여한다. 모든 방법이 실패하면 접두어 붙이자

불필요한 맥락을 없애라

  • 이름에 불필요한 맥락을 추가하지 않도록 주의해야한다.