2010-08-24 50 views
1

考慮架構....PHP OOP演員作用於對象

我通常有的addItem和removeItem方法的購物車類(除其他幾個)。然而,在現實世界中,shananigans的推車應該由顧客採取行動 - 因此,addtoCart/removefromCart不應該成爲顧客的一種方法嗎?

或者我應該有一箇中間CustomerActsOnCart對象,它將客戶和購物車對象作爲構造函數中的參數並在那裏執行操作?

任何思索將是最受歡迎的...

回答

1

即使你給一個Customer方法addToCart()removeFromCart(),你仍然必須具備一定的邏輯ShoppingCart有這些方法實際上做的狀態變化,當一個項目被添加或刪除。在這種情況下,通過提及擁有的客戶和/或反過來例如IMO,演員可以更好地表現出來。

$cart = new ShoppingCart; 
$cart->setOwner(new Customer); 
$cart->addItem(new Item('Apples')); 
$cart->checkout(); 

您也可以從客戶那裏獲取這些信息,例如,

$customer = new Customer; 
$customer->setShoppingCart(new ShoppingCart); 
$customer->addItemToShoppingCart(new Item('Apples')); 
$customer->checkout(); 

但方法名addItemToShoppingCart已經暗示Customer作用於ShoppingCart,所以裏面你很可能做

$this->getShoppingCart()->addItem($item); 

如果ShoppingCart是的Customer一個composite element爲此我們想隱藏實現細節,我們可以使用類似的東西,但由於ShoppingCart是IMO不是客戶的重要組成部分,所以這種方法不應該在Customer上。這只不過是一個便利的代理。

您可以爲Customer創建Decorator以處理購物行爲。這將解耦來自客戶的如何購物的concern/responsibility,,例如,像

class ShoppingDecorator 
{ 
    protected $actor; 
    protected $cart; 
    protected function __construct($actor) { ... } 
    public function getCart() { ... }; 
    public function addToCart() { ... } 
    ... 
} 

這也可以讓你將購物行爲應用到可能需要這種行爲的其他行動者。

CustomerActsOnCart方法聽起來有點像Mediator Pattern。不知道這是否是一種可行的方法。

+1

我喜歡前兩個插圖,說明如何使用推車或顧客在購物車上進行操作來考慮此問題。真的有助於清理事情。 – 2010-08-24 12:15:45

+0

實際上認爲調解員在這種情況下是完美的... – 2010-08-24 12:43:06

1

我看到它的方式......一個Customer類和Cart類相互之間一個1x1的關係,所以你可以把客戶對象的引用在購物車..或將一個Cart對象放在Customer中,我會說使用第二個選項更好,因爲它可以更容易地獲得當前用戶,然後您可以執行類似操作:

$current_user->getCart()->addtoCart() 

並保持Cart對象內的addtoCart/removeItem方法

希望它有助於

+0

我認爲1:1關係是關鍵。在現實生活中的超市中,許多顧客使用單一的購物車,儘管是連續的。在像亞馬遜這樣的虛擬商店中,ShoppingCart是單個客戶的屬性。但是,客戶有許多不同的活動,所以將購物車相關的方法放在購物車上更清潔。 – APC 2010-08-24 11:52:59

+0

1:1關係看起來過於嚴格。 ----如果多人想共享購物車會怎麼樣? (家庭購物爲某人的生日禮物)。或者如果一個顧客想要多個購物車(商業購物和個人購物同時完成不同的信用卡)呢? – 2010-08-24 11:54:33

+0

1對1的關係不是給定的。根據您的需求,您可能需要一個客戶才能訪問多個購物車,或者確實有很多客戶訪問一個購物車。移動演員的添加/刪除是我認爲最真實的建模現實世界的方式。只是MO ofcourse;) – 2010-08-24 11:57:27