考虑架构....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