From b807790cd196d8ed4cab5915ba8d0cad44132b5e Mon Sep 17 00:00:00 2001 From: haerong22 Date: Tue, 15 Mar 2022 11:36:42 +0900 Subject: [PATCH] refactoring : divergent change - split phase --- .../_24_split_phase/PriceData.java | 4 ++ .../_24_split_phase/PriceOrder.java | 25 ++++++++++++ .../_24_split_phase/Product.java | 5 +++ .../_24_split_phase/ShippingMethod.java | 4 ++ .../_24_split_phase/_before/PriceOrder.java | 15 +++++++ .../_24_split_phase/_before/Product.java | 5 +++ .../_before/ShippingMethod.java | 4 ++ .../_24_split_phase/PriceOrderTest.java | 40 +++++++++++++++++++ 8 files changed, 102 insertions(+) create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceData.java create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrder.java create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/Product.java create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/ShippingMethod.java create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/PriceOrder.java create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/Product.java create mode 100644 refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/ShippingMethod.java create mode 100644 refactoring/src/test/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrderTest.java diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceData.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceData.java new file mode 100644 index 00000000..4f05e0b0 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceData.java @@ -0,0 +1,4 @@ +package com.example.refactoring._07_divergent_change._24_split_phase; + +public record PriceData(double basePrice, double discount, int quantity) { +} diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrder.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrder.java new file mode 100644 index 00000000..abece070 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrder.java @@ -0,0 +1,25 @@ +package com.example.refactoring._07_divergent_change._24_split_phase; + +public class PriceOrder { + + public double priceOrder(Product product, int quantity, ShippingMethod shippingMethod) { + final PriceData priceData = calculatePriceData(product, quantity); + + return applyShipping(priceData, shippingMethod); + } + + private PriceData calculatePriceData(Product product, int quantity) { + final double basePrice = product.basePrice() * quantity; + final double discount = Math.max(quantity - product.discountThreshold(), 0) + * product.basePrice() * product.discountRate(); + + return new PriceData(basePrice, discount, quantity); + } + + private double applyShipping(PriceData priceData, ShippingMethod shippingMethod) { + final double shippingPerCase = (priceData.basePrice() > shippingMethod.discountThreshold()) ? + shippingMethod.discountedFee() : shippingMethod.feePerCase(); + final double shippingCost = priceData.quantity() * shippingPerCase; + return priceData.basePrice() - priceData.discount() + shippingCost; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/Product.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/Product.java new file mode 100644 index 00000000..971c6596 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/Product.java @@ -0,0 +1,5 @@ +package com.example.refactoring._07_divergent_change._24_split_phase; + +public record Product(double basePrice, double discountThreshold, double discountRate) { + +} diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/ShippingMethod.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/ShippingMethod.java new file mode 100644 index 00000000..e24129aa --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/ShippingMethod.java @@ -0,0 +1,4 @@ +package com.example.refactoring._07_divergent_change._24_split_phase; + +public record ShippingMethod(double discountThreshold, double discountedFee, double feePerCase) { +} \ No newline at end of file diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/PriceOrder.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/PriceOrder.java new file mode 100644 index 00000000..61229927 --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/PriceOrder.java @@ -0,0 +1,15 @@ +package com.example.refactoring._07_divergent_change._24_split_phase._before; + +public class PriceOrder { + + public double priceOrder(Product product, int quantity, ShippingMethod shippingMethod) { + final double basePrice = product.basePrice() * quantity; + final double discount = Math.max(quantity - product.discountThreshold(), 0) + * product.basePrice() * product.discountRate(); + final double shippingPerCase = (basePrice > shippingMethod.discountThreshold()) ? + shippingMethod.discountedFee() : shippingMethod.feePerCase(); + final double shippingCost = quantity * shippingPerCase; + final double price = basePrice - discount + shippingCost; + return price; + } +} diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/Product.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/Product.java new file mode 100644 index 00000000..14cea22e --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/Product.java @@ -0,0 +1,5 @@ +package com.example.refactoring._07_divergent_change._24_split_phase._before; + +public record Product(double basePrice, double discountThreshold, double discountRate) { + +} diff --git a/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/ShippingMethod.java b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/ShippingMethod.java new file mode 100644 index 00000000..d16331ff --- /dev/null +++ b/refactoring/src/main/java/com/example/refactoring/_07_divergent_change/_24_split_phase/_before/ShippingMethod.java @@ -0,0 +1,4 @@ +package com.example.refactoring._07_divergent_change._24_split_phase._before; + +public record ShippingMethod(double discountThreshold, double discountedFee, double feePerCase) { +} \ No newline at end of file diff --git a/refactoring/src/test/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrderTest.java b/refactoring/src/test/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrderTest.java new file mode 100644 index 00000000..8ca898da --- /dev/null +++ b/refactoring/src/test/java/com/example/refactoring/_07_divergent_change/_24_split_phase/PriceOrderTest.java @@ -0,0 +1,40 @@ +package com.example.refactoring._07_divergent_change._24_split_phase; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PriceOrderTest { + + @Test + void priceOrder_discountedFee() { + PriceOrder priceOrder = new PriceOrder(); + double price = priceOrder.priceOrder(new Product(10, 2, 0.5), + 4, + new ShippingMethod(20, 1, 5)); + + // basePrice = 10 * 4 = 40 + // discount = 2 * 10 * 0.5 = 10 + // shippingPerCase = 1 (40 > 20) + // shippingCost = 4 * 1 = 4 + // price = 40 - 10 + 4 = 34 + + assertEquals(34, price); + } + + @Test + void priceOrder_feePerCase() { + PriceOrder priceOrder = new PriceOrder(); + double price = priceOrder.priceOrder(new Product(10, 2, 0.5), + 2, + new ShippingMethod(20, 1, 5)); + + // basePrice = 10 * 2 = 20 + // discount = 0 * 10 * 0.5 = 0 + // shippingPerCase = 5 + // shippingCost = 2 * 5 = 10 + // price = 20 - 0 + 10 = 30 + + assertEquals(30, price); + } +} \ No newline at end of file