CleanCode

[CleanCode] 의미있는 이름

zamezzz 2023. 10. 1. 15:03

CleanCode - 의미있는 이름

책에서 가장 중요하게 말하고 있는 내용을 한 문장으로 요약하면 다음과 같습니다.

의도를 분명히 밝혀라

의도가 분명하게 이름을 지으라 말하기는 쉽다.

하지만 가장 어려운 것은 이름을 짓는 것이고, 의도가 분명하게 이름을 짓는것은 정말 중요하다.

 

프로그래머에게 가장 어려운 일이 이름 짓기라는 조사도 있습니다.

 

아래와 같이 간단한 예제를 보겠습니다.

int d; // 날짜, day

 

이 변수 d는 아무 의미도 없습니다.

경과 시간이나 날짜라는 의미를 위해서는 아래와 같이 측정하려는 값과 단위를 표현하는 이름이 필요합니다.

int fileAgeInDays;
int daysSinceCreation;


의도가 있는 이름을 사용 해야하는 이유에 대한 코드 예시를 추가로 보겠습니다.
아래 예시는 지뢰 찾기 게임의 코드의 한 부분입니다.

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는 무슨 의미인가?

아래와 같이 바꿔보겠습니다.

public List<Cell> getFlaggedCells() {
	List<Cell> flaggedCells = new ArrayList<Cell>();
	for (Cell cell : gameBoard) {
		if (cell.isFlagged()) {
			flaggedCells.add(cell);
		}
	}
	return flaggedCells;
}

 

위의 코드와 차이가 보이시나요? 위에서 알 수 없는 정보가 아래와 같이 쉽게 알 수 있게되었습니다.

  • theList는 gameBoard였다.
  • theList의 0번째에는 각 칸의 상태값을 뜻한다.
  • 값 4는 깃발이 꽂힌 상태였다.

 

이 처럼 이름을 잘 짓는것은 코드의 가독성 뿐 아니라 유지보수 측면에서도 매우 중요합니다.

책에서 소개하는 몇 가지 방법 중 의미있다고 생각되는 것들을 몇 개 소개 하겠습니다.

1. 그릇된 정보를 피하라

해당 타입이 List가 아닌데 이름에 List가 들어가도록 짓는 것은 그릇된 정보를 제공하는 것입니다.

프로그래머에게 List는 특수한 의미입니다. 

당연히 List 타입으로 생각할텐데, 이 처럼 그롯된 정보를 제공하면 안된다는 의미입니다.

또한 혼동이 있을 수 있는 약어나, 대문자 O를 사용하여 0과 혼동되도록하는 것들도 피해야 합니다.

 

다른 프로그래머나 미래의 나 자신에게 혼동을 줄 수 있는 그릇된 정보를 피하라는 의미 입니다.

2. 의미있게 구분하라

연속적인 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 못한 방식입니다.

연속적인 숫자 (a1, a2, a3,...)를 덧 붙인 이름은 그릇된 정보를 제공하는 이름도 아니며, 아무런 정보를 제공하지 않는 이름입니다. 즉 의미가 없으며,  개발자의 의도를 제공할 수 없습니다.

또한 a, an, the 등의 불용어를 붙이는 것도 큰 의미가 없는데, 책에서는 이 뿐만 아니라

Info, Data등도 불용어로 봐야 하고, 이를 단순히 붙여 사용하는 것도 지양하라고 합니다.

ProductInfo, ProductData로 각각 명명한다면, 무엇이 다른지 알 수 없기 때문입니다.

즉, 읽는 사람이 차이를 알아보게 이름을 짓는 것이 중요합니다.

3. 검색하기 쉬운 이름을 사용하라

개발 이후 코드를 수정하거나 신규 기능을 개발할 때 등등 코드를 검색하는 일이 매우 많습니다.

그러므로 검색하기 쉬운 이름을 사용해야한다는 것도 매우 중요하다 생각됩니다.

 

문자 하나를 사용하는 이름과 상수는 쉽게 눈에 띄지 않을뿐더러, 검색에 어렵다는 문제가 있습니다.
예를 들어 e 라는 변수를 찾아서 수정을 해야할 때, e를 검색하면 e가 포함된 모든 단어가 검색될 것입니다.

코드 유지보수하는데 있어서 검색하는 것 또한 매우 중요하므로, 이 점도 유의있게 기억하면 좋을 것 같습니다.

간단한 예로, 일주일의 워킹데이를 적용하기 위해 숫자 5를 사용하는 것 보다는 아래와 같이 쓰는게 좋을 수 있습니다.

이름이 길어지긴 하지만 검색하기에는 매우 쉽게 느껴집니다.

const int WORK_DAYS_PER_WEEK = 5;


4. 한 개념에 한 단어를 사용하라

한 개념에 한 단어를 사용하고 이를 고수해야 합니다.

예를 들어, 똑같은 메서드를 클래스마다 fetch, get, read 등으로 제각각 부르면 혼란스러울 수 밖에 없습니다.

마찬가지로 동일 코드 기반에 controller, manager, dreiver를 섞어쓰면 혼란스럽습니다.

DeviceManger와 ProtocolController는 어떻게 다를까요?

일관성 있는 어휘는 매우 중요합니다.
해당 단어 사용을 회사나 그룹에서 미리 코딩 컨벤션등을 연구하고 적용하면 좋을 것 같습니다.

5. 의미있는 맥락을 추가하라

모든 의미있는 이름을 짓는 것에 실패하면 마지막 수단으로 접두어를 붙일 수 있습니다.

예를들어 firstName, lastName, street, city, state, zipCode, phoneNumber 등의 변수가 있다면,

이것들이 주소를 뜻함을 바로 알 수 있습니다.

 

하지만 어느 메서드에서 state 하나만 사용한다면, 이것이 주소의 일부라는 사실을 바로 알기 어려울 수도 있습니다.
이럴때 addr이라는 접두어를 추가한다면, 맥락이 조금 분명해질 수 있습니다. 

(addr = address의 축약)

String addrState;
int addrZipCode;


마무리
이름을 잘 지으면 코드 가독성은 물론 유지보수하기도 좋아집니다.

의미있는 이름 짓기는 쉽고도 가장 어려운 일이며, 매우 중요한 일입니다.

 

의미있는 이름 짓기는 장기적으로 모든 분야에서 쉽게 운영되고, 개선될 수 있다고 생각합니다.

 

서두에 밝힌 '의도를 분명히 밝혀라' 의 의미를 생각해서 다시 한번 내용을 복습해보면 좋을 것 같아요

반응형

'CleanCode' 카테고리의 다른 글

[CleanCode] 오류 처리  (0) 2023.11.10
[CleanCode] 객체와 자료 구조  (0) 2023.11.04
[CleanCode] 형식 맞추기  (2) 2023.11.04
[CleanCode] 주석  (0) 2023.10.21
[CleanCode] 함수  (0) 2023.10.12