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。 但它沒有多大幫助。 感謝有關如何繼續前進的任何建議。
的代碼我能想出的第一個步驟是:
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;
}
}
有這樣做的太多的方法。正如問題中提到的 - 你的第二步將是重構你的第一步。因此,如果我們知道如何實施第一步,縮小範圍就會容易得多。 TDD的一般方法是首先編寫代碼(測試)來調用給定的功能(顯然會失敗),然後修改應用程序代碼以確保測試通過。 – 2014-10-02 14:08:03
@GurusharanS同意你的意見。我將開發代碼的第一部分,並儘快分享。 – Ano 2014-10-02 21:35:39
@GurusharanS,我創建了一個類似的https:// github。com/vksvicky/ShoppingCart – Vivek 2014-10-13 11:34:48