ООП, кто должен выполнять эту работу?

mus

Новичок
ООП, кто должен выполнять эту работу?

Господа, представим себе, что у нас есть некий склад. Там есть сущности - поставщик и товар. В базе данных эти сущности представлены отдельными таблицами, также существует третья для факта операции сделки, отношение -> многое ко многим.
Пишем класс Production и Supplier, определяем свойства, методы...
А теперь вопрос. Операция покупки - как её представить? В какой класс определить? Это поставщик продал нам товар или товар продался нам от поставщика? В каком из классов определить метод, отвечающий за операцию продажи товара от поставщика нам? Просто ранее мне говаривали (в университете), что в ООП объект обычно сам над собой выполняет действие, никто над ним ничего не выполняет...Скажем стол имеет метод moveTo для перемещения, однако сам стол же двигаться не может...
Насколько это верно с точки зрения ООП?
И вообще, стоит ли заморачиваться по этому поводу?
А также вот ещё вопрос, может все эти операции сделать отдельными функциями? Внутри классов определить лишь работу с объектами этих классов, как то "получить ИД текущего товара", "Изменить категорию для товара", "Увеличить значение статуса поставщика" и т.д., а все остальные написать в процедурном стиле, или это дурной тон?
 

Franzusow

Новичок
<<ООП, кто должен выполнять эту работу? >>
ТЫ!
Так что делай так, чтоб сам и другие разобратся могли.
порой при хорошей документации и классы не нужны.
но всеже если ты опредиленные операции к классам запишешь чтобы таким образом namenspace зделать, то будет конечно по проше все логически по полкам разложить.
Zakupka::priem("bubliki");
 

Romantik

TeaM PHPClub
операция ПОКУПКА это товарная операция связанная в первую очередь с СКЛАДСКИМ учетом, а уж потом с ПОКУПАТЕЛЕМ для БАЛАНСА
 

_vampiro_

Новичок
операция продажи - это 2 операции. перемещение товара (отгрузка) и перемещение денег. (оплата) Обычно это рализуется независимыми действиями, потому что плетежи не совпадают. Я бы делал объект "движение товара"
PHP:
$move = new ProductAction();
$move->AddProduct(тут продукт)
$move->from(поставщик);
$move->to(склад №1);
$move->confirm();
как-то так. Заодно через него же можно будет делать межскладское перемещение и списание со склада.
 

bgm

&nbsp;
Начни сверху и напиши класс "Товарный склад" - Warehouse.
 

whirlwind

TDD infected, paranoid
>Начни сверху и напиши класс "Товарный склад" - Warehouse.
off: сделай одну кнопку - собрать все бабло :) /off

В любой учетной системе ведется учет "чего-либо". Надо уметь отличать это "что-либо" от утилитарных функций. Нечто, учитываемое называется - объектом аналитики. Определенные действия, выполняемые над объектами аналитики в рамках системы, называются операциями. Ккак правило, операции соответствуют специфике работы предприятия - хозяйственным операциям.

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

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

PHP:
class Registry extends Persistent {
     function registerAtoms(){
          parent::registerAtoms();
          $this->setAtom("warehouse",new Atom_Reference("Warehouse"));
          $this->setAtom("supplier",new Atom_Reference("Supplier"));
          $this->setAtom("product",new Atom_Reference("Product"));
          $this->setAtom("quantity",new Atom_Numeric());
          $this->setAtom("amount",new Atom_Numeric());
     }
}
Операция оприходования будет формировать записи в регистре, а мы, используя эту структуру, сможем получать остатки товаров в любых разрезах: сколько на конкретном складе, сколько конкретного товара, сколько от конкретного поставщика, и т.п. Если добавить атрибут time, то можно будет получать статистику на конкретную дату, а так же организовать подсчет оборотов за определенный период.

PS. Кому надо, могу выслать базис для представления модели на основе SQL РСУБД (Creole drivers).
 
Сверху