개요
관련된 코드들이 가까이 뭉쳐 있으면 이해하기 쉽다.
관련 코드끼리 모으는 작업은 다른 리팩터링의 준비 단계로 자주 행해진다.
취향 차이지만 함수 속 모든 변수를 첫 머리에 모으는 사람도 있는데 사용하는 근처에 선언하는 것도 나쁘진 않다.
예시
코드 슬라이드 할 때 두 가지를 고려
무엇을 슬라이드할지, 슬라이드 가능한지
무엇을 슬라이드할지는 맥락과 관련 있다.
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; } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
08 - 기능이동 - 죽은 코드 제거하기 (0) | 2023.08.13 |
---|---|
08 - 기능이동 - 반복문 쪼개기 (0) | 2023.08.10 |
08 - 기능이동 - 인라인 코드를 함수 호출로 바꾸기 (0) | 2023.08.07 |
08 - 기능이동 - 문장을 호출한 곳으로 옮기기 (0) | 2023.08.06 |
08 - 기능이동 - 문장을 함수로 옮기기 (0) | 2023.08.05 |