Java 如何使用 TDD 方法为简单的购物车示例设计类?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26162017/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to design the classes for a simple shopping cart example using TDD approach?
提问by Ano
I came across a shopping cart exercise to learn OOAD and TDD using Java.
我遇到了一个使用 Java 学习 OOAD 和 TDD 的购物车练习。
The exercise is:
练习是:
First Step: Design a checkout system
第一步:设计一个结账系统
- Build a checkout system for a shop which sells 3 products say Bread, Milk, and Bananas.
- Costs of the products are : Bread - $1, Milk - $0.60 and Banana - $0.40
- Build a system to checkout a shopping cart that can have multiples of these 3 products and displays the order total. Examples are: Bread, Milk, Banana = $2.00 Bread, Bread, Milk, Banana = $3.00 Milk, Banana, Milk, Banana = $2.00
- 为一家销售面包、牛奶和香蕉等 3 种产品的商店构建一个结账系统。
- 产品的成本是:面包 - 1 美元,牛奶 - 0.60 美元和香蕉 - 0.40 美元
- 构建一个系统来结帐可以包含这 3 种产品的倍数的购物车并显示订单总数。例如:面包、牛奶、香蕉 = $2.00 面包、面包、牛奶、香蕉 = $3.00 牛奶、香蕉、牛奶、香蕉 = $2.00
As a next step: enhance the code to apply the below discounts and offers
下一步:增强代码以应用以下折扣和优惠
Buy one bread and get another bread for free Buy 3 Milk for the price of 2 Buy 2 Bananas and get one free
买一个面包,再送一个面包 以 2 个的价格买 3 个牛奶 买 2 个香蕉,送一个
First build a simplest solution to satisfy the first case alone. Then re-factor the code to extend it for 2nd step.
首先构建一个最简单的解决方案来单独满足第一种情况。然后重构代码以将其扩展到第二步。
The first step seems to be easy but when it comes to the second step, applying the proper OOAD principles and design patterns is challenging.
I took a look at couple of related questions like
this one.
But it did not help much.
Appreciate any suggestions on how to go ahead.
第一步似乎很容易,但是当涉及到第二步时,应用正确的 OOAD 原则和设计模式是具有挑战性的。我看了几个像
这样的相关问题。但这并没有多大帮助。感谢有关如何继续的任何建议。
The code I could come up for the first step is :
我可以为第一步提出的代码是:
ShoppingCartTest.java :
public class ShoppingCartTest { ShoppingCart cart; @Before public void setUp(){ cart = new ShoppingCart(); } @Test public void addOneItemToCart() { cart.add("Bread"); assertThat(cart.getTotalItems(), is(1)); assertThat(cart.doesContain("Bread"), is(true)); } @Test public void addTwoItemsToCart(){ cart.add("Bread"); cart.add("Milk"); assertThat(cart.getTotalItems(), is(2)); assertTrue(cart.doesContain("Bread")); assertTrue(cart.doesContain("Milk")); } @Test public void addThreeItemsToCart(){ cart.add("Bread"); cart.add("Milk"); cart.add("Banana"); assertThat(cart.getTotalItems(), is(3)); assertTrue(cart.doesContain("Bread")); assertTrue(cart.doesContain("Milk")); assertTrue(cart.doesContain("Banana")); } @Test public void addAnItemTwice(){ cart.add("Bread"); cart.add("Bread"); assertThat(cart.getTotalItems(), is(2)); } @Test public void checkOutOneItem(){ cart.add("Bread"); assertThat(cart.checkout(), is(1.0)); } @Test public void checkoutTwoSeparateItems(){ cart.add("Bread"); cart.add("Milk"); assertThat(cart.checkout(), is(1.60)); } @Test public void checkoutThreeSeparateItems(){ cart.add("Bread"); cart.add("Milk"); cart.add("Banana"); assertThat(cart.checkout(), is(2.0)); } @Test public void checkoutTwoSameItems(){ cart.add("Bread"); cart.add("Bread"); assertThat(cart.checkout(), is(2.0)); } @Test public void checkoutThreeItems(){ cart.add("Bread"); cart.add("Bread"); cart.add("Milk"); assertThat(cart.checkout(), is(2.6)); } @Test public void checkoutManyItems(){ cart.add("Bread"); cart.add("Bread"); cart.add("Milk"); cart.add("Milk"); cart.add("Banana"); assertThat(cart.checkout(), is(3.60)); } @Test public void checkOutAnInvalidItem(){ cart.add("InvalidItem"); assertThat(cart.checkout(),is(0.0)); }}
ShoppingCartTest.java :
public class ShoppingCartTest { ShoppingCart cart; @Before public void setUp(){ cart = new ShoppingCart(); } @Test public void addOneItemToCart() { cart.add("Bread"); assertThat(cart.getTotalItems(), is(1)); assertThat(cart.doesContain("Bread"), is(true)); } @Test public void addTwoItemsToCart(){ cart.add("Bread"); cart.add("Milk"); assertThat(cart.getTotalItems(), is(2)); assertTrue(cart.doesContain("Bread")); assertTrue(cart.doesContain("Milk")); } @Test public void addThreeItemsToCart(){ cart.add("Bread"); cart.add("Milk"); cart.add("Banana"); assertThat(cart.getTotalItems(), is(3)); assertTrue(cart.doesContain("Bread")); assertTrue(cart.doesContain("Milk")); assertTrue(cart.doesContain("Banana")); } @Test public void addAnItemTwice(){ cart.add("Bread"); cart.add("Bread"); assertThat(cart.getTotalItems(), is(2)); } @Test public void checkOutOneItem(){ cart.add("Bread"); assertThat(cart.checkout(), is(1.0)); } @Test public void checkoutTwoSeparateItems(){ cart.add("Bread"); cart.add("Milk"); assertThat(cart.checkout(), is(1.60)); } @Test public void checkoutThreeSeparateItems(){ cart.add("Bread"); cart.add("Milk"); cart.add("Banana"); assertThat(cart.checkout(), is(2.0)); } @Test public void checkoutTwoSameItems(){ cart.add("Bread"); cart.add("Bread"); assertThat(cart.checkout(), is(2.0)); } @Test public void checkoutThreeItems(){ cart.add("Bread"); cart.add("Bread"); cart.add("Milk"); assertThat(cart.checkout(), is(2.6)); } @Test public void checkoutManyItems(){ cart.add("Bread"); cart.add("Bread"); cart.add("Milk"); cart.add("Milk"); cart.add("Banana"); assertThat(cart.checkout(), is(3.60)); } @Test public void checkOutAnInvalidItem(){ cart.add("InvalidItem"); assertThat(cart.checkout(),is(0.0)); }}
Shopping Cart.java:
购物车.java:
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
List<String> items;
public ShoppingCart(){
items = new ArrayList<String>();
}
public void add(String item) {
items.add(item);
}
public int getTotalItems() {
return items.size();
}
public Boolean doesContain(String itemName) {
return items.contains(itemName);
}
public Double checkout() {
double total = 0;
for(String item: items){
if(item.equals("Bread")){
total += 1;
}else if(item.equals("Milk")){
total += 0.6;
}else if(item.equals("Banana")){
total += 0.4;
}
}
return total;
}
}
回答by user1540256
Instead, you can simple Implement shopping cart process as the HashMap in java
相反,您可以简单地将购物车流程作为 java 中的 HashMap 实现
it will be of the form :
它将采用以下形式:
Map<String === itemname , Item === Item object>
Map<String, Item> cart = new HashMap<String, Item>();
Class Item{
private int count;
private String Name;
private int prices;
//getters and setters go here
}