2014-10-02 28 views
1

我遇到了購物車練習,使用Java學習OOAD和TDD。如何使用TDD方法設計簡單購物車示例的類?

的運動是:


第一步:設計一個結算系統

  • 構建結賬系統主要銷售3種產品說麪包,牛奶和香蕉的一家店。
  • 成本的產品是:麪包 - $ 1,牛奶 - $ 0.60和香蕉 - $ 0.40
  • 建立一個系統來結帳可以有這3種產品的倍數的購物車,並顯示訂單總額。 實例是: 麪包,牛奶,香蕉= $ 2.00 麪包,麪包,牛奶,香蕉= $ 3.00 牛奶,香蕉,牛奶,香蕉= $ 2.00

作爲下一步驟:增強代碼申請下面的折扣和優惠

購買一個麪包和再弄麪包免費 購買3奶2 買2個香蕉的價格和贈一

首先建立以SAT考試簡單的解決方案僅僅是第一種情況。然後重新分解代碼以將其擴展到第二步。


第一步似乎很簡單,但是當涉及到第二步時,應用適當的OOAD原則和設計模式是具有挑戰性的。 我看了幾個相關的問題,如
this one。 但它沒有多大幫助。 感謝有關如何繼續前進的任何建議。

的代碼我能想出的第一個步驟是:

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

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

} 
+0

有這樣做的太多的方法。正如問題中提到的 - 你的第二步將是重構你的第一步。因此,如果我們知道如何實施第一步,縮小範圍就會容易得多。 TDD的一般方法是首先編寫代碼(測試)來調用給定的功能(顯然會失敗),然後修改應用程序代碼以確保測試通過。 – 2014-10-02 14:08:03

+0

@GurusharanS同意你的意見。我將開發代碼的第一部分,並儘快分享。 – Ano 2014-10-02 21:35:39

+0

@GurusharanS,我創建了一個類似的https:// github。com/vksvicky/ShoppingCart – Vivek 2014-10-13 11:34:48

回答

1

相反,你可以簡單的實施購物車程序爲哈shMap在Java

它會是這樣的形式:

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 
}