Upgrade to Pro — share decks privately, control downloads, hide ads and more …

91APP 電商技術大解密 (2020 線上分享系列):新促購機制——抽象化系統設計思維以促購引擎為例

91APP 電商技術大解密 (2020 線上分享系列):新促購機制——抽象化系統設計思維以促購引擎為例

主題:新促購機制——抽象化系統設計思維以促購引擎為例
講師:呂致緯(Zhi-Wei Lu)資深軟體工程師

促購機制是電商系統非常重要的功能,企業能否源源不絕的吸引客戶,促購機制的優劣將是重要的關鍵。但隨著促購機制、折扣方式的多變,如何開發一個具備擴充性,能夠因應客戶商業邏輯的促購機制將是工程師的一大挑戰。在這場分享中,講師將分享 91APP 的工程師是如何借助「抽象化」的幫助完成全新的促購機制。

Youtube: https://www.youtube.com/watch?v=xEBCpMVj5I0

91APP Tech Network: https://www.91app.tech/
91APP Tech Group: https://www.facebook.com/91apptech/

91APP Tech Network

June 18, 2020
Tweet

More Decks by 91APP Tech Network

Other Decks in Programming

Transcript

  1. 背景 • 促購活動複雜且多變的折扣方式,例如: ◦ 指定商品任選優惠價:滿 2 件,合計 399 圓; ◦

    現折:滿 1000 圓,全部折 100 圓; ◦ 第 N 件折扣:滿 2 件,第 2 件 6 折; ◦ 紅配綠:紅標商品滿 1 件 + 綠標商品滿 1 件,合計 999 圓。 6
  2. 解決方案 • 將結帳流程抽象化 促 購 引 擎 規則 #1 規則

    #2 規則 #3 最終折扣金額 12 折扣計算規則
  3. 解決方案 • 定義系統架構 private static void Main(string[] args) { //

    初始化購物車 Context 與 POS 物件。 var cart = new CartContext(); var pos = new Pos(); // 1. 購物車加入購買商品。 cart.PurchasedItems.AddRange(LoadProducts()); // POS 加入啟用的折扣規則。 pos.ActivatedRules.AddRange(LoadRules()); // 2. 對購物車 Context 進行結帳。 pos.CheckoutProcess(cart); // 3. 列印收據。 PrintReceipt(cart); } 14 範例程式碼: Andrew.DiscountDemo/Program.cs at master · Zhi-Wei/Andrew.DiscountDemo · GitHub
  4. 解決方案 • POS 的結帳方法 public bool CheckoutProcess(CartContext cart) { cart.AppliedDiscounts.Clear();

    // Reset Cart. cart.TotalPrice = cart.PurchasedItems.Select(p => p.Price).Sum(); // 計算總價。 // 計算折扣。 foreach (var discounts in this.ActivatedRules .Select(rule => rule.Process(cart).ToArray())) { cart.AppliedDiscounts.AddRange(discounts); cart.TotalPrice -= discounts.Select(d => d.Amount).Sum(); } return true; } 15 範例程式碼: Andrew.DiscountDemo/Pos.cs at master · Zhi-Wei/Andrew.DiscountDemo · GitHub
  5. 解決方案 • 定義折扣規則的抽象化介面 public abstract class RuleBase { public int

    Id { get; set; } public string Name { get; set; } public string Note { get; set; } public abstract IEnumerable<Discount> Process(CartContext cart); } 16 範例程式碼: Andrew.DiscountDemo/RuleBase.cs at master · Zhi-Wei/Andrew.DiscountDemo · GitHub
  6. 解決方案 • 實作第一個折扣規則:任兩箱結帳 88 折 public class BuyMoreBoxesDiscountRule : RuleBase

    { public override IEnumerable<Discount> Process(CartContext cart) { var matchedProducts = new List<Product>(); foreach (var p in cart.PurchasedItems) { matchedProducts.Add(p); if (matchedProducts.Count != this._boxCount) continue; yield return new Discount // 符合折扣 { Amount = matchedProducts.Select( product => product.Price).Sum() * this._percentOff / 100, Products = matchedProducts.ToArray(), Rule = this, }; matchedProducts.Clear(); } } } 17 範例程式碼: Andrew.DiscountDemo/BuyMoreBoxesDiscountRule.cs at master · Zhi-Wei/Andrew.DiscountDemo · GitHub
  7. 解決方案 • 擴充第二個折扣規則:消費滿 1000 折抵 100 public class TotalPriceDiscountRule :

    RuleBase { public override IEnumerable<Discount> Process(CartContext cart) { if (cart.TotalPrice > this._minDiscountPrice) { yield return new Discount { Amount = this._discountAmount, Rule = this, Products = cart.PurchasedItems.ToArray() }; } } } 18 範例程式碼: Andrew.DiscountDemo/TotalPriceDiscountRule.cs at master · Zhi-Wei/Andrew.DiscountDemo · GitHub
  8. 解決方案 • 達到目標: ◦ 統 一 運 算 規 則

    : 抽象化結帳流程讓折扣的運算皆交由促購引擎計算取的最終的折購金額。 ◦ 打 造 可 擴 充 的 計 算 引 擎 : 抽象化折扣規則讓任何依照合約實作的折扣規則皆可擴充至促購引擎。 21
  9. 附錄 • 範例程式碼: ◦ GitHub - Zhi-Wei/Andrew.DiscountDemo • 參考資料: ◦

    架構面試題 #4 - 抽象化思考;折扣規則的設計機制 — 安德魯的部落格 ◦ 抽象化 (計算機科學) - 維基百科,自由的百科全書 ◦ 促銷 - MBA智庫百科 ◦ 銷售促進-華人百科 31