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 :
-
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.
Vous devez vous connecter pour publier un commentaire.
Au lieu de cela, vous pouvez simplement mettre en Œuvre des processus panier que la table de hachage en java
il sera de la forme :