Implementazione logica di coupon "compra uno prendi due gratis" per il carrello

3

Cercando di risolvere la logica bogo coupon con un modello di progettazione corretto, ma riscontrando problemi nell'identificarne uno.
Caso d'uso: "Acquista iPad scarica SmartCase gratuitamente"

Supponiamo di avere i seguenti oggetti:

Product:
 - getPrice

CartItem(Product p, quantity):
 - getPrice

Cart:
 - getItems()
 - addItem(CartItem ci)

Coupon(code):
 - getCode

CouponBuyOneGetOneFree(code) extends Coupon: (not sure about inheritance here)

1) Quale modello di progettazione si adatta qui?
2) E se avessi bisogno di impostare la stessa logica senza coupon ma nelle impostazioni del prodotto stesso?

Ho implementato Decorator pattern per CartItem quando lo sconto è applicato allo stesso CartItem di questo esempio e funziona benissimo, ma non è ancora possibile ottenere il risultato di questo caso d'uso.

In qualche modo devo controllare che Ipad e SmartCase siano entrambi nel carrello e applicare lo sconto solo a SmartCase . Inoltre, se aggiungo un altro iPad dovrei ottenere un altro SmartCase gratuitamente.

    
posta Putna 09.01.2016 - 10:32
fonte

2 risposte

4

Non è richiesto alcun motivo di progettazione accanto alla sottoclasse di base. Hai solo bisogno di un'interfaccia Coupon con un singolo metodo: calculateDiscount (carrello, cliente) . Crea un'implementazione di Coupon per ogni diverso tipo di sconto, ad es. a FreeAddonCoupon o a LoyaltyCoupon .

Quindi un carrello ha cartItem e coupon. Aggiungi il prezzo degli articoli, sottrai lo sconto per ogni coupon.

    
risposta data 09.01.2016 - 10:50
fonte
2

Il processo del mondo reale sembra adatto qui. Vorrei separare la raccolta di Coupons da Cart (raccolta CartItems ) incapsulandoli in Checkout oggetto.

Gli articoli nel carrello hanno il prezzo standard fino a quando i tagliandi non lo cambiano. Gli sconti sono dati al momento del pagamento e così gli articoli gratuiti. Il processo di checkout è il seguente:

  1. Ogni CartItem viene estratto dal carrello e diventa CheckoutItem
  2. CheckoutItem ha proprietà aggiuntive - sconto (0 all'inizio)
  3. Ogni Coupon prende un picco alla raccolta CheckoutItem e in base a ciò che è lì dentro:
    • aumenta lo sconto del singolo elemento,
    • aggiunge l'elemento "libero"
    • aggiunge "meta-item" con prezzo negativo (sconti totali / subtotali)
  4. Gli elementi aggiuntivi vengono ignorati dai tagliandi successivi ( price > 0 dovrebbe essere sufficiente) per evitare l'effetto a cascata
  5. I tagliandi che hanno cambiato qualcosa al checkout sono stati rimossi dall'utente
  6. Dopo aver iterato tutte le proprietà di cedole CheckoutItems può essere presentato all'utente e creare l'ordine alla fine.

Ps. Checkout potrebbe non essere il nome giusto quando i tagliandi mostrano il valore in anticipo (prima di aggiungere articoli al carrello), ma il processo non dovrebbe cambiare imo.

    
risposta data 10.01.2016 - 02:41
fonte

Leggi altre domande sui tag