Перейти к содержанию

Прототип (Prototype)

Prototype создает новый объект копированием уже подготовленного образца.

Опора на ООП

Prototype в первую очередь опирается на инкапсуляцию состояния: объект сам определяет, что именно будет копироваться как образец. Полиморфизм полезен, если разные прототипы клонируются через единый контракт.

Что показывает пример на 1С

  • В CommonModules.Initialize собирается ValueTable-прототип с заранее настроенными колонками Name, Value и Hash.
  • Затем новые таблицы создаются не с нуля, а через Prototype.Copy().
  • Даже такой компактный пример хорошо показывает главную идею: сначала готовим шаблон, потом быстро клонируем его под конкретные задачи.

Пример

#Region Public

Function Init() Export

    Prototype = New ValueTable();
    Prototype.Columns.Add("Name");
    Prototype.Columns.Add("Value");
    Prototype.Columns.Add("Hash");

    Table1 = Prototype.Copy();
    Table2 = Prototype.Copy();

EndFunction

#EndRegion

Особенность платформы

Для 1С это важное практическое замечание: Prototype не всегда нужно реализовывать вручную, потому что для некоторых объектов платформы он уже встроен.

Самый понятный пример - ValueTable.

  • разработчик один раз подготавливает таблицу-образец;
  • затем получает новые экземпляры через Copy() / Скопировать();
  • то есть механизм клонирования уже дан самой платформой.

Поэтому в ряде задач Prototype в 1С - это не отдельный самописный паттерн, а грамотное использование уже готового платформенного API.

Именно поэтому ValueTable так хорошо подходит для объяснения паттерна:

  • таблица выступает как подготовленный образец;
  • Copy() создает новый объект на основе этого образца;
  • клиентский код работает с копией, а не пересобирает структуру заново.

Практически это означает простое правило: если платформа уже умеет безопасно копировать объект, сначала стоит использовать встроенный механизм, а не проектировать собственный Clone().

Где полезен в 1С

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

Когда паттерн лишний

  • если объект примитивен и собирается в несколько строк;
  • если копия должна сильно отличаться от оригинала;
  • если трудно контролировать глубокое и поверхностное копирование.

Источник примера