From 8deb56f9f764d462d6ca20628bbf5096ce25c0d5 Mon Sep 17 00:00:00 2001 From: Stanislav Nowogrudski Date: Tue, 18 Apr 2017 22:49:51 +0200 Subject: [PATCH] some simplifications and code cleanup --- README.md | 4 ++- pom.xml | 13 ++++++--- src/main/java/de/dj_steam/CheckOut.java | 24 ++++++++++------- src/main/java/de/dj_steam/PriceContext.java | 10 +++---- .../java/de/dj_steam/strategy/AStrategy.java | 7 +++-- .../strategy/AbstractPricingStrategy.java | 27 ------------------- .../java/de/dj_steam/strategy/BStrategy.java | 7 +++-- .../java/de/dj_steam/strategy/CStrategy.java | 7 +++-- .../java/de/dj_steam/strategy/DStrategy.java | 7 +++-- .../de/dj_steam/strategy/PriceCalculator.java | 8 ++++++ .../de/dj_steam/strategy/PricingStrategy.java | 24 +++++++++++++++-- 11 files changed, 73 insertions(+), 65 deletions(-) delete mode 100755 src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java create mode 100755 src/main/java/de/dj_steam/strategy/PriceCalculator.java diff --git a/README.md b/README.md index 45bc0a9..3f14d16 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# supermarket \ No newline at end of file +# supermarket + +this is one of my solutions for ["Back to the checkout code cata"](http://codekata.com/kata/kata09-back-to-the-checkout/) diff --git a/pom.xml b/pom.xml index 317ed20..e80366b 100755 --- a/pom.xml +++ b/pom.xml @@ -13,19 +13,24 @@ org.apache.maven.plugins maven-compiler-plugin - 3.2 + 3.6.1 - 1.7 - 1.7 + 1.8 + 1.8 + + org.apache.commons + commons-text + 1.0 + junit junit - 4.11 + 4.12 test diff --git a/src/main/java/de/dj_steam/CheckOut.java b/src/main/java/de/dj_steam/CheckOut.java index f32f428..d369024 100755 --- a/src/main/java/de/dj_steam/CheckOut.java +++ b/src/main/java/de/dj_steam/CheckOut.java @@ -1,6 +1,10 @@ package de.dj_steam; -import de.dj_steam.strategy.*; +import de.dj_steam.strategy.AStrategy; +import de.dj_steam.strategy.BStrategy; +import de.dj_steam.strategy.CStrategy; +import de.dj_steam.strategy.DStrategy; +import de.dj_steam.strategy.PriceCalculator; import java.util.ArrayList; import java.util.List; @@ -8,12 +12,12 @@ import java.util.List; /** * Created by steam on 24.02.15. */ -public class CheckOut { +class CheckOut { private String bucket = ""; - private List strategies; + private List strategies; - public CheckOut(){ + CheckOut() { initPriceStrategies(); } @@ -28,28 +32,28 @@ public class CheckOut { strategies.add(new DStrategy()); } - public int scan(char product){ + int scan(char product) { putIntoBucket(product); return updateTotalPrice(); } - public int calculatePriceForBucket(String products){ + int calculatePriceForBucket(String products) { int total = 0; this.bucket = products; PriceContext context = new PriceContext(); - for(PricingStrategy strategy : strategies){ + for (PriceCalculator strategy : strategies) { context.setStrategy(strategy, bucket); total += context.calculatePriceForProduct(); } return total; } - private void putIntoBucket(char product){ + private void putIntoBucket(char product) { bucket += product; } - private int updateTotalPrice(){ - return calculatePriceForBucket(bucket); + private int updateTotalPrice() { + return calculatePriceForBucket(bucket); } } diff --git a/src/main/java/de/dj_steam/PriceContext.java b/src/main/java/de/dj_steam/PriceContext.java index d115a56..f095408 100755 --- a/src/main/java/de/dj_steam/PriceContext.java +++ b/src/main/java/de/dj_steam/PriceContext.java @@ -1,20 +1,20 @@ package de.dj_steam; -import de.dj_steam.strategy.PricingStrategy; +import de.dj_steam.strategy.PriceCalculator; /** * Created by steam on 24.02.15. */ -public class PriceContext { - private PricingStrategy strategy = null; +class PriceContext { + private PriceCalculator strategy = null; private String bucket = ""; - public void setStrategy(final PricingStrategy strategy, String bucket){ + void setStrategy(final PriceCalculator strategy, final String bucket){ this.strategy = strategy; this.bucket = bucket; } - public int calculatePriceForProduct() { + int calculatePriceForProduct() { if (strategy != null){ return strategy.calculatePrice(bucket); } diff --git a/src/main/java/de/dj_steam/strategy/AStrategy.java b/src/main/java/de/dj_steam/strategy/AStrategy.java index d50f2ed..d2f0e70 100755 --- a/src/main/java/de/dj_steam/strategy/AStrategy.java +++ b/src/main/java/de/dj_steam/strategy/AStrategy.java @@ -3,7 +3,7 @@ package de.dj_steam.strategy; /** * Created by steam on 24.02.15. */ -public class AStrategy extends AbstractPricingStrategy implements PricingStrategy { +public class AStrategy extends PricingStrategy implements PriceCalculator { private static final char PRODUCT_ID = 'A'; private static final int PRICE = 50; @@ -12,9 +12,8 @@ public class AStrategy extends AbstractPricingStrategy implements PricingStrateg @Override - public int calculatePrice(String products) { - int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID); - return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT); + public int calculatePrice(final String bucket) { + return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT); } } diff --git a/src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java b/src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java deleted file mode 100755 index af2e59c..0000000 --- a/src/main/java/de/dj_steam/strategy/AbstractPricingStrategy.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.dj_steam.strategy; - -/** - * Created by steam on 24.02.15. - */ -public class AbstractPricingStrategy { - - protected int calculateNumberOfProductsForType(String products, char product) { - int numberOfProducts = 0; - for (int i = 0; i < products.length(); i++) { - if (products.charAt(i) == product) { - numberOfProducts++; - } - } - return numberOfProducts; - } - - protected int calculatePriceForAllProducts(int numberOfProducts, int price, int priceThreshold, int discount) { - if (priceThreshold > 0) { - int remainder = numberOfProducts % priceThreshold; - int triples = numberOfProducts / priceThreshold; - return (triples * discount) + (remainder * price); - } else { - return numberOfProducts * price; - } - } -} diff --git a/src/main/java/de/dj_steam/strategy/BStrategy.java b/src/main/java/de/dj_steam/strategy/BStrategy.java index 7cfd0bc..4294eb7 100755 --- a/src/main/java/de/dj_steam/strategy/BStrategy.java +++ b/src/main/java/de/dj_steam/strategy/BStrategy.java @@ -3,7 +3,7 @@ package de.dj_steam.strategy; /** * Created by steam on 24.02.15. */ -public class BStrategy extends AbstractPricingStrategy implements PricingStrategy { +public class BStrategy extends PricingStrategy implements PriceCalculator{ private static final char PRODUCT_ID = 'B'; private static final int PRICE = 30; @@ -11,8 +11,7 @@ public class BStrategy extends AbstractPricingStrategy implements PricingStrateg private static final int DISCOUNT = 45; @Override - public int calculatePrice(String products) { - int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID); - return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT); + public int calculatePrice(final String bucket) { + return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT); } } diff --git a/src/main/java/de/dj_steam/strategy/CStrategy.java b/src/main/java/de/dj_steam/strategy/CStrategy.java index a602eeb..acacdec 100755 --- a/src/main/java/de/dj_steam/strategy/CStrategy.java +++ b/src/main/java/de/dj_steam/strategy/CStrategy.java @@ -3,7 +3,7 @@ package de.dj_steam.strategy; /** * Created by steam on 24.02.15. */ -public class CStrategy extends AbstractPricingStrategy implements PricingStrategy { +public class CStrategy extends PricingStrategy implements PriceCalculator { private static final char PRODUCT_ID = 'C'; private static final int PRICE = 20; @@ -12,8 +12,7 @@ public class CStrategy extends AbstractPricingStrategy implements PricingStrateg @Override - public int calculatePrice(String products) { - int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID); - return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT); + public int calculatePrice(final String bucket) { + return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT); } } diff --git a/src/main/java/de/dj_steam/strategy/DStrategy.java b/src/main/java/de/dj_steam/strategy/DStrategy.java index a7cb558..0f3cc0f 100755 --- a/src/main/java/de/dj_steam/strategy/DStrategy.java +++ b/src/main/java/de/dj_steam/strategy/DStrategy.java @@ -3,7 +3,7 @@ package de.dj_steam.strategy; /** * Created by steam on 24.02.15. */ -public class DStrategy extends AbstractPricingStrategy implements PricingStrategy { +public class DStrategy extends PricingStrategy implements PriceCalculator { private static final char PRODUCT_ID = 'D'; private static final int PRICE = 15; @@ -11,8 +11,7 @@ public class DStrategy extends AbstractPricingStrategy implements PricingStrateg private static final int DISCOUNT = 0; @Override - public int calculatePrice(String products) { - int productsNumber = calculateNumberOfProductsForType(products, PRODUCT_ID); - return calculatePriceForAllProducts(productsNumber, PRICE, PRICE_THRESHOLD, DISCOUNT); + public int calculatePrice(final String bucket) { + return calculatePriceForGivenProduct(bucket, PRODUCT_ID, PRICE, PRICE_THRESHOLD, DISCOUNT); } } diff --git a/src/main/java/de/dj_steam/strategy/PriceCalculator.java b/src/main/java/de/dj_steam/strategy/PriceCalculator.java new file mode 100755 index 0000000..a0a3e28 --- /dev/null +++ b/src/main/java/de/dj_steam/strategy/PriceCalculator.java @@ -0,0 +1,8 @@ +package de.dj_steam.strategy; + +/** + * Created by steam on 24.02.15. + */ +public interface PriceCalculator { + int calculatePrice(String bucket); +} diff --git a/src/main/java/de/dj_steam/strategy/PricingStrategy.java b/src/main/java/de/dj_steam/strategy/PricingStrategy.java index a8848ca..4e21c6b 100755 --- a/src/main/java/de/dj_steam/strategy/PricingStrategy.java +++ b/src/main/java/de/dj_steam/strategy/PricingStrategy.java @@ -1,8 +1,28 @@ package de.dj_steam.strategy; +import org.apache.commons.lang3.StringUtils; + /** * Created by steam on 24.02.15. */ -public interface PricingStrategy { - public int calculatePrice(String products); +class PricingStrategy { + + int calculatePriceForGivenProduct( final String bucket, final char productId, final int productPrice, final int priceThreshold, final int discount){ + int productsNumber = calculateNumberOfProductsForType(bucket, productId); + return calculatePriceForAllProducts(productsNumber, productPrice, priceThreshold, discount); + } + + private int calculateNumberOfProductsForType(final String products, final char product) { + return StringUtils.countMatches(products, product); + } + + private int calculatePriceForAllProducts(final int numberOfProducts, final int price, final int priceThreshold, final int discount) { + if (priceThreshold > 0) { + int remainder = numberOfProducts % priceThreshold; + int triples = numberOfProducts / priceThreshold; + return (triples * discount) + (remainder * price); + } else { + return numberOfProducts * price; + } + } }