노트

보호 구문

Guard Clause

설계#refactoring · 연결된 개념 9개

쉽게 말하면

보호 구문은 공연장 입구에서 표가 없거나 시간이 지난 사람을 먼저 돌려보내는 거예요. 걸러 낼 경우를 앞에서 처리하고 나면 안쪽에서는 진짜 관객만 신경 쓰면 되니, 흐름이 한 줄로 쭉 펴져요.

비유가 깨지는 곳 공연장 입구는 하나지만 함수는 return이 하나여야 한다는 규칙에 매이지 않아요. 할 일을 마쳤으면 바로 return으로 알리고, TypeScript에선 이렇게 걸러 낸 뒤 타입이 좁혀지는 효과도 있어요.

정상 흐름이 아닌 경우를 함수 앞부분에서 검사하고 바로 빠져나오는 조건문. 중첩된 if-else를 평평하게 펴서 핵심 흐름을 드러낸다.

// before
function payAmount() {
  let result
  if (isDead) result = deadAmount()
  else {
    if (isSeparated) result = separatedAmount()
    else result = isRetired ? retiredAmount() : normalPayAmount()
  }
  return result
}
 
// after
function payAmount() {
  if (isDead) return deadAmount()
  if (isSeparated) return separatedAmount()
  if (isRetired) return retiredAmount()
  return normalPayAmount()
}
  • if-else는 "두 갈래가 똑같이 중요하다"고 말하고, 보호 구문은 "이건 핵심이 아니니 처리하고 나간다"고 말한다. 의도를 전달하는 방식이 다르다
  • 조건을 뒤집어 적용하는 경우도 많다(capital > 0이면 진행 → capital <= 0이면 반환)
  • 함수의 return이 하나여야 한다는 규칙에 매이지 않는다. 할 일을 마쳤으면 return으로 분명히 알린다
  • 반복문 안의 제어 플래그(Control Flag) 변수도 같은 이유로 break·return으로 바꾼다. 가변 변수가 하나 줄어든다(제어 플래그를 탈출문으로 바꾸기, Replace Control Flag with Break)
  • 보호 구문으로 바꾸고 나면 "기본값 반환" 같은 설명 주석이 필요 없어지는 경우가 많다

켄트 벡의 첫 번째 정리 기법(1장 "보호 구문")이기도 하다(정리(Tidying)). TypeScript에서는 보호 구문이 그대로 타입 좁히기(Type Narrowing) 역할을 한다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Replace Nested Conditional with Guard Clauses · Refactoring.Guru: Replace Nested Conditional with Guard Clauses · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 기본형 집착

    전화번호·금액·우선순위 같은 도메인 개념을 끝까지 문자열이나 숫자로만 다루는 냄새. 같은 검증과 포맷 코드가 여기저기 반복되고, 문자열로 모든 걸 표현하는 "stringly typed" 코드가 된다.

  • 조건부 로직을 다형성으로 바꾸기

    타입에 따라 갈라지는 조건문을, 타입마다 클래스(또는 객체)를 두고 각자 자기 방식으로 처리하게 바꾸는 리팩터링.

  • 명령-질의 분리

    함수를 값을 돌려주는 질의(query)와 상태를 바꾸는 명령(command) 중 하나로만 만들라는 원칙. 질의 함수는 겉으로 관찰되는 부수 효과(Side Effect)가 없어야 한다.

  • 변경하기 쉬운 프런트엔드 코드

    Frontend Fundamentals는 "좋은 프런트엔드 코드 = 변경하기 쉬운 코드"라는 관점에서 가독성(Readability)·예측 가능성(Predictability)·응집도(Cohesion)·결합도(Coupling) 네 기준과 구체적인 기법을 정리한 공개 가이드다. 네 기준은 서로 부딪치기도 해서 상황에 맞게 무엇을 우선할지 고르는 것이 핵심이다.

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

보기 옵션