노트

문장 슬라이드하기

Slide Statements

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

쉽게 말하면

문장 슬라이드하기는 장보기 목록을 마트 동선 순서로 다시 적는 거예요. 같은 코너 물건끼리 붙어 있으면 읽기도 쉽고, 나중에 한 코너만 떼어 따로 부탁하기도 쉬워져요.

비유가 깨지는 곳 목록과 달리 코드는 아무 데로나 옮길 수 없어요. 참조하는 선언보다 앞으로, 자기를 참조하는 문장보다 뒤로는 못 가고, 자기가 쓰는 값을 바꾸는 문장도 건너뛸 수 없어요.

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

  • 변수는 처음 쓰는 곳 바로 앞에서 선언하고 초기화한다. 이름은 값이 대입될 때 의미가 강해지므로, 선언과 초기화가 멀리 떨어지면 읽기 어렵다
  • 옮기기 전에 간섭을 확인한다. 참조하는 요소의 선언보다 앞으로, 자신을 참조하는 문장보다 뒤로는 갈 수 없고, 자신이 읽거나 바꾸는 값을 수정하는 문장을 건너뛸 수 없다
  • 테스트가 깨지면 이동 거리나 한 번에 옮기는 조각을 줄인다

켄트 벡의 정리 기법 몇 가지가 같은 동작을 다른 이름으로 부른다(정리(Tidying)).

  • Move Declaration and Initialization Together(한국어판 "선언과 초기화를 함께 옮기기"): 위의 선언·초기화 규칙
  • Reading Order("읽는 순서"): 처음 읽는 사람이 이해하기 좋은 순서로 재배치
  • Cohesion Order("응집도를 높이는 배치"): 함께 바뀌는 코드(또는 파일)를 붙여 놓는다. 디커플링이 당장 어렵다면 가까이 두는 것만으로도 다음 변경이 쉬워진다

결국 응집도를 코드 배치 수준에서 높이는 일이다.

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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 리팩터링

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

  • 매개변수 객체 만들기

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

  • 함수·필드 옮기기

    함수나 필드를 더 자연스러운 맥락(모듈·클래스)으로 옮기는 리팩터링. 좋은 설계의 핵심인 모듈성(Modularity), 즉 어딘가를 고칠 때 관련된 작은 부분만 이해하면 되게 하는 능력을 키운다.

  • 변수 추출하기

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

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

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

보기 옵션