김주엽
1. 📌 핵심 개념 정리
✅ 요약하기
-
의도를 분명히 밝혀라.
좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
만약 주석이 필요하다면 그 이름은 의도를 분명히 드러내지 못한 것이다.
- 개선 전
int d; // 경과 시간(단위: 날짜)
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList){
if (x[0] == 4) {
list1.add(x);
}
return list1;
}
}
변수 d
는 아무 의미가 드러나지 않는다. 또한 getThem
메서드는 코드가 하는 일을 짐작하기 어렵다.
- 개선 후
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard){
if (cell.isFlagged()) {
flaggedCells.add(x);
}
return flaggedCells;
}
}
- 우선 측정 값과 단위를 포함해 변수 이름을 개선했다.
getThem
메서드의 경우int
배열을 사용하는 대신 간단한 클래스로 만들고isFlagged
라는 좀 더 명시적인 함수를 사용해 조건문을 비교한다.- 단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌는데 이것이 좋은 이름이 주는 위력이다.
-
그릇된 정보는 피하고 의미 있게 구분하라.
그릇된 정보란 코드의 의미를 혼란스럽게 하거나 오해를 유발할 수 있는 정보를 말한다.
만약 다음과 같은 코드가 있을 때 사용자의 계정을 가져오려면 어느 메서드를 호출해야 할까?getActiveAccount(); getActiveAccouts(); getActiveAccountInfo();
명확한 관례가 없다면 프로젝트에 새로 참여한 프로그래머는 어느 함수를 호출할지 알기 어렵다.
이런 코드를 그릇된 정보를 담은 코드라고 할 수 있다.
- 개선 전
int hp, aix, sco;
int[] accountList;
void XYZControllerHandlingOfStrings();
void XYZControllerStorageOfStrings();
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
hp
,aix
,sco
는 유닉스 플랫폼을 가리키는 이름이기에 오해가 발생할 수 있다.accountList
의 경우int
배열이지만 변수에List
를 붙여 오해의 소지를 발생시키고 있다.XYZControllerHandlingOfStrings
메서드와XYZControllerStorageOfStrings
메서드 역시 단어가 비슷해 구분하기 어렵다.copyChars
메서드에서는 매개변수의 이름을a1, a2, ..., aN
형식으로 지정해 매개변수에 대해 아무런 정보를 제공하지 않고 있다.
- 개선 후
int healthPoints, auxiliaryIndex, groupScore;
int[] accounts;
void convertStringsInXYZController();
void storeStringsInXYZController();
public static void copyCharacters(char source[], char destination[]) {
for (int i = 0; i < source.length; i++) {
destination[i] = source[i];
}
}
- 의미가 명확한
healthPoints
,auxiliaryIndex
,groupScore
로 변경하자 어떤 변수인지 확인하기 쉬워졌다. - 이름 끝에
List
대신s
를 붙여 계정을 저장하는int
배열인 것을 좀 더 명확히 했다. - 메서드의 이름을 역할을 명확히 구분할 수 있도록 수정했다.
- 매개변수의 이름을
source
,destination
로 변경해 의미를 쉽게 파악할 수 있도록 수정했다.
-
발음하기 쉽고 검색하기 쉬운 이름을 사용하라.
발음하기 어려운 이름은 토론하기도 어렵다.
또한 검색하기 쉽도록 많은 코드에 들어갈 법한 단어, 숫자는 사용하지 않는 것이 좋다.
- 개선 전
class DtaRcrd102 {
private Date genymdhms;
}
위의 코드에서 genymdhms
를 발음하려면 어떻게 할까?
저자는 "제니 엠 디 에이치 엠 에스"라고 발음했다. 상당히 우스꽝스러운 발음이었지만 재미는 있을 수 있다.
그러나 매우 형편없는 이름이다. 또한 클래스 DtaRcrd102
의 경우 검색할 때 철자가 하나라도 틀리면 원하는 결과를 찾기 어렵다.
- 개선 후
class Customer {
private Date generationTimestamp;
}
코드 개선 후 발음하기 편하고 검색하기 명확해지기에 원하는 결과를 찾기 쉬워졌다.
"홍길동씨 이 레코드좀 보세요. 'Generation Timestamp'값이 내일 날짜입니다."
-
인코딩을 피하라.
인코딩이란 헝가리안 표기법, 접두사/접미사 기반 네이밍, 불필요한 축약어 등을 말한다.
과거에는 컴파일러가 타입 점검을 지원하지 않아 프로그래머가 타입을 기억할 단서가 필요했다.
그러나 현재는 IDE가 눈부시게 발전하며 헝가리안 표기법이나 기타 인코딩 방식은 방해가 된다.
- 개선 전
interface IShapeFactory {
void print();
}
class CShapeFactory implements IShapeFactory {
private String m_name;
@Override
public void print() {
System.out.println(m_name);
}
}
자바의 경우 강한 타입
언어이고 IDE
는 컴파일하지 않고도 타입 오류를 감지할 수 있을 정도로 발전했다.
따라서 클래스, 변수 등에 붙이는 접두어는 더이상 불필요하다.
- 개선 후
interface ShapeFactory {
void print();
}
class ShapeFactoryImpl implements ShapeFactory {
private String name;
@Override
public void print() {
System.out.println(name);
}
}
코드에 집중할 수 있도록 접두어를 제거해 불필요한 정신적 부담을 줄였다.
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
- 개념 또는 원칙의 이름
- 어려웠던 부분
해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다. - 궁금한 점
해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.
- 어려웠던 부분
- 개념 또는 원칙의 이름
- 어려웠던 부분
. - 궁금한 점
.
- 어려웠던 부분
- 개념 또는 원칙의 이름
- 어려웠던 부분
. - 궁금한 점
.
- 어려웠던 부분
3. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
- 관련 자료 공유
- 추가 자료
헝가리안 표기법
- 추가 자료
- 논의하고 싶은 주제
- 주제
논의하고 싶은 내용을 간략히 정리합니다. - 설명
논의하고 싶은 이유를 작성합니다.
- 주제