考慮架構....PHP OOP演員作用於對象
我通常有的addItem和removeItem方法的購物車類(除其他幾個)。然而,在現實世界中,shananigans的推車應該由顧客採取行動 - 因此,addtoCart/removefromCart不應該成爲顧客的一種方法嗎?
或者我應該有一箇中間CustomerActsOnCart對象,它將客戶和購物車對象作爲構造函數中的參數並在那裏執行操作?
任何思索將是最受歡迎的...
考慮架構....PHP OOP演員作用於對象
我通常有的addItem和removeItem方法的購物車類(除其他幾個)。然而,在現實世界中,shananigans的推車應該由顧客採取行動 - 因此,addtoCart/removefromCart不應該成爲顧客的一種方法嗎?
或者我應該有一箇中間CustomerActsOnCart對象,它將客戶和購物車對象作爲構造函數中的參數並在那裏執行操作?
任何思索將是最受歡迎的...
即使你給一個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。不知道這是否是一種可行的方法。
我看到它的方式......一個Customer類和Cart類相互之間一個1x1的關係,所以你可以把客戶對象的引用在購物車..或將一個Cart對象放在Customer中,我會說使用第二個選項更好,因爲它可以更容易地獲得當前用戶,然後您可以執行類似操作:
$current_user->getCart()->addtoCart()
並保持Cart對象內的addtoCart/removeItem方法
希望它有助於
我認爲1:1關係是關鍵。在現實生活中的超市中,許多顧客使用單一的購物車,儘管是連續的。在像亞馬遜這樣的虛擬商店中,ShoppingCart是單個客戶的屬性。但是,客戶有許多不同的活動,所以將購物車相關的方法放在購物車上更清潔。 – APC 2010-08-24 11:52:59
1:1關係看起來過於嚴格。 ----如果多人想共享購物車會怎麼樣? (家庭購物爲某人的生日禮物)。或者如果一個顧客想要多個購物車(商業購物和個人購物同時完成不同的信用卡)呢? – 2010-08-24 11:54:33
1對1的關係不是給定的。根據您的需求,您可能需要一個客戶才能訪問多個購物車,或者確實有很多客戶訪問一個購物車。移動演員的添加/刪除是我認爲最真實的建模現實世界的方式。只是MO ofcourse;) – 2010-08-24 11:57:27
我喜歡前兩個插圖,說明如何使用推車或顧客在購物車上進行操作來考慮此問題。真的有助於清理事情。 – 2010-08-24 12:15:45
實際上認爲調解員在這種情況下是完美的... – 2010-08-24 12:43:06