Online Shopping Cart
Entities: Product, CartItem (product + quantity), Cart, Order, Payment. Sabse important design decision — CartItem mein price ka SNAPSHOT rakho, Product ka reference nahi. Agar seller kal price badal de to purane cart/order ka amount badalna BILKUL galat hoga.
Discounts ke liye Strategy + Chain use karo. Flat discount, percentage discount, BOGO, coupon — sab alag DiscountRule hain jo ek chain mein apply hote hain. Order of application matter karta hai (pehle item-level, phir cart-level) — ye clarify karna interviewer ko pasand aata hai.
class CartItem {
private final String productId;
private final Money unitPriceSnapshot; // add karte waqt ka price, LOCK
private int quantity;
}
interface DiscountRule {
boolean applicable(Cart cart);
Money discount(Cart cart);
}
class PricingEngine {
Money finalAmount(Cart cart, List<DiscountRule> rules) {
Money total = cart.subtotal();
for (DiscountRule r : rules)
if (r.applicable(cart)) total = total.minus(r.discount(cart));
return total.plus(taxes(cart)).plus(shipping(cart));
}
}- CartItem mein price ka snapshot rakho, live product price mat padho
- Discounts alag-alag DiscountRule, chain mein apply
- Item-level pehle, cart-level baad mein — order clarify karo
Guest user ka cart browser/session mein hota hai, logged-in user ka cart DB mein. Login karte waqt dono ko MERGE karna padta hai — ye ek real requirement hai jo log bhool jaate hain.
Merge rule clarify karo: same product dono mein ho to quantity jodni hai ya zyada waali leni hai? Ye poochna hi tumhe detail-oriented dikhata hai.
Cart merge(Cart guestCart, Cart userCart) {
for (CartItem g : guestCart.items()) {
userCart.findItem(g.productId())
.ifPresentOrElse(u -> u.addQuantity(g.quantity()),
() -> userCart.add(g));
}
return userCart;
}Checkout par sirf paisa lena nahi hota — pehle REVALIDATE karo: kya sab items abhi bhi available hain, kya price badla to nahi, kya coupon abhi bhi valid hai, kya delivery us pincode par hoti hai.
Cart mein item 3 din pehle daala ho sakta hai. Bina revalidation ke checkout karna out-of-stock order create kar dega, jo customer experience ka sabse bada issue hai.