노트

함수 추출하기

Extract Function

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

쉽게 말하면

함수 추출하기는 긴 글에 소제목을 다는 거예요. 문단을 다 읽지 않아도 '여기는 배송비 계산'처럼 무엇을 하는지 이름만 보고 알 수 있게, 어떻게 하는지는 소제목 아래로 숨겨요.

비유가 깨지는 곳 소제목을 너무 잘게 달면 오히려 읽기 힘들듯, 길이만 보고 쪼개면 함수 사이를 오가는 맥락의 점프가 늘어요. 이름이 안 떠오르면 추출하지 말고, 너무 잘게 나뉘었으면 인라인했다 다시 나눠요.

코드 조각에 목적을 드러내는 이름을 붙여 독립된 함수로 빼는 리팩터링. "어떻게"와 "무엇을"을 분리한다. 반대 방향인 함수 인라인하기(Inline Function)는 본문이 이름만큼 명확한 함수를 호출부로 다시 녹인다.

  • 코드가 무슨 일을 하는지 파악하는 데 시간이 걸리면 추출하고 그 "무슨 일"을 이름으로 쓴다. 주석을 달고 싶은 구간이 좋은 후보다
  • 이름이 떠오르지 않는다면 추출하면 안 된다는 신호다
  • 추출할 때 지역 변수가 걸림돌이 된다. 임시 변수를 질의 함수로 바꾸기로 변수를 먼저 줄이면 쉬워진다
  • 부수 효과가 섞인 조각을 뽑으면 이해가 오히려 어려워진다. 값을 계산하는 쪽과 상태를 바꾸는 쪽을 나눠 뽑는다(명령-질의 분리)

짧게 쪼갠다고 좋은 건 아니다

심플 디자인 관점에서는 중복이 없는 코드를 길이만 보고 쪼개는 추출을 경계한다. 읽는 사람이 함수 사이를 오가는 "맥락의 점프"가 늘고 구성요소만 많아진다. 중복을 없애려고 뽑은 함수는 대개 좋은 함수가 된다.

켄트 벡도 같은 이야기를 한다. 너무 잘게 나뉘어 오히려 이해가 안 되면 먼저 한 덩어리로 인라인한 다음(One Pile, 한국어판 "하나의 더미") 다시 정리하라고 한다(『켄트 벡의 Tidy First?』 개요). 추출과 인라인을 오가며 경계를 다시 긋는 것이 정상적인 흐름이다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Extract Function · refactoring.com: Inline Function · Refactoring.Guru: Extract Method · 인프런 『심플 디자인』 박영록 · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 리팩터링

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

  • 함수 선언 바꾸기

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

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

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

보기 옵션