노트

변수 추출하기

Extract Variable

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

쉽게 말하면

변수 추출하기는 긴 계산식 중간중간에 '기본 가격', '수량 할인' 같은 이름표를 붙이는 거예요. 영수증에 항목별 금액이 나뉘어 찍히면 합계가 왜 그렇게 나왔는지 한눈에 보이는 것처럼요.

비유가 깨지는 곳 영수증 항목은 그 영수증 안에서만 쓰지만, 그 이름이 함수 밖에서도 의미 있다면 변수 대신 함수로 뽑아요. 반대로 이름이 원래 식과 다를 바 없으면 변수를 다시 인라인해요.

복잡한 표현식의 일부에 이름을 붙여 지역 변수로 빼는 리팩터링. 변수를 추출하고 싶다는 건 그 표현식에 이름을 붙이고 싶다는 뜻이다.

// before
return order.qty * order.price - Math.max(0, order.qty - 500) * order.price * 0.05
  + Math.min(order.qty * order.price * 0.1, 100)
 
// after
const basePrice = order.qty * order.price
const quantityDiscount = Math.max(0, order.qty - 500) * order.price * 0.05
const shipping = Math.min(basePrice * 0.1, 100)
return basePrice - quantityDiscount + shipping
  • 이름이 함수 밖에서도 의미 있다면 변수 대신 함수로 뽑는다(함수 추출하기, 임시 변수를 질의 함수로 바꾸기)
  • 반대로 이름이 원래 표현식과 다를 바 없거나 주변 리팩터링에 방해가 되면 변수를 인라인한다(Inline Variable)
  • 켄트 벡은 같은 정리를 Explaining Variables(한국어판 "설명하는 변수")라고 부르고, 숫자 리터럴에 이름을 붙이는 설명 상수와 나란히 둔다
  • 설명 변수를 만들고 나면 같은 내용을 말하던 주석은 지울 수 있다

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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 병렬 수정 (팽창-수축)

    호환되지 않는 변경을 한 번에 하지 않고, 새 것을 추가하고(팽창, Expand) 옛 것과 함께 쓰다가 옛 것을 걷어 내는(수축, Contract) 단계로 나눠 하는 방법. 각 단계가 배포 가능한 상태라 중간에 멈춰도 안전하다.

  • 매개변수 객체 만들기

    여러 함수에 늘 함께 넘겨지는 값 묶음(데이터 뭉치, Data Clumps)을 하나의 객체로 묶어 넘기는 리팩터링.

  • 함수 선언 바꾸기

    함수의 이름이나 매개변수 목록을 바꾸는 리팩터링. 가장 자주 쓰는 리팩터링이 이름 바꾸기인 것은, 이름이 코드를 명료하게 하는 가장 큰 도구이기 때문이다.

  • 문장 슬라이드하기

    관련된 코드끼리 가까이 모이도록 문장의 위치를 옮기는 리팩터링. 그 자체로도 읽기 쉬워지지만, 대개 함수 추출의 준비 단계로 쓴다.

  • 플래그 인수

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

보기 옵션