Clean Code 2. 의미있는 이름
3 minute read
목차
의도를 분명히 밝혀라
- 변수의 존재 이유, 수행 기능, 사용 방법이 드러나야 함
- 코드의 단순성이 아닌 함축성이 의도를 파악하는데 방해가 됨
- 이름 수정으로 함수가 하는일을 이해하기 쉬워짐
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
그릇된 정보를 피하라
- 일관성 있는 표기법 사용
- Type이 List가 아니라면 List를 붙이지 않도록 함
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안됨
var tc = new TextConverter();
의미 있게 구분하라
- 연속적인 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절치 못함
Copy(Type a1, Type a2);
Copy(Type source, Type destination);
- 읽는 사람이 차이를 알도록 naming 해야 한다.
class Account; class AccountInfo;
class AccountData; class AccountInfo;
발음하기 쉬운 이름을 사용하라
- 발음이 어려우면 토론하기 어렵고 혼란이 생김
DateTime genymdhms; // general date, year, month, day, hour, minute, second
DateTime generationDateTime;
DateTime generalTimeStamp;
검색하기 쉬운 이름을 사용하라
- 문자 하나를 사용하는 이름이나 상수는 눈에 띄지 않음
int d;
const int DaysInWeek = 7;
const int WorkDaysPerWeek = 5;
인코딩을 피하라
- 변수 이름에 타입을 인코딩 할 필요가 없음
- IDE가 많이 발전하여 컴파일 하지 않고도 타입 오류를 알 수 있음
- 타입을 바꾸기 어려워짐
string phoneString;
PhoneNumber phoneString;
- 접두어를 붙일 필요가 없음
- IDE가 멤버 변수 색상을 다르게 표시해줌
string m_dsc;
string description;
- 인터페이스와 구현 클래스 접두어 문제
- 과도한 정보
class ShapeFactory : IShapeFactory;
class CShapeFactory : ShapeFactory;
class VoyageSheet : ISheet;
class VoyageSheet : Sheet;
자신의 기억력을 자랑하지 마라
- 문자 하나만 사용하는 변수 이름은 문제가 많음
- 단, 루프에서 반복 횟수를 세는 i, j, k는 예외
- 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 바람직하지 않음
클래스 이름
- 명사 혹은 명사구가 적합. 동사는 사용하지 않음
- Manager, Processor, Data, Info 같은 단어는 피해야 함
메서드 이름
- 동사 혹은 동사구가 적합
- 접근자는 get, 변경자는 set, 조건자는 is를 붙임
- 생성자를 overload 할 때는 정적 팩토리 메서드를 사용
- 정적 팩토리 메서드만 사용 할 때 생성자를 private으로 선언
var complex = new Complex(23.0);
var complex = Complex.FromRealNumber(23.0);
var accountData = new AccountData();
var accountInfo = new AccountInfo(accountData);
var accountInfo = AccountInfo.Of(accountData);
기발한 이름을 피하라
- 재밌는 이름보다 명료한 이름을 선택해야 함
CalculateByYhjang();
Calculate();
- 의도는 분명하게 해야 함
한 개념에 한 단어를 사용하라
- 똑같은 동작을 하는 메서드를 클래스마다 제각각으로 부르면 혼란
- 똑같은 동작을 하는 클래스를 제각각으로 부르면 혼란
- Controller, Manager, Drive
- 일관성 있는 어휘를 사용하여 코드를 작성
말장난을 하지 마라
- 한 단어를 두가지 목적으로 사용하면 안됨
- 다른 개념에 같은 단어를 사용하면 안됨
- 일관성을 유지한다고 해서 다른 동작을 같은 이름으로 쓰면 안됨
해법 영역에서 가져온 이름을 사용하라
- 기술 개념에는 기술 이름이 가장 적합
- 코드를 읽는 사람도 프로그래머이기 때문에 알고리즘 이름, 패턴 이름, 수학 용어를 사용
- ServiceFactory (Factory Pattern)
문제 영역에서 가져온 이름을 사용하라
- 적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 사용
QuickSearch();
HashSearch();
의미 있는 맥락을 추가하라
- 접두어를 붙임
- 접두어를 붙이는 것보다 클래스를 생성하는 것이 바람직한 방법
string firstName, secondName, state;
string addrFirstName, addrSecondName, addrState;
class Address
{
string firstName;
string secondName;
string state;
}
불필요한 맥락을 없애라
- 클래스 이름에 접두어로 프로그램 이름 약자를 붙이는 것은 바람직하지 못함
- 긴 이름보다 짧은 이름이 좋음
class TPEstimationWorkbook;
class EstimationWorkbook;
결론
- 우리는 대다수 자신이 짠 클래스 이름과 메서드 이름을 모두 암기하지 못한다.
- 그러므로 문장이나 문단처럼 읽히는 코드를 짜는데 집중해야 한다.
- 누가 질책한다고 해서 노력을 멈추면 안된다.
과제
- 본인이 작성한 코드에 규칙 하나 이상 적용하여 가독성 높이기
과제코드
Leave a comment