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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 01:55:56  来源:igfitidea点击:

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

javadesign-patternstddooad

提问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 :

我可以为第一步提出的代码是:

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

购物车.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
}