PHP актер действовать на объект - PullRequest
1 голос
/ 24 августа 2010

Учитывая архитектуру ....

Обычно у меня есть класс корзины покупок с методами addItem и removeItem (среди нескольких других).Однако в духе реального мира покупатели должны действовать на тележках шананиганов - поэтому разве addtoCart / removefromCart не должен быть методом клиента?

ИЛИ У меня должен быть промежуточный объект CustomerActsOnCart, который берет клиента и корзинуобъекты в качестве аргументов в конструкторе и выполнение там манипуляций ???

Любые размышления будут приветствоваться ...

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Даже если вы дадите Customer методы addToCart() и removeFromCart(), вам все равно придется иметь некоторую логику в ShoppingCart, чтобы эти методы действительно изменяли состояние при добавлении или удалении элемента.ИМО, актер в этом случае гораздо лучше представлен ссылкой на владельца клиента и / или наоборот, например,

$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, для которого мы хотели скрыть детали реализации, мы могли бы использовать что-то подобное, но, поскольку ShoppingCart - это IMO, не является важной частью Customer, этот метод не должен быть для Customer.Это всего лишь вспомогательный прокси.

Вы можете создать Decorator для Customer для управления покупательским поведением.Это будет отделять беспокойство / ответственность от How-To-Shop от Клиента, например что-то вроде

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

Это такжеПозволяет вам применять Поведение покупок к другим актерам, которые могут нуждаться в таком поведении.

Подход CustomerActsOnCart звучит примерно так же, как Шаблон посредника .Не уверен, что это выполнимый подход.

1 голос
/ 24 августа 2010

как я вижу ... класс Customer и класс Cart имеют отношение 1x1 друг к другу, так что вы можете поместить ссылку на объект Customer в корзину .. или поместить объект Cart внутри Customer,я бы сказал, что лучше использовать второй вариант, потому что будет проще найти текущего пользователя, а затем вы можете сделать что-то вроде:

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

и оставить методы addtoCart / removeItem внутри корзины.объект

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...