2013-08-01 27 views
3

我期待實現某些電子商務功能,在達到特定數量時可提供折扣。捕捉的是,它不是一個sku的數量,一個類別中的任何數量的其他產品可以在達到閾值時觸發數量中斷。分離問題和OOP PHP - 基於購物車中其他產品的產品價格

所以,如果我有一個Cart_Product的模型類可以說,我通常會把這個類中的價格作爲一個方法的邏輯。但由於需要考慮當前購物車中該類別的其他實例,因此我不確定是否需要繼續。

我是否在Cart_Product get_price方法內調用「所有者」Cart實例,然後添加邏輯以檢查數量中斷?還是有更好的設計模式在這一步使用?

回答

1

首先,模型不是一個類或實例。型號是layer。你在談論的問題實際上是domain objects(假設他們不負責保存自己,這將違反SRP

至於應用折扣,這取決於您的購物車中的每個產品是否有單獨的折扣的折扣是一樣的所有產品:

  • 如果每個產品可以有不同的折扣,那麼該邏輯應位於Product域對象

  • 如果所有的產品得到相同的。折扣,那麼折扣應該隻影響總和,因此 - 在Cart實例中計算。

1

您描述的邏輯是一個購物車範圍的功能;因爲車是產品的邏輯所有者裏面,你會不會有實現它:

class Cart 
{ 
    private $products; // Cart_Product[] 

    // ... 

    function calculateDiscount() 
    { 
     $totalQuantity = array_reduce($this->products, function($sum, $product) { 
      return $sum + $product->getQuantity(); 
     }, 0); 

     if ($totalQuantity > 10) { 
      $this->cartDiscount = 25; // apply 25% discount on the cart 
     } else { 
      $this->cartDiscount = 0; 
     } 
    } 
} 

這引入了全球車優惠一個獨立的實體。如果你不想要這樣做,你將不得不將折扣應用到每個單獨的項目。

0

我剛剛經歷了一些非常相似的事情。購物車應該知道的唯一事情就是產品ID和數量。其他一切只能用於顯示目的。換句話說,產品對象總是負責價格。價格存儲在購物車中的唯一原因是幫助在視圖中顯示價格。否則我們會假設價格總是需要檢查插入或更新,以防止欺詐。

這裏是另一種情況 - 你有一個特殊的運輸,如購買價值100美元的合格貨物,你會得到免費送貨。在特定產品上可能會有單獨的運輸特別。唯一的計算方法是購買所有的購物車物品。

所以我的解決方案 - 我不確定是否最優 - 是將購物車物品傳遞給送貨對象 - 進行運費計算 - 可選地爲特定產品添加消息以顯示在購物車中 - 然後返回購物車物品。

否則,你不得不將運輸方法放在購物車類中,這是沒有任何意義的,但也許有另一種方法來做到這一點。

這裏是另一種情況 - 庫存控制。有人點了30個藍色小工具,但你只有10個藍色小工具。確定您可以在將商品插入購物車時檢查庫存。但如果他們更新購物車然後增加到30?這意味着我們必須在每次購物車更新時檢查庫存 - 購物車中的每件商品。如果我們這樣做,那麼不妨在價格上漲或下跌的情況下獲得價格。

所以我拿着購物車的物品 - 並將它們傳遞給產品對象 - 檢查庫存 - 並在必要時將物品的數量減少到當前庫存 - 可選地添加消息說明庫存有限 - 然後傳回購物車對象。

最後 - 建議您擁有擁有購物會話的對象。然後那就是總數。這樣的車從來沒有總負責 - 它只是一個容器。一種方法是您只需開始訂單,然後在那裏存儲不同的總計。

相關問題