상세 컨텐츠

본문 제목

6.11. 단계 쪼개기 (Split Phase)

🍜개발자라면/책을 읽자✍

by :Eundms 2021. 9. 26. 19:04

본문

- 동작을 연이은 두 단계로 쪼갠다.

- 컴파일러 처럼

// orderString = "-상품번호 수량" 
const orderData = orderString.split(/\s+/);

// orderData = ["-상품번호","수량"] 
// priceList = { 상품번호 : 상품금액 } 
const productPrice = priceList[orderData[0].split("-")[1]]; 

// 상품 가격 
const orderPrice = parseInt(orderData[1])*productPrice; 

// 주문가 = 상품 가격*수량 
// 변경후 
const orderRecord = parseOrder(order); 
const orderPrice = price(orderRecord,priceList); 

//주문가 
function parseOrder(aString){// 주문 데이터 전처리 
    const values = aString.split(/\s+/); 
    return ({ productId: values[0].split("-")[1], quantity: parseInt(values[1]), }); 
} 
function price(order,priceList){ 
    return order.quantity*priceList[order.productId]; 
}

 


방법

1. 두 번째 단계에 해당하는 코드를 독립 함수로 추출한다.
2. 테스트한다.
3. 중간 데이터 구조를 만들어서 앞에서 추출한 함수의 인수로 추가한다.
4. 테스트 한다.
5. 추출한 두번째 단계 함수의 매개변수를 하나씩 검토한다. 그 중 첫 번째 단계에서 사용되는 것은 중간 데이터 구조로 옮긴다. 하나씩 옮길 때마다 테스트한다.
6. 첫 번째 단계 코드를 함수로 추출하면서 중간 데이터 구조를 반환하도록 만든다.


단계 쪼개기 - 연이은 두 단계

상품의 결제 금액 계산
1. 상품 가격 계산 : 데이터 - 상품정보
2. 배송비 계산 : 데이터 - 배송정보
// 변경 전 
function priceOrder(product, quantity, shippingMethod){ 
    // 1. 상품 가격 계산 
    const basePrice = product.basePrice*quantity;
    const discount = Math.max(quantity-product.discountThreshold,0)
    *product.basePrice*product.discountRate; 

    // 2. 배송비 계산 
    const shippingPerCase = (basePrice>shippingMethod.discountThreshold) 
        ?shippingMethod.discountedFee:shippingMethod.feePerCase; 
    const shippingCost = quantity*shippingPerCase; 
    const price = basePrice-discount + shippingCost; 
    return price; 
}

함수로 추출한다.

// 두번째 계산 부분을 함수로 추출한다. 
function priceOrder(product, quantity, shippingMethod){ 
    // 1. 상품 가격 계산 
    const basePrice = product.basePrice*quantity; 
    const discount = Math.max(quantity-product.discountThreshold,0)
                     *product.basePrice*product.discountRate; 
    // 2. 배송비 계산 
    const price = applyShipping(basePrice,shippingMethod,quantity,discount);
    return price; 
} 
function applyShipping(basePrice, shippingMethod, quantity, discount){ 
    const shippingPerCase = (basePrice>shippingMethod.discountThreshold) 
    ?shippingMethod.discountedFee:shippingMethod.feePerCase; 
    const shippingCost = quantity*shippingPerCase;
    const price = basePrice-discount + shippingCost; 
    return price; 
}


중간데이터 구조를 만든다.

function priceOrder(product, quantity, shippingMethod){ 
    const basePrice = product.basePrice*quantity; 
    const discount = Math.max(quantity-product.discountThreshold,0)
           *product.basePrice*product.discountRate; 
    
    // 중간 데이터 구조 
    const priceData = {basePrice:basePrice, quantity:quantity, discount:discount}; 
    
    const price = applyShipping(priceData,shippingMethod); 
    return price; 
} 

function applyShipping(priceData, shippingMethod){ 
    const shippingPerCase = (priceData.basePrice>shippingMethod.discountThreshold) 
          ?shippingMethod.discountedFee:shippingMethod.feePerCase; 
    const shippingCost = priceData.quantity*shippingPerCase; 
    const price = priceData.basePrice-priceData.discount + shippingCost; 
    return price; 
}

첫번째 함수로 추출한다. 그리고 그 함수의 리턴값이 중간 데이터 형식을 띄게 한다.

function priceOrder(product, quantity, shippingMethod){ 
    const priceData = calculatePricingData(product,quantity); 
    return applyShipping(priceData,shippingMethod); 
} 

function calculatePricingData(product,quantity){ 
    const basePrice = product.basePrice*quantity; 
    const discount = Math.max(quantity-product.discountThreshold,0)
    *product.basePrice*product.discountRate; 
    return {basePrice:basePrice, quantity:quantity, discount:discount}; 
} 

function applyShipping(priceData, shippingMethod){ 
    const shippingPerCase = (priceData.basePrice>shippingMethod.discountThreshold) 
                          ?shippingMethod.discountedFee:shippingMethod.feePerCase; 
    const shippingCost = priceData.quantity*shippingPerCase; 
    const price = priceData.basePrice-priceData.discount + shippingCost; 
    return price; 
}

 

관련글 더보기

댓글 영역