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

Je suis tombé sur un panier d'exercice pour apprendre OOAD et TDD à l'aide de Java.

L'exercice est:


Première Étape: Conception d'un système de commande

  • Construire un système de commande pour une boutique qui vend des 3 produits-dire le Pain, le Lait et les Bananes.
  • Les coûts des produits sont : Pain - $1, Lait - 0,60 $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.
    Des exemples sont:
    Le Pain, Le Lait, La Banane = $2.00
    De Pain, De Pain, De Lait, Banane = $3.00
    Le Lait, La Banane, Le Lait, La Banane = $2.00

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

Acheter un pain et pain pour le libre
Acheter 3 Lait pour le prix de 2
Acheter 2 Bananes et obtenez-en un gratuit

D'abord constituer une solution la plus simple pour satisfaire le premier cas seul. Puis re-facteur le code de l'étendre pour la 2ème étape.


La première étape semble être facile, mais quand il s'agit de la deuxième étape, appliquer le bon OOAD principes et patrons de conception est difficile.
J'ai pris un coup d'oeil à un couple de questions connexes comme

cette une.
Mais il n'a pas beaucoup d'aide.
Apprécier des suggestions sur la façon d'aller de l'avant.

Le code que je pouvais venir 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));
    }}

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;
}   
}
  • Il y a trop de façons de le faire. Comme mentionné dans la question - votre 2ème étape serait de revoir votre première étape. Par conséquent, il serait beaucoup plus facile pour affiner, si nous savons comment mettre en œuvre la première étape. La voie générale du TDD est d'abord écrire le code (test) pour appeler la fonction (ce qui serait évidemment pas), puis de modifier le code de l'application assurez-vous que le test passe.
  • D'accord avec vous. Je vais développer la première partie du code et de les partager rapidement.
  • J'ai créé un semblable, github.com/vksvicky/ShoppingCart
  • Ainsi, Le projet GitHub a l'air assez mature - êtes-vous face à toutes les questions? Si oui pouvez-vous me dire quelle erreur vous devez faire face?
  • Je vous remercie pour le projet détaillé. Je prends un coup d'oeil. Avez-vous arriver à cette solution basée sur TDD ou avez-vous développé cette première partie et la les tests?
  • Je suis arrivé à la solution basée sur ATS.

InformationsquelleAutor Ano | 2014-10-02