변수 추출하기 Extract Variable

0

리팩터링 카탈로그

목록 보기
3/10

배경


표현식이 너무 복잡해서 이해하기 어려울 때가 있다. 이럴 때 지역 변수를 활용하면 표현식을 쪼개 관리하기 더 쉽게 만들 수 있다. 그러면 복잡한 로직을 구성하는 단계마다 이름을 붙일 수 있어서코드의 목적을 훨씬 명확하게 드러낼 수 있다.

이 과정에서 추가한 변수는 디버깅에도 도움된다. 디버거에 중단점을 지정하거나 상태를 출력하는 문장을 추가할 수 있기 때문이다.

변수추출을 고려한다고 함은 표현식에 이름을 붙이고 싶다는 뜻이다. 이름을 붙이기로 했다면 그 이름이 들어갈 문맥도 살펴야 한다. 현재 함수 안에서만 의미가 있다면 변수로 추출하는 것이 좋다. 그러나 함수를 벗어난 넓은 문맥에서까지 의미가 된다면 그 넓은 범위에서 통용되는 이름을 생각해야 한다. 다시 말해 변수가 아닌 (주로) 함수로 추출해야 한다. 이름이 통용되는 문맥을 넓히면 다른 코드에서 사용할 수 있기 때문에 같은 표현식을 중복해서 작성하지 않아도 된다. 그래서 중복이 적으면서 의도가 잘 드러나는 코드를 작성할 수 있다.

이름이 통용되는 문맥을 넓힐 때 생기는 단점은 할 일이 늘어난다는 것이다. 많이 늘어날 것 같다면 임시 변수를 질의 함수로 바꾸기를 적용할 수 있을 때까지 일단 놔둔다. 간단히 처리할 수 있다면 즉시 넓혀서 다른 코드에서도 사용할 수 있게 한다. 가령 클래스 안의 코드를 다룰 때는 함수 추출하기를 아주 쉽게 적용할 수 있다.

절차


  1. 추출하려는 표현식에 부작욕응 없는지 확인한다.
  2. 불변 변수를 하나 선언하고 이름을 붙일 표현식의 복제본을 대입한다.
  3. 원폰 표현식을 새로 만든 변수로 교체한다.
  4. 테스트한다.
  5. 표현식을 여러 곳에서 사용한다면 각각을 새로 만든 변수로 교체한다. 허나 교체할 때마다 테스트한다.

예시


before

function price(order) {
  //price = 기본가격 - 수량할인 + 배송비
  return order.quantity
    * order.itemPrice - 
    Math.max(0, order.quantity - 500) * order.itemPrice * 0.05 +
    Math.min(order.quantity * order. itemPrice * 0.1, 100);

after

function price(order) {
    const basePrice = order.quantity * order.itemPrice;
    const quantityDiscount = Math.max(0, order.quantity - 500) * order.itemPrice * 0.05;
    const shipping =  Math.min(order.quantity * order. itemPrice * 0.1, 100);
    return basePrice - quantityDiscount + shipping;
}

참조


마틴 파울러 저 리팩터링 2판

0개의 댓글