개요

관련된 코드들이 가까이 뭉쳐 있으면 이해하기 쉽다.

관련 코드끼리 모으는 작업은 다른 리팩터링의 준비 단계로 자주 행해진다.

취향 차이지만 함수 모든 변수를 머리에 모으는 사람도 있는데 사용하는 근처에 선언하는 것도 나쁘진 않다.

 

예시

코드 슬라이드 가지를 고려

무엇을 슬라이드할지, 슬라이드 가능한지

무엇을 슬라이드할지는 맥락과 관련 있다.

 

const pricingPlan = retrievePricingPlan();
const order = retreiveOrder();
const baseCharge = pricingPlan.base;
let charge;
const chargePerUnit = pricingPlan.unit;
const units = order.units;
let discount;
charge = baseCharge + units * chargePerUnit;
let discountableUnits = Math.max(units - princingPlan * discountThreshold, 0);
discount = discountableUnits * pricingPlan.discountFactor;
if(order.isRepeat) discount += 20;
charge = charge - discount;
chargeOrder(charge);


//사이드 이펙트가 없는 코드끼리는 마음대로 재배치 할 수 있다.
//부수효과가 없는 프로그래밍을 하는 이유
const pricingPlan = retrievePricingPlan();
const baseCharge = pricingPlan.base;
let charge;
const chargePerUnit = pricingPlan.unit;
const order = retreiveOrder(); // 바로 근처로 옮김
const units = order.units;
charge = baseCharge + units * chargePerUnit;
let discountableUnits = Math.max(units - princingPlan * discountThreshold, 0);
let discount; //바로 근처로 옮김
discount = discountableUnits * pricingPlan.discountFactor;
if(order.isRepeat) discount += 20;
charge = charge - discount;
chargeOrder(charge);
retrieveOrder() 내부를 확인해야 부수효과가 있는지 확인할 있는데 여기선 자기가 작성한 함수고 명령-질의 분리 원칙을 지키고 있다고 가정하고 있다.
만약 남이 작성한 코드라면 살펴봐야한다.


const pricingPlan = retrievePricingPlan();
const baseCharge = pricingPlan.base;
let charge;
const chargePerUnit = pricingPlan.unit;
const order = retreiveOrder();
const units = order.units;
charge = baseCharge + units * chargePerUnit;
let discountableUnits = Math.max(units - princingPlan * discountThreshold, 0);
let discount;
discount = discountableUnits * pricingPlan.discountFactor;
if(order.isRepeat) discount += 20; //이 줄은 맨끝으로 슬라이드하고 싶어도 참조하는 라인이 있어 막힌다.
charge = charge - discount;
chargeOrder(charge);

 

 

예시:조건문이 있을 때의 슬라이드

 



function example(){
    let result;
    if(availableResources.length === 0){
        result = createResource();
        allocatedResources.push(result);
    }else{
        result = availableResources.pop();
        allocatedResources.push(result);
    }
    return result;
}


function example(){
    let result;
    if(availableResources.length === 0){
        result = createResource();
    }else{
        result = availableResources.pop();
    }
    allocatedResources.push(result);
    return result;
}

 

+ Recent posts