제 이름은 쇠북 종, 민첩할 민입니다.
쇠북 종은 종소리를 의미하기에 좋은 소식을 민첩하게 전하는 역할을 의미해서 지도자가 되라는 의미가 있다고 합니다.
이처럼 사람에 이름에는 한자 만 알면 풀이가 가능한 의도가 있습니다.
프로그래머는 함수, 인수, 클래스, 패키지, 소스 파일, 디렉토리 등에 대해서 수 많은 이름을 지어준다. 이 이름을 통해서 우리는 정보를 유추해내죠. 그렇기에 의미 있는 이름은 매우 중요합니다.
이책에 서 말하는 의미 있는 이름을 짓는 방법보면
1. 의도를 분명히 밝혀라
int d // 경과 시간
int daysSinceCreation;
사실 위의 예시 만으로 무슨 말을 하고싶어 하는지 알거 같다.
이름을 보고 의도를 파악할 수 있게 하라는 말로 이는 모든 이름에 적용되어야 한다.
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<>();
for (int[] x : theList) {
if(x[0] == 4) {
list1.add(x);
}
}
return list1;
}
위 코드는 theList에 무엇이 들은 건지, 값 4가 의미하는 것이 무엇인지 등 매락이 명시적으로 들어나지 않는다.
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard) {
if (cell.isFlagged()) {
flaggedCells.add(cell);
}
}
return flaggedCells;
}
위 코드에 지뢰찾기 게임에 대한 내용이라는 것을 알고 있다고 가정해보자 그럼 게임판의 cell 중에 깃발이 꽂힌 상태인 경우 깃발이 꽂힌 cell 목록에 해당 cell을 추가한다는 것을 파악할 수 있다.
int[] -> Cell
list1 -> flaggedCells
theList -> gameboard
== 4 -> isFlagged()
이름을 고친것으로 함수가 하는 일을 이해하기 쉬워진다.
2. 그릇된 정보를 피하라
이부분은 단순하다. 이름으로 잘못 유추하게 하지말라는 말로
널리 알려지 단어를 다른 의미로 사용하면 안된다.
// hypotenuse : 삼각형의 빗면
int hypotenuse = 10;
// hp? 피통인가...
int hp = 10;
List가 아닌데 List라고 하지마라.
int list = 10 // ?
int contentOfString = 10 // ?
흡사한 이름을 사용하지 마라.
String XYZContentHandleingOfString = "";
String XYZContentStorageOfString = "";
일관성 있는 표기법을 사용해라.
Static final int MAX_COUNT = 10; // 상수
int nowCount = 15; // 변수
+ 추가
int a = 1; // 숫자 1
int b = l; // 소문자 L
String c = "O"; // 대문자 O
String d = "0"; // 숫자 0
3. 의미 있게 구분하라
구분하기 위한 이름이 아닌 구분되는 이름을 작성해야한다.
public static void copyChars(char[] a1, char[] a2) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
// 매개변수 이름
public static void copyChars(char[] source, char[] destination) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
// 불용어
String ProductInfo = "a";
String ProductData = "a";
// 불필요한 단어
String name = "유종민";
String nameString = "유종민"; // 변수명에 String이 필요한가...
// 클래스의 차이?
Customer target = new Customer();
CustomerObject target = new CustomerObject();
// 무엇을 호출하는 함수인가...
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
4. 발음하기 쉬운 이름을 사용하라
발음하기 어려우면 코드에 대한 토론이나 우리 두뇌의 활용에 좋지않다.
Date genymdhms; // generate date, year, month, day, hour, minute, second
Date generationTimestamp;
5. 검색하기 쉬운 이름을 사용하라
특정값의 의미를 찾기위해서 검색할때 숫자 4이면 숫자 4와 같은 값들 중 코드의 맥락을 이해해서 의미를 찾아야하지만
변수명을 사용한다면 쉽게 가능하다.
for(int j = 0; j < 34; j++) {
s += (t[j]*4) / 5;
}
int realDaysPerIdealDay = 4;
final int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for(int i = 0; j < NUMBER_OF_TASKS; j++) {
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
6. 인코딩을 피하라
과거 헝가리안 표기법을 의미한다. 요즘 IDE나 언어의 발전으로 사용하지 않아도 되는 개념
7. 자신의 기억력을 자랑하지 마라
독자가 코드를 읽으면서 변수 이름을 자신이 아닌 이름으로 변환해야하는 상황을 만들지 않아야한다.
8. 기발한 이름은 피하라
특정 문화, 개인의 유머를 코드에 사용하는 것은 적절하지않다. 멍료한 이름을 선택하라.
9. 한 개념에 한 단어를 사용하라
일관성 어휘 코드에 대한 내용으로 클래스마다 fetch, retrieve, get으로 제각각 사용하면 혼란을 불러 올수 있음을 말한다.
10. 말장난 하지 마라
위와 반대로 하나의 단어를 두가지 목적으로 사용하지 말라는 의미로
add 메서드를 기존 값 두개를 더하거나 이어서 새로운 값을 만드는데 사용했다면
집합에 값하나를 추가할때 add를 사용하면 안된다. 기존에 사용되는 add의 목적과 다르기 때문에
append같은 메서드의 이름이 적당하다.
11. 해법 영역에서 가져온 이름을 사용하라
코드를 읽는 사람은 포르그래머이지 현업에서 일하는 사람이 아니다. 모든 이름을 도메인에서 가져오는 정책은 실제 코드를 읽는 프로그래머와 동떠어질 수 있다. 전산 , 알고리즘, 패턴, 수학용어 등 해법 영역의 이름을 사용하는것이 이해를 도울 수 있다.
12. 문제 영역에서 가져온 이름을 사용하라
적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다. 이를 통해서 분야 전문가에게 의미를 물어 파악할 수 있게 된다.
13. 의미 있는 매락을 추가하라
주소의 상태를 나타낸다면 state보다는 addrState와 같이 적절한 접두어를 사용해서 의미있는 매락을 추가할 수 있다. 물론 이방식은 최대한 의미있는 이름을 작성하려고 한뒤 의미가 불분명한 이름에 사용할수 있는 방법이다.
14. 불필요한 맥락을 없애라.
13번에 반대되는 것으로 특정 프로젝트에서 모든 클래스 이름에 접두어를 사용한다는 둥의 현명하지 못한 행동을 하지말라라는 의미이다.
'개발 공부 > Clean Code' 카테고리의 다른 글
코드 리뷰 조금 이해하기 (1) | 2021.07.02 |
---|---|
4.[Clean Code] 주석 (0) | 2021.04.09 |
3. [Clean Code] 함수 (0) | 2021.04.08 |
1. [Clean Code] 깨끗한 코드 (0) | 2021.04.07 |
Clean Code 책 정리 시작 (0) | 2021.04.06 |