2 класса для работы с 1 объектом.

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

2 класса для работы с 1 объектом.

Сообщение Chelobaka »

Здравствуйте.

Существует Склад, на котором хранится Продукция.
Есть 2 варианта взаимодействия с кол-ом продукции на складе.

1. Уходит поставка со склада. И вся продукция входящая в поставку вычитается из склада. Пишутся логи.

2. Нужно заблокировать продукцию на складе. Продукция вычитается и пишутся логи.

Для работы с продукцией должен существовать 1 класс и 1 метод или это может быть несколько различных классов. Например один для работы с поставками и другой для работы с блокировкой продукции.

То есть можно ли менять кол-во продукции из различных мест программы или это ошибка?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: 2 класса для работы с 1 объектом.

Сообщение yiiliveext »

Ошибка. Для блокировки/резервирования продукции может существовать другой класс (можно и в одном, но лучше вынести в отдельный), но он должен работать со своей отдельной таблицей резервов (можна и поле выделить, если нет учета в разрезе докуметов, это зависит от политики блокировок).
Классы будут иметь приблизительно такой вид.

Код: Выделить всё


class StockReserve
{
    public function setReserved($productId, stockId, qty)
    {
        //...
    }
    
     public function getReserved($productId, stockId)
    {
        //...
        return $qty
    }
}

class Stock
{
    private $stockReserve;

    public function _construct(StockReserve $stockReserve)
    {
        $this->stockReserve = $stockReserve;
    }
    
    public function getFullStockQty($productId, stockId)
    {
        //выбираем из остатков
    }
    
    public function getFreeStockQty($productId, stockId)
    {
        //выбираем из остатков и минусуем $this->stockReserve->getReserved($productId, stockId)
    }
    
    public function getReservedStockQty($productId, stockId)
    {
        return $this->stockReserve->getReserved($productId, stockId);
    }
    
    //...
}

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