김주엽
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); } }
코드에 집중할 수 있도록 접두어를 제거해 불필요한 정신적 부담을 줄였다.
- 클래스와 메서드
-
클래스와 객체: 명사나 명사구가 적합하다.
- 좋은 예:
Customer
,WikiPage
,Account
,AddressParser
- 나쁜 예:
Manager
,Processor
,Data
,Info
- 좋은 예:
-
메서드: 동사나 동사구가 적합하고 접근자, 변경자, 조건자에는
get
,set
,is
를 붙인다.- 좋은 예:
getName
,postPayment
,deletePage
,save
- 나쁜 예:
name
,pay
- 좋은 예:
-
생성자: 중복정의할 때는 정적 팩토리 메서드 패턴을 사용한다.
- 개선 전
Complex fulcrumPoint = new Complex(23.0);
- 개선 후
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
-
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
-
그릇된 정보는 피하고 의미 있게 구분하라.
- 어려웠던 부분
사람마다 느끼는 혼란에 대한 기준이 다른데 어느 정도의 수준까지를 그릇된 정보라고 해야할 지 이해하기 어려웠다. - 궁금한 점
그릇된 정보를 피하기 위해서 코드를 정확히 어느 정도의 수준까지 구분해야 하는가?
- 어려웠던 부분
-
인코딩을 피하라.
- 어려웠던 부분
인코딩이 정확히 어떤 개념인지 이해하기 어려웠다. - 이해한 점
다른 사람이 정리한 글을 통해 인코딩이란 변수에 부가 정보를 덧붙여 표기하는 방법으로 이해했다. - 궁금한 점
인코딩을 피하라고 책에는 소개되어 있는데 일부 언어에서는 아직 인코딩을 붙이는 규칙을 지키고 있지 않은가?
- 어려웠던 부분
3. 📚 참고 사항
📢 논의하기
- 관련 자료 공유
- 논의하고 싶은 주제
- 주제
C#
에서는 아직 명명 규칙으로 인코딩을 권장하는데 이런 경우에는 인코딩을 지켜야 하는가? - 설명
C#
의 공식 문서를 보면 인코딩을 권장하고 있다.
저자는 인코딩을 피하는 것을 권장하는데 이런 경우에는 어떻게 하면 좋을까?
- 주제
No Comments