Сборщик объектов

From SunFlurry wiki
Jump to: navigation, search
  ObjectCollector (Сборщик объектов)
Статус разработки: Реализован
Создание объекта: Create

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

Перечислим еще раз плюсы от работы со сборщиком объектов:

  • Уменьшение расхода памяти за счет превращения одинаковых объектов в один объект
  • Ускорение процесса обработки за счет уменьшения количества загрузок объектов

Минусы сборщика объектов:

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

В каких случаях сборщик объектов можно применять:

  • Объекты, с которыми работает обработка, получены из разных источников, либо разных запросов.
  • Объекты получены из одного источника, однако, он не использует внутренний механизм сортировки и сборки объектов (к примеру, загружены из внешней выгрузки по кодам объектов и пр.).
  • Объекты получены выборкой из временной таблицы базы данных (см. Select и Next).

В каких случаях сборщик объектов не годится к применению:

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

Пример работы со сборщиком объектов при выборке из временной таблицы базы данных:

//Пример показывает рабочий цикл с объектами из временной таблицы, используя сборщик объектов для уменьшения расхода памяти
//MainTab -- визуальная таблица, в которую будут копироваться результаты обработки временной таблицы БД

//Создание сборщика объектов
ObjC:=ObjectCollector.Create();

MainTab.Lock();
Try
  //Очистка визуальной таблицы
  MainTab.ClearLines();

  //Создание и загрузка сложной временной таблицы БД, детали загрузки не имеют особого значения для нашего примера
  аТемп:=TempDB.Create("зДок:DB,зЗад:DB,зВып:DB,зДата:DATE,зНомерСтроки:NUMBER.10,Номенклатура:DB,Смена:DB,Работники:STRING.200,Количество:NUMBER.15.5");
  аТемп.LoadFrom("Doc.РегистрацияВыпускаПродукции.Содержание","@HEADER->зДок,@HEADER.DocDate->зДата,@HEADER.ВыпускПродукции->зВып,@HEADER.ВыпускПродукции..Doc.ВыпускПродукции.ДокОснование->зЗад,"+
    "@LINE->зНомерСтроки,Материал->Номенклатура,КоличествоОпераций->Количество,Работники->Работники,Смена->Смена",
    "ТипЗаписи=1","not isEmpty(@HEADER.ВыпускПродукции)","IsType(@HEADER.ВыпускПродукции,Doc.ВыпускПродукции)");

  Всего:=аТемп.Size();
  aNum:=0;
  аТемп.Select("зВып+,зДата+,зДок+,зНомерСтроки+");
  While аТемп.Next() Do
    aNum:=aNum+1;
    If aNum%20=0 Then
      Form.StatusText("Обработано строк: "+aNum+" из "+Всего);
    EndIf;
    зНом:=ObjC.Get(аТемп.Номенклатура);
    зЗад:=ObjC.Get(аТемп.зЗад);
    зВып:=ObjC.Get(аТемп.зВып);
    зДок:=ObjC.Get(аТемп.зДок);
    MainTab.AddLine("Документ,Номенклатура,Ед,Количество,Смена,зДок,НомСтр,зВып,зЗад,Работники,Индекс",зЗад.DocNum+" от "+зЗад.DocDate,зНом,ObjC.Get(зНом.базЕдиница),аТемп.Количество,
      ObjC.Get(аТемп.Смена),зДок,аТемп.зНомерСтроки,зВып,зЗад,ПолучитьСписокРаботников(Trim(аТемп.Работники),ТРаботники),зДок.DocNum+"@"+зДок.DocDate+"@"+аТемп.зНомерСтроки);
  EndDo;
  MassLoadObjects(MainTab);
Finally
  MainTab.Unlock();
EndTry;
Form.MainTab.SetFocus();


Атрибуты и функции

Идентификатор Статус Тип Визуальная Параметры Описание
Create Реализована Функция ObjectCollector.Create():<Новый объект (OBJECTCOLLECTOR)> Функция возвращает новый объект типа Сборщик объектов.
Get Реализована Функция ObjectCollector.Get(<Объект, для добавления или получения из коллекции (DB)>):<Подобный объект из коллекции (DB)> Функция ищет переданный объект в коллекции сборщика, при нахождении, отдает найденный объект, иначе добавляет в коллекцию предложенный объект и отдает его как результат.
HitCount Реализована Атрибут ObjectCollector.HitCount:<Количество устраненных дублей (INT)> Атрибут возвращает количество предложенных функции Get объектов, которые не были добавлены в коллекцию (см. Get). Атрибут может использоваться для сбора статистики эффективности.
ObjectCount Реализована Атрибут ObjectCollector.ObjectCount:<Количество объектов в коллекции (INT)> Атрибут возвращает общее количество объектов, содержащихся в данный момент в коллекции. Атрибут может использоваться для сбора статистики эффективности.