Comment concevoir les classes pour un exemple de panier simple en utilisant l'approche TDD?


Je suis tombé sur un exercice de panier pour apprendre OOAD et TDD en utilisant Java.

L'exercice est:


Première étape : Concevoir un système de caisse

  • Construisez un système de caisse pour un magasin qui vend 3 produits, par exemple du pain, du lait et des bananes.
  • Les coûts des produits sont: Pain-1$, Lait-0,60 Banana et Banane - 0,40 {
  • Construire un système pour commander un panier qui peut avoir des multiples de ces 3 produits et affiche le total de la commande. Les exemples sont: Pain, Lait, Banane = 2,00 $ Pain, Pain, Lait, Banane = 3,00 $ Lait, Banane, Lait, Banane = 2,00 {

Comme prochaine étape : améliorer le code pour appliquer les réductions et offres ci-dessous

Achetez un pain et obtenez un autre pain gratuitement Acheter 3 lait pour le prix de 2 Achetez 2 bananes et obtenez-en une gratuite

Construisez d'abord une solution la plus simple pour satisfaire le premier cas seul. Puis re-factoriser le code pour l'étendre pour la 2ème étape.


La première étape cela semble facile, mais en ce qui concerne la deuxième étape, l'application des principes et des modèles de conception appropriés est difficile. J'ai jeté un oeil à quelques questions connexes comme
celui-ci . Mais il n'a pas beaucoup d'aide. Appréciez toutes les suggestions sur la façon d'aller de l'avant.

Le code que je pourrais trouver pour la première étape est:

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

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

}
Author: Community, 2014-10-02

1 answers

Au lieu de cela, vous pouvez simplement implémenter le processus de panier en tant que HashMap en java

, Il sera de la forme :

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
}
 1
Author: user1540256, 2015-01-11 08:06:33