繁体   English   中英

如何使用TDD方法为简单的购物车示例设计类?

[英]How to design the classes for a simple shopping cart example using TDD approach?

我遇到了一个购物车练习,以使用Java学习OOAD和TDD。

练习是:


第一步 :设计一个结帐系统

  • 为一家销售3种产品的商店建立结帐系统,例如面包,牛奶和香蕉。
  • 产品的成本是:面包-$ 1,牛奶-$ 0.60,香蕉-$ 0.40
  • 构建一个系统来结帐一个购物车,该购物车可以具有这3个产品的倍数并显示订单总额。 例如:面包,牛奶,香蕉= $ 2.00面包,面包,牛奶,香蕉= $ 3.00牛奶,香蕉,牛奶,香蕉= $ 2.00

下一步 :增强代码以应用以下折扣和优惠

买一个面包免费获得另一只面包以2的价格购买3牛奶买2香蕉免费获得

首先建立一个最简单的解决方案,以单独满足第一种情况。 然后重构代码以将其扩展到第二步。


第一步似乎很容易,但是当涉及到第二步时,应用适当的OOAD原理和设计模式将具有挑战性。 我看了几个相关的问题,例如
这个 但这并没有太大帮助。 感谢有关如何进行的任何建议。

我可以为第一步准备的代码是:

  1. 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:

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;
}   

}

相反,您可以在Java中将HashMap轻松实现为购物车过程

它的形式为:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM