Блог компании Centrobit / Подход к проектированию платформы интернет дистрибьюции с помощью шаблонов

в 12:11, , рубрики: , Agora, api, B2B, Centrobit, ecommerce, MAPPINGP, orm, php, smarty, sql, бд, бронь, дистрибуция, дистрибьюция, классы, коды, маппинг, объект, ошибки, Платформа, примеры, продукт, проектирование, разработка, центробит, шаблоны, электронная коммерция

Привет, читатели!
Хочу рассказать о проекте Agora, которым занимается наша команда.
Agora — это платформа, позволяющая организовать дистрибьюцию товаров через интернет. Платформа интегрируется с ERP дистрибьютора и автоматизирует прием заказов, просмотр остатков, получение актов взаиморасчетов и много другое. Пользователь работает в веб-интерфейсом платформы и все его действия отражаются в ERP дистрибьютора.

В статье “Как я написал «драфт» системы В2В” в блоге нашей компании я описал некоторые проблемы, c которыми мы столкнулись, создавая нашу платформу. Поначалу задача показалась нам не сложной, в качестве шаблонизатора на стороне сайта был выбран smarty, об объектной модели не думали, т.к. писали одиночные бизнес-модули каждый для своих целей. Например: каталог, резерв, заказ, поиск, финансы и т.д.
В итоге с расширением начального Т.З. код стал не масштабируемым и некоторые функции или целые блоки приходилось использовать в нескольких местах. Функции переписывались и встал вопрос о том, чтобы переделать все заново.

Проектируя систему заново, мы столкнулись с рядом проблем:
1. Как генерировать различные наборы объектов в зависимости от конкретной ситуации?
Эти наборы объектов должны быть более или менее “прозрачными” для других компонентов системы. Например, из 1С, нам предается объект “заказ покупателя”, нужно генерировать соответствующий ему объект в Agora или обновить его статус.

2. Как определить границы между классами особенно по мере того, как они будут развиваться вместе с создаваемой системой?
Например, заказ и накладная очень похожие объекты. Они оба содержат артикулы товаров, количество, цену и НДС. Но у каждого объекта свои свойства и методы.Причём у многих предприятий свои “фишки” с этими 2-мя объектами. У одного кроме стандартного заказа еще “заявка под заказ”, у другого кроме накладных еще “фиктивные накладные” и т.д.

3. Как абстрагировать бизнес-логику в объектах и отделить их от операций с БД?
Например, у одного дистрибьютора заказ имеет дополнительные поля в БД, а у других таких полей нет. Если пишем прямые запросы к БД, нужно каждый раз их корректировать, а это не удобно.

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

Что же у нас получилось в итоге (ниже был приведён список некоторых основных классов, реализующих шаблоны, на которых строятся объекты платформы):

Блог компании Centrobit / Подход к проектированию платформы интернет дистрибьюции с помощью шаблонов

Вообщем, главная идея такова:

  • Классы объектов наследуют класс AgoraDomainObject. Класс AgoraMapper (маппер данных) взаимодействует с БД.
  • Класс AgoraDomainObjectFactory генерирует объект из маппера.
  • Множеством объектов управляет классы AgoraDeferredCollection/AgoraCollection.
  • Состояния объектов (создание, изменение, отметка на удаление) отслеживает AgoraObjectWatcher.
  • Вспомогательный класс AgoraHelperFactory возвращает Mapper или Collection.
  • Вспомогательный класс AgoraPersistenceFactory координирует объекты Domain, Collection, Mapper.
  • Все параметры системы (в том числе описание таблиц в БД) хранятся в ini файлах и грузятся 1 раз с помощью класса AgoraLoader.

Схема ниже показывает организацию отображения объекта Продукт, построенного на основе шаблонов:
Блог компании Centrobit / Подход к проектированию платформы интернет дистрибьюции с помощью шаблонов

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

Вот пример работы с товарами:
$id = array(....); //массив id
$productMapper = new productMapper(); //создание маппер
$productCollection = new productCollection(); //создание коллекции
for ($i=0; $i<count($id); $i++){
$product = $productMapper->find($id[$i]); //поиск продукта по id
$productCollection->add($product); //добавить в коллекции
}
$product = $productMapper->find(1); // поиск продукт №1
echo $product->toJson(); // показать в Json
echo $productCollection->toXML(); // выгрузка XML коллекции

В следующих статьях я расскажу подробнее о технической реализации Agora.
Продолжение следует…
Автор:


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js