CleanCode/Refactoring

[Refactoring] Bool 변수 네이밍 방법

eyi-jin 2022. 5. 19. 14:23

Background

한가지 프로젝트를 지정하여, 리팩토링을 하는 과제가 있는데,
리팩토링중 부울 변수의 작명을 어떻게 해야할지 감이 잘 오지 않았습니다.
그래서 제대로 된 부울함수 작명법을 익히고자 이 포스트를 작성합니다.

요약

Bool 변수 작명을 위해 알아야하는 영문법을 네 가지 케이스들로 정리했습니다.

  • is 용법
  • 조동사 용법
  • has 용법
  • 동사원형 용법

IS 용법

is로 시작하는 변수명이 가장 흔한 케이스 입니다.
뒤에 나오는 단어의 특징에 따라 세 가지로 나눌 수 있습니다.

  • is + 명사
  • is + 현재진행형(~ing)
  • is + 형용사
  • is + 명사
    “(무엇)인가?” 라는 뜻으로 쓰입니다.
    func isDescendant(of view: UIView) -> Bool //UIView: "view의 자식인가?"
참고 Check VS Is
  • 공통점
    • Check와 Is 모두 return 값이 boolean 입니다.
    • 값의 변경이 없어야합니다. (그저 확인하는 부울함수이기 때문입니다.)
  • 차이점
    • Check는 true인가 false인가를 판단하기 위한 것입니다.
    • Is는 true만 판단하기 위한 접두어입니다.

예를 들자면,

// Is 접두어
if (IsZeroHP())
{
    printf("HP가 0입니다!\n");
}

// Check 접두어
if (CheckZeroHP() == false)
{
    printf("아직 HP가 남아있습니다\n");
}

이렇듯이 미묘한 차이가 있기 때문에 잘 생각해보고 선택하여 사용하는 것이 필요합니다.

is + 현재진행형(~ing)

“~하는 중인가?” 라는 뜻이 필요할 때 쓰면 됩니다.

var isExecuting: Bool { get } //Operation: "오퍼레이션의 작업이 현재 실행 중인가?"
var isPending: Bool { get } //MSMessage: "메시지가 보내지기 전 대기 중인가?"

is + 형용사

이제부터 살짝 헷갈릴 수 있습니다.

형용사도 두 종류로 나뉩니다.

  • 단어 자체가 형용사인 것 - opaque, readable, visible 등
  • 과거분사 형태 - hidden, selected, highlighted, completed 등
    과거분사(past participle)는 간단히 말해 동사로 만든 형용사라고 생각하면 됩니다.
    동사를 과거분사로 바꾸면 뜻이 여러가지로 바뀔 수 있는데, 일단 여기서는 수동태라고 생각하면 됩니다.
    hide(숨다) - hidden(숨겨진), select(선택하다) - selected(선택된), complete(완료하다) - completed(완료된) 등등.
var isOpaque: Bool { get set }
var isSelected: Bool { get set }
var isHighlighted: Bool { get set }
var isHidden: Bool { get set } 

조동사 용법

조동사(modal verb)는 동사를 돕는 동사란 뜻인데 can, should, will 등이 있다. 주의할 점은 조동사 + 동사원형 으로 써야한다는 것 하나 뿐이다.

can: “~ 할 수 있는가?”

should, will: “~ 해야 하는가?” 혹은 “~ 할 것인가?”

등등.

var canBecomeFirstResponder: Bool { get } //UIResponder: first responder가 될 수 있는가?
var shouldRefreshRefetchedObjects: Bool { get set } //NSFetchRequest: 가져온 값을 refresh 할 것인가?

has 용법

has로 시작하는 Bool 변수명은 상대적으로 빈도가 낮지만 뜻이 전혀 다르게 쓰이는 두 가지가 있어서 알아두면 유용합니다.

  • has + 명사
  • has + 과거분사

has + 명사

has 다음 명사가 나오면 “~를 가지고 있는가?” 라는 뜻입니다.

var hasiCloudAccount: Bool { get } //CKUserIdentity: 관련된 iCloud 계정을 가지고 있는가?
var hasVideo: Bool { get set } //CXCallUpdate: 콜에 비디오가 포함되어 있는가?

has + 과거분사

모든 케이스를 통틀어 가장 덜 쓰이는 케이스 같으므로 만약 이해 안되더라도 넘어가도 지장 없다. 게다가 is + 과거분사와 뜻이 거의 같기 때문에 꼭 알아야할 필요도 없어보인다.

이때의 과거분사는 아까 is + 과거분사 때와는 다른 의미이다. has + 과거분사는 현재완료 의 의미를 가지는데 굳이 해석하자면 ‘과거에 완료된 것이 현재까지 유지되고 있다’는 뜻이다. 따라서 Bool 변수로 쓰이면 ‘~가 유지되고 있는가?’ 라고 해석할 수 있다.

var hasConnected: Bool { get } //CXCall: 콜이 연결되어 있는가?
var hasEnded: Bool { get } //CXCall: 콜이 끝났는가?

동사원형 용법

여기서 주의할 점은 동사원형을 3인칭 단수로 써야 합니다.
3인칭 단수는 보통 동사원형 뒤에 -s나 -es가 붙는 형태입니다.

supports: ~을 지원하는가?
includes: ~을 포함하는가?
shows: ~을 보여줄 것인가?
allows: ~을 허용할 것인가?
accepts: ~을 받아 주는가?
contains: ~을 포함하고 있는가?
이정도 단어들의 쓰임새만 알아도 풍부한 Bool 변수명을 짓기에 충분한 것 같습니다.

var supportsVideo: Bool //CXProviderConfiguration: 비디오를 지원하는가?
var includesCallsInRecents: Bool //CXProviderConfiguration
var showsBackgroundLocationIndicator: Bool //CLLocationManager
var allowsEditing: Bool //CNContactViewController: 편집을 허용하는가?
var acceptsFirstResponder: Bool //NSResponder

그 외에도 returns, preserves 등도 있습니다.

마무리

정리하자면

  • is 용법
    • is + 명사
    • is + 현재진행(~ing)
    • is + 형용사
  • 조동사 용법
    • can, should, will 등
    • 조동사 + 동사원형
  • has 용법
    • has + 명사
    • has + 과거분사 (is + 과거분사와 의미 거의 동일)
  • 동사원형 용법
    • 3인칭 단수

참고

Bool 변수 이름 제대로 짓기 위한 최소한의 영어 문법
Naming guidelines for boolean variables
접두어 Check 와 Is