Каков наилучший способ редактирования/удаления/обновления коллекции объектов в другом объекте

В моем объекте корзины у меня есть коллекция продуктов

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

  1. Либо удалите все старые продукты, либо сохраните новые продукты.
  2. Повторите с новой коллекцией продуктов и посмотрите, есть ли она уже там. Если нет, то удалите этот объект. Если нет то добавь

Какой способ лучше


person Mirage    schedule 10.08.2012    source источник


Ответы (1)


Подход, который я бы использовал для удаления, заключался бы в создании функции в объекте, который принимает идентификатор (например, номер модели или идентификатор базы данных для продукта), и эта функция затем выполняет свои собственные элементы, и если соответствующий элемент найден удалить его.

Что касается добавления новых элементов, у вас есть функция, которая снова принимает идентификатор элемента и, вооружившись этой информацией, извлекает все применимые данные из базы данных и добавляет их в свою собственную коллекцию.

Вы хотите избежать удаления объекта и создания его снова, если хотите что-то в нем изменить. Попробуйте использовать объекты, у которых есть все функциональные возможности, чтобы делать то, что им нужно, самостоятельно.

Некоторый пример кода, вероятно, будет говорить о многом больше, чем приведенный выше:

class shoppingItem
{
    public $ID;
    public $name;
    public $price;
}

class shoppingCart
{
    public $items=array();
    public $totalValue;

    public function addItem($ID)
    {
        $this->items[]= new shoppingItem();
        // ... do database stuff to get item details
        $this->items[]->ID=$dataBaseRow['id'];
        $this->items[]->name=$dataBaseRow['name'];
        $this->items[]->price=$dataBaseRow['price'];
        $this->ammendTotal();
    }

    public function ammendTotal()
    {
        // loop all items and get total value.
        $var=myTotal;
        $this->totalValue=$var;
    }

    public function removeItem($ID)
    {
        for($i=0;$i<count($this->items);$i++)
        {
            if($this->items[$i]->ID==$ID)
            {
                // remove from array or update qty
            }
        }
        $this->ammendTotal();
    }
}

теперь, чтобы добавить товар в корзину, все, что вам нужно сделать, это что-то вроде этого:

$shoppingCart->addItem($someID);

Объект добавит его к себе, изменит его общее количество и продолжит работу.

Чтобы удалить элемент, то же самое:

$shoppingCart->removeItem($unwantedItemID);

и снова элемент удаляется или количество обновляется (как бы вы ни решили это сделать), и его общее количество снова обновляется.

В основном, держите его низким уровнем обслуживания. Никогда не допускайте, чтобы в объекте были неверные данные (в данном случае, такие как totalValue, не совпадающие с суммой элементов внутри него), поэтому пишите простые функции и повторно используйте их там, где это возможно.

Вызовы, которые вы делаете из своего основного кода, должны быть как можно просты и возлагать всю тяжелую работу на объект. Таким образом, вы не получите неожиданных ошибок, ваш основной код будет легко читать/изменять, и вы можете быть уверены в объектах.

person Fluffeh    schedule 10.08.2012
comment
есть ли способ установить коллекцию элементов на o за один раз, или мне нужно удалить элементы один за другим, если я хочу очистить все элементы - person Mirage; 10.08.2012
comment
@ john110016 вы можете написать столько функций, сколько захотите. нет ничего плохого в функции clearAllItems(), которая удаляет все и устанавливает totalValue в ноль. В этом посте я пытаюсь сказать, что нужно убедиться, что объект может делать все, что вам нужно. Это был очень простой пример. Возможно, написать функции добавления/удаления, чтобы принимать массив в качестве параметра? Напишите в нем целую кучу других функций, чтобы он мог делать все, что вам нужно. - person Fluffeh; 10.08.2012