규도자 개발 블로그

좋은 변수이름 정하기 : 상태 변수 이름 본문

소프트웨어 공학/Clean Code

좋은 변수이름 정하기 : 상태 변수 이름

규도자 (gyudoza) 2018. 10. 10. 22:54

전의 게시물에서도 밝혔다시피 이 게시물은 스티브 맥코넬이 쓴 CODE COMPLETE2에 나온 내용이며 다른 사람들에게도 변수 이름의 중요성과 그 이름을 정하는 데 도움을 주기 위해, 그리고 나 자신도 필요할 때마다 참고하기 위해 쓴다는 것을 알린다.

상태 변수 이름

상태 변수는 프로그램의 상태를 설명한다. 다음은 상태 변수의 이름에 대한 가이드라인이다.

 상태 변수에 대해서 flag보다 더 나은 이름을 생각해 본다. 플래그는 상태 변수로 생각하는 것이 좋다. 플래그라는 이름은 그것이 무엇을 하는지 아무런 단서도 제공하지 않기 때문에 변수 이름에 사용하지 말아야 한다. 분명하게 하기 위해 플래그에 값을 할당하고 그 값을 열거형이나 이름 상수, 이름 상수처럼 작동하는 전역 변수로 테스트해야 한다. 다음은 이름을 잘못 지은 플래그에 대한 몇 가지 예제다.

의미가 모호한 플래그에 대한 C++ 예제

if (flag) ...
if (statusFlag & 0x0F) ...
if (printFlag == 16) ...
if (computeFlag == 0) ...
    
flag = 0x1;
statusFlag = 0x80;
pointFlag = 16;
computeFlag = 0;

statusFlag = 0x80과 같은 명령문은 직접 코드를 작성했거나 statusFlag와 0x80이 무엇을 표현하는지 설명하는 문서를 보기 전까지는 코드가 무엇을 하는지 전혀 알 수가 없다. 다음은 앞에서 살펴본 코드와 같은 코드를 더 분명하게 작성한 예제다.

상태 변수를 잘 사용한 C++ 예제

if (dataReady) ...
if (characterType & PRINTABLE_CHAR) ...
if (reportType == ReportType_Annual) ...
if (recalcNeeded == True) ...
    
dataReady = true;
characterType = CONTROL_CHARACTER;
reportType = ReportType_Annual;
recalcNeeded = false;

확실히 characterType = CONTROL_CHARACTER;는 statusFlag = 0x80보다 더 이해하기 쉽다. 마찬가지로 if (reportType == ReportType_Annual)은 if (printFlag == 16)보다 분명하다. 이 예제는 미리 정의된 이름 상수뿐만 아니라 열거형에도 이 접근 방법을 사용할 수 있다는 것을 보여주고 있다. 다음은 이 예제에서 사용된 변수를 설정하는 데 이름 상수와 열거형을 사용하는 방법이다.


C++에서 상태 변수 선언

// CharacterType값
const int LETTER = 0x01;
const int DIGIT = 0x02;
const int PUNCTUATION = 0x04;
const int LINE_DRAW = 0x08;

const int PRINTABLE_CHAR = (LETTER | DIGIT | PUNCTUTATION | LINE_DRAW);

const int CONTROL_CHARACTER = 0x80;

//ReportType 값
enum ReportType {
    ReportType_Daily,
    ReportType_Monthly,
    ReportType_Quarterly,
    ReportType_Annual,
    ReportType_All
}

이 코드에서 "이해해야" 하는 부분이 있다면 변수의 이름을 다시 만든다. 코드는 "밝혀내야 할 대상"이 아니다. 보는 순간 직관적으로 이해할 수 있어야 한다.

Comments