노트

조건문 분해·통합

Decompose Conditional and Consolidate Conditional Expression

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

쉽게 말하면

조건문 분해·통합은 놀이기구 입구의 여러 탑승 제한 조건을 '탑승 불가'라는 표지판 한 장으로 묶는 거예요. 조건을 하나하나 읽지 않아도 왜 막는지가 이름만 보고 바로 보여요.

비유가 깨지는 곳 표지판처럼 아무 조건이나 한 장에 모으면 안 돼요. 결과가 같아도 서로 독립된 검사라면 합치지 않고, 하나의 규칙이라고 말할 수 있을 때만 통합해요.

복잡한 조건문의 조건식과 각 분기 본문에 의도를 드러내는 이름을 붙이는 리팩터링(분해, Decompose Conditional), 그리고 결과가 같은 여러 조건 검사를 하나로 묶는 리팩터링(통합, Consolidate Conditional Expression). 조건 코드는 무엇이 일어나는지는 말하지만 왜 그런지는 잘 말하지 않는데, 이름이 그 "왜"를 채운다.

// 분해
if (isSummer(date)) charge = summerCharge(quantity)
else charge = regularCharge(quantity)
 
// 통합
if (isNotEligibleForDisability(employee)) return 0
// 원래: seniority < 2 이면 0, monthsDisabled > 12 이면 0, isPartTime 이면 0
  • 통합하면 하려는 일이 한 문장으로 드러나고, 대개 함수 추출로 이어진다
  • 하지만 정말 서로 독립된 검사라면 합치지 않는다. 하나의 규칙이라고 말할 수 있을 때만 통합한다
  • 모든 분기에 똑같이 들어 있는 문장은 조건문 밖으로 뺀다. 1판의 Consolidate Duplicate Conditional Fragments이고, 2판에서는 문장 슬라이드로 다룬다
  • 정상 흐름과 예외 상황이 섞여 있다면 보호 구문이, 타입마다 갈라진다면 다형성이 다음 단계다

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Decompose Conditional · refactoring.com: Consolidate Conditional Expression · Refactoring.Guru: Decompose Conditional · Refactoring.Guru: Consolidate Conditional Expression

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 리팩터링

    겉으로 보이는 동작은 그대로 둔 채, 코드를 이해하고 고치기 쉽게 내부 구조를 바꾸는 일. 기능을 더하는 일이 아니라 다음 변경을 덜 위험하게 만드는 정리다.

  • 반복문을 파이프라인으로 바꾸기

    for 반복문을 filter·map·reduce 같은 컬렉션 연산의 연쇄, 즉 컬렉션 파이프라인(Collection Pipeline)으로 바꾸는 리팩터링. 각 원소가 어떤 단계를 거치는지가 위에서 아래로 읽힌다.

  • 『리팩터링 2판』 개요

    마틴 파울러가 리팩터링 기법을 JavaScript 예제로 다시 정리한 책. 1판(Java)의 카탈로그를 다듬고, 클래스 없이 함수만으로도 쓸 수 있는 기법을 많이 담았다.

  • 플래그 인수

    호출하는 쪽이 함수 안에서 실행할 로직을 고르려고 넘기는 인수. 호출문만 봐서는 무슨 뜻인지 알기 어렵고, 함수가 어떤 기능들을 제공하는지도 숨긴다.

  • 임시 변수를 질의 함수로 바꾸기

    계산 결과를 담아 두던 임시 변수를 그 값을 돌려주는 함수로 바꾸는 리팩터링. 긴 함수를 쪼개기 전 단계로 특히 쓸모 있다.

보기 옵션