Zum Entwurf der Klassen für eine einfache shopping cart-Beispiel mit TDD-Ansatz?

Stieß ich auf einen Einkaufswagen übung, um zu lernen, OOAD und TDD mit Java.

Ist die übung:


Ersten Schritt: Design-ein checkout-system

  • Bauen, ein checkout-system für ein Geschäft, das verkauft 3 Produkte sagen Brot, Milch und Bananen.
  • Kosten für die Produkte sind : Brot - $1, Milch - $0.60-und Banana - $0.40
  • Aufbau eines Systems zur Kasse, ein Einkaufswagen, können ein Vielfaches dieser 3 Produkte und zeigt die Gesamtsumme der Bestellungen.
    Beispiele sind:
    Brot, Milch, Banane = $2.00
    Brot, Brot, Milch, Banane = $3.00
    Milch, Banane, Milch, Banane = $2.00

Als nächsten Schritt: Verbesserung der code gelten die nachstehenden Rabatte und Angebote

Kaufen ein Brot und einen anderen bekommen Brot für freie
Kaufen 3-Milch für den Preis von 2
Kaufen Sie 2 Bananen und erhalten Sie eine gratis

Zunächst erstellen Sie eine einfache Lösung zur Befriedigung der erste Fall allein. Dann re-Faktor, den code zu erweitern, es für den 2. Schritt.


Der erste Schritt scheint einfach zu sein, aber wenn es um den zweiten Schritt, die Anwendung der richtigen OOAD-Prinzipien und design-patterns ist eine Herausforderung.
Ich schaute mir die paar Fragen wie

diese eine.
Aber es half nicht viel.
Schätze irgendwelche Vorschläge, wie gehen Sie vor.

Den code, ich könnte für den ersten Schritt ist :

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

}
Es gibt zu viele Möglichkeiten, dies zu tun. Wie bereits in der Frage - Ihr 2. Schritt wäre umgestalten, Ihr Erster Schritt. Daher wäre es viel einfacher eingrenzen, wenn wir wissen, wie Sie umzusetzen ist der erste Schritt. Die Allgemeine Weise des TDD ist, um den ersten code zu schreiben (test) zum aufrufen der angegebenen Funktion (das wäre natürlich nicht), dann ändern Sie den code der Anwendung, um sicherzustellen, dass der test erfolgreich verläuft.
Stimme mit Ihnen überein. Ich entwickle den ersten Teil des Codes, und teilen Sie es bald.
Ich erstellte eine ähnliche, github.com/vksvicky/ShoppingCart
Gut, Das GitHub-Projekt sieht ziemlich reif - sind Sie vor irgendwelche Probleme gibt? Wenn ja, können Sie bitte sagen, welche Fehler Ihr gegenüber?
Danke für die ausführliche Projekt. Ich nehme einen Blick auf Sie. Kam diese Lösung basiert auf TDD oder hast du die Entwicklung dieses ersten, und die zusätzlichen tests?

InformationsquelleAutor Ano | 2014-10-02

Schreibe einen Kommentar