diff --git "a/docs/refactoring/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271-refactoring.md" "b/docs/refactoring/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271-refactoring.md" new file mode 100644 index 0000000..3a03126 --- /dev/null +++ "b/docs/refactoring/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271-refactoring.md" @@ -0,0 +1,107 @@ +# Диаграмма классов рефакторинга ФабрикаЖелудей + +## До рефакторинга + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ ФабрикаЖелудей │ +├─────────────────────────────────────────────────────────────────┤ +│ - ОпределенияЖелудейПоИмени │ +│ - ОпределенияЖелудейПоПрозвищу │ +│ - ОпределенияНапильников │ +│ - ОпределенияНапильниковПоИмени │ +│ - КэшПрименяемыхНапильников │ +│ - ИнициализируемыеНапильники │ +├─────────────────────────────────────────────────────────────────┤ +│ + ПолучитьОпределенияЖелудей() │ +│ + ПолучитьОпределениеЖелудя() │ +│ + ДобавитьНапильник() │ +│ + ПроинициализироватьНапильники() │ +│ + НайтиЖелудь() │ +│ + СоздатьЗавязь() │ +│ + ПрочитатьИмяЖелудя() │ +│ + ПрочитатьХарактерЖелудя() │ +│ + ОпределитьПрименяемыеНапильники() │ +│ + ... (еще ~20 методов) │ +└─────────────────────────────────────────────────────────────────┘ +``` + +## После рефакторинга + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ ФабрикаЖелудей │ +├─────────────────────────────────────────────────────────────────┤ +│ - РепозиторийОпределенийЖелудей │ +│ - МенеджерНапильников │ +│ - ЧитательАннотаций │ +│ - ФабрикаЗавязей │ +├─────────────────────────────────────────────────────────────────┤ +│ + ПолучитьОпределенияЖелудей() │ +│ + ПолучитьОпределениеЖелудя() │ +│ + ДобавитьНапильник() │ +│ + НайтиЖелудь() │ +│ + ДобавитьДуб() │ +│ + ДобавитьЗавязьИзЛямбды() │ +└─────────────────────────────────────────────────────────────────┘ + │ + │ использует + ▼ +┌──────────────────────┬──────────────────────┬──────────────────────┐ +│ │ │ │ +│ РепозиторийОпреде- │ МенеджерНапильников│ ЧитательАннотаций│ +│ ленийЖелудей │ │ │ +├──────────────────────┼──────────────────────┼──────────────────────┤ +│ - ОпределенияЖелудей-│ - ОпределенияНапиль- │ │ +│ ПоИмени │ ников │ │ +│ - ОпределенияЖелудей-│ - КэшПрименяемых- │ │ +│ ПоПрозвищу │ Напильников │ │ +├──────────────────────┼──────────────────────┼──────────────────────┤ +│ + ПолучитьОпределе- │ + ДобавитьНапильник()│ + ПрочитатьИмяЖелудя()│ +│ нияЖелудей() │ + Проинициализировать-│ + ПрочитатьХарактер-│ +│ + ПолучитьОпределе- │ Напильники() │ Жилудя() │ +│ ниеЖелудя() │ + ПрименитьНапильники│ + ПрочитатьПорядок() │ +│ + СохранитьОпределе- │ + ОпределитьПримен- │ + ПрочитатьПрозвища()│ +│ ниеЖелудя() │ яемыеНапильники() │ + ... │ +└──────────────────────┴──────────────────────┴──────────────────────┘ + +┌─────────────────────────────────────────────────────────────────┐ +│ ФабрикаЗавязей │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +├─────────────────────────────────────────────────────────────────┤ +│ + СоздатьЗавязь() │ +│ - СоздатьЗавязьЧерезКонструкторОбъекта() │ +│ - СоздатьЗавязьЧерезМетодЗавязи() │ +│ - СоздатьЗавязьЧерезМетодЛямбды() │ +└─────────────────────────────────────────────────────────────────┘ +``` + +## Основные преимущества рефакторинга + +### 1. Разделение ответственностей (Single Responsibility Principle) +- **ФабрикаЖелудей**: Фокус на создании желудей и координации процесса +- **МенеджерНапильников**: Управление жизненным циклом напильников +- **РепозиторийОпределенийЖелудей**: Хранение и поиск определений +- **ЧитательАннотаций**: Парсинг параметров из аннотаций +- **ФабрикаЗавязей**: Создание различных типов завязей + +### 2. Уменьшение сложности +- Размер ФабрикаЖелудей уменьшился с ~738 строк до ~360 строк +- Каждый класс решает конкретную задачу +- Легче тестировать и поддерживать + +### 3. Переиспользование и расширение +- Классы можно использовать независимо +- Легче добавлять новую функциональность +- Можно заменять реализации отдельных компонентов + +### 4. Читаемость кода +- Название классов четко описывает их назначение +- Методы сгруппированы по логике +- Уменьшено количество зависимостей между методами + +### 5. Возможности для дальнейшего развития +- Можно выделить дополнительные приемки для валидации +- Легко добавить новые типы завязей +- Возможность оптимизации отдельных компонентов \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\276\320\262.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\276\320\262.os" new file mode 100644 index 0000000..a6703f8 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\235\320\260\320\277\320\270\320\273\321\214\320\275\320\270\320\272\320\276\320\262.os" @@ -0,0 +1,185 @@ +#Использовать logos + +#Область ОписаниеПеременных + +// РепозиторийОпределенийЖелудей - репозиторий для получения списков определений +Перем _РепозиторийОпределенийЖелудей; + +// Поделка - Управляющий ioc-контейнер. +Перем _Поделка; + +// Массив из ОпределениеЖелудя - Список определений желудей, являющихся напильниками. +Перем ОпределенияНапильников; + +// Соответствие, в котором хранятся все определения желудей, являющихся напильниками. +// * Ключ - Строка - имя желудя. +// * Значение - ОпределениеЖелудя - определение напильника. +Перем ОпределенияНапильниковПоИмени; + +// Соответствие - Соответствие, в котором хранится список применяемых к конкретному +// желудю напильников. +// * Ключ - Строка - имя желудя. +// * Значение - ОпределениеЖелудя - определение напильника. +Перем КэшПрименяемыхНапильников; + +// Массив из ОпределениеЖелудя - Список инициализируемых в данный момент напильников. +Перем ИнициализируемыеНапильники; + +// Лог - Логгер МенеджераНапильников. +Перем Лог; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +Функция ДобавитьНапильник(ОпределениеНапильника) Экспорт + + // Реинициализация сортированного списка напильников для возможности их использования в заготовках. + ОпределенияНапильников = _РепозиторийОпределенийЖелудей.ПолучитьСписокОпределенийЖелудей("Напильник"); + КэшПрименяемыхНапильников.Очистить(); + ОпределенияНапильниковПоИмени.Вставить(ОпределениеНапильника.Имя(), ОпределениеНапильника); + +КонецФункции + +Процедура ПроинициализироватьНапильники() Экспорт + + Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл + _Поделка.НайтиЖелудь(ОпределениеНапильника.Имя()); + КонецЦикла; + +КонецПроцедуры + +Функция ЭтоНапильник(ОпределениеЖелудя) Экспорт + Возврат ОпределенияНапильниковПоИмени.Получить(ОпределениеЖелудя.Имя()) <> Неопределено; +КонецФункции + +Процедура НачатьИнициализациюНапильника(ИмяНапильника) Экспорт + Если ИнициализируемыеНапильники.Найти(ИмяНапильника) = Неопределено Тогда + ИнициализируемыеНапильники.Добавить(ИмяНапильника); + КонецЕсли; +КонецПроцедуры + +Процедура ЗавершитьИнициализациюНапильника(ИмяНапильника) Экспорт + ИндексНапильника = ИнициализируемыеНапильники.Найти(ИмяНапильника); + Если ИндексНапильника <> Неопределено Тогда + ИнициализируемыеНапильники.Удалить(ИндексНапильника); + КонецЕсли; +КонецПроцедуры + +Функция НапильникИнициализируется(ИмяНапильника) Экспорт + Возврат ИнициализируемыеНапильники.Найти(ИмяНапильника) <> Неопределено; +КонецФункции + +Функция ОпределитьПрименяемыеНапильники(ОпределениеЖелудя) Экспорт + + ИмяЖелудя = ОпределениеЖелудя.Имя(); + + ПрименяемыеНапильники = КэшПрименяемыхНапильников.Получить(ИмяЖелудя); + Если ПрименяемыеНапильники <> Неопределено Тогда + Возврат ПрименяемыеНапильники; + КонецЕсли; + + Лог.Отладка("Кэш применяемых напильников для желудя %1 пуст. Выполняется расчет...", ИмяЖелудя); + + ПрименяемыеНапильники = Новый Массив; + + АннотацииЗавязи = ОпределениеЖелудя.Завязь().ДанныеМетода().Аннотации; + АннотацияОсобоеОбращение = РаботаСАннотациями.НайтиАннотацию(АннотацииЗавязи, "ОсобоеОбращение"); + ОпределениеАннотацииОсобоеОбращение = _Поделка.ПолучитьОпределениеАннотации("ОсобоеОбращение"); + Если АннотацияОсобоеОбращение <> Неопределено Тогда + ОбъектАннотацииОсобоеОбращение = ОпределениеАннотацииОсобоеОбращение.СоздатьОбъектАннотации(АннотацияОсобоеОбращение); + КонецЕсли; + + Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл + + ИмяНапильника = ОпределениеНапильника.Имя(); + Лог.Отладка("Проверка применения напильника %1", ИмяНапильника); + + КорневаяАннотация = ОпределениеНапильника.КорневаяАннотация(); + + НапильникМожетПрименяться = КорневаяАннотация.МожетПрименятьсяНа(ОпределениеЖелудя); + + Лог.Отладка("Напильник %1 может применяться на желуде %2: %3", + ИмяНапильника, + ИмяЖелудя, + НапильникМожетПрименяться + ); + + Если НапильникМожетПрименяться И ОбъектАннотацииОсобоеОбращение <> Неопределено Тогда + НапильникМожетПрименяться = ОбъектАннотацииОсобоеОбращение.НапильникМожетПрименяться(ИмяНапильника); + + Лог.Отладка( + "Желудь %1 требует особого обращения. Напильник %2 применяется: %3", + ИмяЖелудя, + ИмяНапильника, + НапильникМожетПрименяться + ); + КонецЕсли; + + Если НапильникМожетПрименяться Тогда + ПрименяемыеНапильники.Добавить(ОпределениеНапильника); + КонецЕсли; + + КонецЦикла; + + КэшПрименяемыхНапильников.Вставить(ИмяЖелудя, ПрименяемыеНапильники); + + Возврат ПрименяемыеНапильники; + +КонецФункции + +Функция ПрименитьНапильники(Желудь, ОпределениеЖелудя) Экспорт + + ПрименяемыеНапильники = ОпределитьПрименяемыеНапильники(ОпределениеЖелудя); + + Для Каждого ОпределениеНапильника Из ПрименяемыеНапильники Цикл + + Если ОпределениеНапильника.Имя() = ОпределениеЖелудя.Имя() Тогда + ТекстСообщения = СтрШаблон( + "Напильник %1 не может быть применен сам к себе", + ОпределениеНапильника.Имя() + ); + Лог.Отладка(ТекстСообщения); + + Продолжить; + КонецЕсли; + + Если НапильникИнициализируется(ОпределениеНапильника.Имя()) Тогда + ТекстСообщения = СтрШаблон( + "Напильник %1 не может быть применен к желудю %2, так как он уже инициализируется.", + ОпределениеНапильника.Имя(), + ОпределениеЖелудя.Имя() + ); + Лог.Отладка(ТекстСообщения); + + Продолжить; + КонецЕсли; + + Напильник = _Поделка.НайтиЖелудь(ОпределениеНапильника.Имя()); + Желудь = Напильник.ОбработатьЖелудь(Желудь, ОпределениеЖелудя); + + КонецЦикла; + + Возврат Желудь; + +КонецФункции + +#КонецОбласти + +#Область Инициализация + +Процедура ПриСозданииОбъекта(пПоделка, пРепозиторийОпределенийЖелудей) + + _Поделка = пПоделка; + _РепозиторийОпределенийЖелудей = пРепозиторийОпределенийЖелудей; + + ИнициализируемыеНапильники = Новый Массив(); + ОпределенияНапильниковПоИмени = Новый Соответствие(); + ОпределенияНапильников = Новый Массив(); + КэшПрименяемыхНапильников = Новый Соответствие(); + + Лог = Логирование.ПолучитьЛог("oscript.lib.autumn.core.МенеджерНапильников"); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\265\320\274\320\272\320\260\320\224\321\203\320\261.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\265\320\274\320\272\320\260\320\224\321\203\320\261.os" new file mode 100644 index 0000000..7612f52 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\265\320\274\320\272\320\260\320\224\321\203\320\261.os" @@ -0,0 +1,119 @@ +#Область ОписаниеПеременных + +Перем Поделка; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +Процедура ПриДобавленииОпределенияЖелудя(Знач ОпределениеЖелудя) Экспорт + + ЭтоДуб = ОпределениеЖелудя.Прозвища().Найти("Дуб") <> Неопределено; + Если НЕ ЭтоДуб Тогда + Возврат; + КонецЕсли; + + ИмяКорневойАннотации = "Завязь"; + МетодыЗавязи = ОпределениеЖелудя.НайтиМетодыСАннотациями(ИмяКорневойАннотации); + + Для Каждого МетодЗавязи Из МетодыЗавязи Цикл + + ИмяЖелудя = ПолучитьЧитательАннотаций().ПрочитатьИмяЖелудя(МетодЗавязи.Аннотации, ИмяКорневойАннотации, МетодЗавязи.Имя); + ТипЖелудя = ПолучитьЧитательАннотаций().ПрочитатьТипЖелудя(МетодЗавязи, МетодЗавязи.Аннотации); + + ОпределениеЗавязи = СоздатьОпределениеЖелудя( + ИмяЖелудя, + ТипЖелудя, + ОпределениеЖелудя.ТипЖелудя(), + МетодЗавязи, + МетодЗавязи.Аннотации, + ИмяКорневойАннотации + ); + ПолучитьРепозиторийОпределенийЖелудей().СохранитьОпределениеЖелудя(ОпределениеЗавязи); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЧитательАннотаций() + Возврат Поделка.НайтиЖелудь("ЧитательАннотаций"); +КонецФункции + +Функция ПолучитьРепозиторийОпределенийЖелудей() + Возврат Поделка.НайтиЖелудь("РепозиторийОпределенийЖелудей"); +КонецФункции + +Функция ПолучитьФабрикаЗавязей() + Возврат Поделка.НайтиЖелудь("ФабрикаЗавязей"); +КонецФункции + +Функция ПолучитьРазворачивательАннотаций() + Возврат Поделка.НайтиЖелудь("РазворачивательАннотаций"); +КонецФункции + +Функция ПолучитьПрилепляторЧастиц() + Возврат Поделка.НайтиЖелудь("ПрилепляторЧастиц"); +КонецФункции + +Функция СоздатьОпределениеЖелудя(ИмяЖелудя, ТипЖелудя, ВладелецСвойств, Конструктор, Аннотации, ИмяКорневойАннотации) + + Завязь = ПолучитьФабрикаЗавязей().СоздатьЗавязь(ВладелецСвойств, Конструктор); + + ПрилепляемыеЧастицы = ПрочитатьПрилепляемыеЧастицыВМетоде(Конструктор, ВладелецСвойств); + Характер = ПолучитьЧитательАннотаций().ПрочитатьХарактерЖелудя(Аннотации); + Прозвища = ПолучитьЧитательАннотаций().ПрочитатьПрозвища(Аннотации, ИмяЖелудя); + Порядок = ПолучитьЧитательАннотаций().ПрочитатьПорядок(Аннотации); + Верховный = ПолучитьЧитательАннотаций().ПрочитатьПризнакВерховногоЖелудя(Аннотации); + Спецификация = ПолучитьЧитательАннотаций().ПрочитатьСпецификацию(Аннотации); + КорневаяАннотация = ПолучитьЧитательАннотаций().ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации); + + ОпределениеЖелудя = Новый ОпределениеЖелудя( + ПолучитьРазворачивательАннотаций(), + ТипЖелудя, + ИмяЖелудя, + Характер, + ПрилепляемыеЧастицы, + Завязь, + Прозвища, + Порядок, + Верховный, + Спецификация, + КорневаяАннотация + ); + + Возврат ОпределениеЖелудя; + +КонецФункции + +Функция ПрочитатьПрилепляемыеЧастицыВМетоде(Метод, ВладелецСвойств) + + ПрилепляемыеЧастицы = Новый Массив; + Для Каждого ПараметрМетода Из Метод.Параметры Цикл + + ПолучитьРазворачивательАннотаций().РазвернутьАннотацииСвойства(ПараметрМетода, ВладелецСвойств); + + ПрилепляемаяЧастица = ПолучитьПрилепляторЧастиц().ДанныеОПрилепляемойЧастице(ПараметрМетода); + ПрилепляемыеЧастицы.Добавить(ПрилепляемаяЧастица); + + КонецЦикла; + + Возврат ПрилепляемыеЧастицы; + +КонецФункции + +#КонецОбласти + +#Область Инициализация + +&Приемка +Процедура ПриСозданииОбъекта(&Пластилин("Поделка") пПоделка) + + Поделка = пПоделка; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\271\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\271\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" new file mode 100644 index 0000000..0a97a39 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\271\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" @@ -0,0 +1,132 @@ +#Область ОписаниеПеременных + +// Соответствие, в котором хранятся все определения желудей: +// * Ключ - Строка - имя желудя. +// * Значение - ОпределениеЖелудя - определение желудя. +Перем ОпределенияЖелудейПоИмени; + +// Соответствие, в котором хранятся все определения желудей. +// * Ключ - Строка - прозвище желудя +// * Значение - Массив из ОпределениеЖелудя - определения желудей с таким прозвищем. +Перем ОпределенияЖелудейПоПрозвищу; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +Функция ПолучитьОпределенияЖелудей() Экспорт + Возврат Новый ФиксированноеСоответствие(ОпределенияЖелудейПоИмени); +КонецФункции + +Функция ПолучитьОпределениеЖелудя(Имя) Экспорт + НайденноеОпределение = ОпределенияЖелудейПоИмени.Получить(Имя); + Если НайденноеОпределение <> Неопределено Тогда + Возврат НайденноеОпределение; + КонецЕсли; + + НайденныеОпределения = ОпределенияЖелудейПоПрозвищу.Получить(Имя); + Если НайденныеОпределения = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если НайденныеОпределения.Количество() = 1 Тогда + Возврат НайденныеОпределения[0]; + КонецЕсли; + + НайденноеОпределение = НайтиОпределениеВерховного(НайденныеОпределения); + + Если НайденноеОпределение = Неопределено Тогда + ВызватьИсключение "Найдено несколько желудей с именем/прозвищем """ + Имя + """"; + КонецЕсли; + + Возврат НайденноеОпределение; +КонецФункции + +Функция ПолучитьСписокОпределенийЖелудей(Имя) Экспорт + + Результат = Новый Массив; + + НайденноеОпределение = ОпределенияЖелудейПоИмени.Получить(Имя); + Если НайденноеОпределение <> Неопределено Тогда + Результат.Добавить(НайденноеОпределение); + Возврат Новый ФиксированныйМассив(Результат); + КонецЕсли; + + Результат = Новый ТаблицаЗначений(); + Результат.Колонки.Добавить("Порядок"); + Результат.Колонки.Добавить("ОпределениеЖелудя"); + + НайденныеОпределения = ОпределенияЖелудейПоПрозвищу.Получить(Имя); + + Если НайденныеОпределения <> Неопределено Тогда + Для Каждого Определение Из НайденныеОпределения Цикл + Строка = Результат.Добавить(); + Строка.ОпределениеЖелудя = Определение; + Строка.Порядок = Определение.Порядок(); + КонецЦикла; + КонецЕсли; + + Результат.Сортировать("Порядок Возр"); + КопияРезультат = Результат.ВыгрузитьКолонку("ОпределениеЖелудя"); + + Возврат Новый ФиксированныйМассив(КопияРезультат); + +КонецФункции + +Процедура СохранитьОпределениеЖелудя(ОпределениеЖелудя) Экспорт + + СохраненноеОпределениеЖелудя = ОпределенияЖелудейПоИмени.Получить(ОпределениеЖелудя.Имя()); + Если СохраненноеОпределениеЖелудя <> Неопределено Тогда + Если ОпределениеЖелудя.Верховный() И СохраненноеОпределениеЖелудя.Верховный() Тогда + ВызватьИсключение "Определение верховного желудя с именем """ + ОпределениеЖелудя.Имя() + """ уже существует"; + ИначеЕсли ОпределениеЖелудя.Верховный() И НЕ СохраненноеОпределениеЖелудя.Верховный() Тогда + // no-op: Допустимая ситуация переопределения. + // todo: Логирование + ИначеЕсли НЕ ОпределениеЖелудя.Верховный() И СохраненноеОпределениеЖелудя.Верховный() Тогда + // no-op: Допустимая ситуация непереопределения. + // todo: Логирование + Возврат; + Иначе + ВызватьИсключение "Определение желудя с именем """ + ОпределениеЖелудя.Имя() + """ уже существует"; + КонецЕсли; + КонецЕсли; + + ОпределенияЖелудейПоИмени.Вставить(ОпределениеЖелудя.Имя(), ОпределениеЖелудя); + + Прозвища = ОпределениеЖелудя.Прозвища(); + Для Каждого Прозвище Из Прозвища Цикл + + СуществующиеИмена = ОпределенияЖелудейПоПрозвищу.Получить(Прозвище); + Если СуществующиеИмена = Неопределено Тогда + СуществующиеИмена = Новый Массив; + КонецЕсли; + СуществующиеИмена.Добавить(ОпределениеЖелудя); + ОпределенияЖелудейПоПрозвищу.Вставить(Прозвище, СуществующиеИмена); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НайтиОпределениеВерховного(Коллекция) + Для Каждого Элемент Из Коллекция Цикл + Если Элемент.Верховный() = Истина Тогда + Возврат Элемент; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + +#КонецОбласти + +#Область Инициализация + +Процедура ПриСозданииОбъекта() + ОпределенияЖелудейПоИмени = Новый Соответствие(); + ОпределенияЖелудейПоПрозвищу = Новый Соответствие(); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" index b5edf4c..80e548f 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\224\321\203\320\261\320\236\321\201\320\265\320\275\320\270.os" @@ -26,6 +26,46 @@ Возврат ПрилепляторЧастиц; КонецФункции +&Завязь +&Спецификация("Инициализация") +Функция МенеджерНапильников(&Пластилин Поделка) Экспорт + Рефлектор = Новый Рефлектор(); + ФабрикаЖелудей = Рефлектор.ПолучитьСвойство(Поделка, "ФабрикаЖелудей"); + МенеджерНапильников = Рефлектор.ПолучитьСвойство(ФабрикаЖелудей, "МенеджерНапильников"); + + Возврат МенеджерНапильников; +КонецФункции + +&Завязь +&Спецификация("Инициализация") +Функция РепозиторийОпределенийЖелудей(&Пластилин Поделка) Экспорт + Рефлектор = Новый Рефлектор(); + ФабрикаЖелудей = Рефлектор.ПолучитьСвойство(Поделка, "ФабрикаЖелудей"); + РепозиторийОпределенийЖелудей = Рефлектор.ПолучитьСвойство(ФабрикаЖелудей, "РепозиторийОпределенийЖелудей"); + + Возврат РепозиторийОпределенийЖелудей; +КонецФункции + +&Завязь +&Спецификация("Инициализация") +Функция ЧитательАннотаций(&Пластилин Поделка) Экспорт + Рефлектор = Новый Рефлектор(); + ФабрикаЖелудей = Рефлектор.ПолучитьСвойство(Поделка, "ФабрикаЖелудей"); + ЧитательАннотаций = Рефлектор.ПолучитьСвойство(ФабрикаЖелудей, "ЧитательАннотаций"); + + Возврат ЧитательАннотаций; +КонецФункции + +&Завязь +&Спецификация("Инициализация") +Функция ФабрикаЗавязей(&Пластилин Поделка) Экспорт + Рефлектор = Новый Рефлектор(); + ФабрикаЖелудей = Рефлектор.ПолучитьСвойство(Поделка, "ФабрикаЖелудей"); + ФабрикаЗавязей = Рефлектор.ПолучитьСвойство(ФабрикаЖелудей, "ФабрикаЗавязей"); + + Возврат ФабрикаЗавязей; +КонецФункции + &Дуб &Спецификация("Инициализация") Процедура ПриСозданииОбъекта() diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" index dd9b2ba..d639714 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" @@ -3,144 +3,56 @@ #Использовать fluent #Использовать reflector -#Область ОписаниеПеременных - -// Поделка - Управляющий ioc-контейнер. -Перем Поделка; -// РазворачивательАннотаций - разворачиватель аннотаций свойств и методов желудей. -Перем РазворачивательАннотаций; -// ПрилепляторЧастиц - объект, который умеет прилеплять частицы к желудям. -Перем ПрилепляторЧастиц; - -// Соответствие, в котором хранятся все определения желудей: -// * Ключ - Строка - имя желудя. -// * Значение - ОпределениеЖелудя - определение желудя. -Перем ОпределенияЖелудейПоИмени; - -// Соответствие, в котором хранятся все определения желудей. -// * Ключ - Строка - прозвище желудя -// * Значение - Массив из ОпределениеЖелудя - определения желудей с таким прозвищем. -Перем ОпределенияЖелудейПоПрозвищу; - -// Массив из ОпределениеЖелудя - Список определений желудей, являющихся напильниками. -Перем ОпределенияНапильников; - -// Соответствие, в котором хранятся все определения желудей, являющихся напильниками. -// * Ключ - Строка - имя желудя. -// * Значение - ОпределениеЖелудя - определение напильника. -Перем ОпределенияНапильниковПоИмени; - -// Соответствие - Соответствие, в котором хранится список применяемых к конкретному -// желудю напильников. -// * Ключ - Строка - имя желудя. -// * Значение - ОпределениеЖелудя - определение напильника. -Перем КэшПрименяемыхНапильников; - -// Массив из ОпределениеЖелудя - Список инициализируемых в данный момент напильников. -Перем ИнициализируемыеНапильники; - -// Лог - Логгер ФабрикиЖелудей. -Перем Лог; - -// Рефлектор - кеш инстанса рефлектора +#Область ОписаниеПеременных + +// Поделка - Управляющий ioc-контейнер. +Перем Поделка; +// РазворачивательАннотаций - разворачиватель аннотаций свойств и методов желудей. +Перем РазворачивательАннотаций; +// ПрилепляторЧастиц - объект, который умеет прилеплять частицы к желудям. +Перем ПрилепляторЧастиц; + +// РепозиторийОпределенийЖелудей - хранилище определений желудей +Перем РепозиторийОпределенийЖелудей; + +// МенеджерНапильников - управляющий работой с напильниками +Перем МенеджерНапильников; + +// ЧитательАннотаций - читатель параметров из аннотаций +Перем ЧитательАннотаций; + +// ФабрикаЗавязей - фабрика для создания завязей +Перем ФабрикаЗавязей; + +// Рефлектор - кеш инстанса рефлектора Перем Рефлектор; #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс -Функция ПолучитьОпределенияЖелудей() Экспорт - Возврат Новый ФиксированноеСоответствие(ОпределенияЖелудейПоИмени); -КонецФункции - -Функция ПолучитьОпределениеЖелудя(Имя) Экспорт - НайденноеОпределение = ОпределенияЖелудейПоИмени.Получить(Имя); - Если НайденноеОпределение <> Неопределено Тогда - Возврат НайденноеОпределение; - КонецЕсли; - - НайденныеОпределения = ОпределенияЖелудейПоПрозвищу.Получить(Имя); - Если НайденныеОпределения = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Если НайденныеОпределения.Количество() = 1 Тогда - Возврат НайденныеОпределения[0]; - КонецЕсли; - - НайденноеОпределение = НайтиОпределениеВерховного(НайденныеОпределения); - - Если НайденноеОпределение = Неопределено Тогда - ВызватьИсключение "Найдено несколько желудей с именем/прозвищем """ + Имя + """"; - КонецЕсли; - - Возврат НайденноеОпределение; -КонецФункции - -Функция ПолучитьСписокОпределенийЖелудей(Имя) Экспорт - - Результат = Новый Массив; - - НайденноеОпределение = ОпределенияЖелудейПоИмени.Получить(Имя); - Если НайденноеОпределение <> Неопределено Тогда - Результат.Добавить(НайденноеОпределение); - Возврат Новый ФиксированныйМассив(Результат); - КонецЕсли; - - Результат = Новый ТаблицаЗначений(); - Результат.Колонки.Добавить("Порядок"); - Результат.Колонки.Добавить("ОпределениеЖелудя"); - - НайденныеОпределения = ОпределенияЖелудейПоПрозвищу.Получить(Имя); - - Если НайденныеОпределения <> Неопределено Тогда - Для Каждого Определение Из НайденныеОпределения Цикл - Строка = Результат.Добавить(); - Строка.ОпределениеЖелудя = Определение; - Строка.Порядок = Определение.Порядок(); - КонецЦикла; - КонецЕсли; - - Результат.Сортировать("Порядок Возр"); - КопияРезультат = Результат.ВыгрузитьКолонку("ОпределениеЖелудя"); - - Возврат Новый ФиксированныйМассив(КопияРезультат); - -КонецФункции - -Процедура ПроинициализироватьНапильники() Экспорт - - Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл - Поделка.НайтиЖелудь(ОпределениеНапильника.Имя()); - КонецЦикла; - +Функция ПолучитьОпределенияЖелудей() Экспорт + Возврат РепозиторийОпределенийЖелудей.ПолучитьОпределенияЖелудей(); +КонецФункции + +Функция ПолучитьОпределениеЖелудя(Имя) Экспорт + Возврат РепозиторийОпределенийЖелудей.ПолучитьОпределениеЖелудя(Имя); +КонецФункции + +Функция ПолучитьСписокОпределенийЖелудей(Имя) Экспорт + Возврат РепозиторийОпределенийЖелудей.ПолучитьСписокОпределенийЖелудей(Имя); +КонецФункции + +Процедура ПроинициализироватьНапильники() Экспорт + МенеджерНапильников.ПроинициализироватьНапильники(); КонецПроцедуры -Функция ДобавитьДуб(ТипДуба) Экспорт - - ИмяКорневойАннотации = "Завязь"; - ОпределениеЖелудя = ДобавитьЖителяЛеса(ТипДуба, "", "Дуб"); - МетодыЗавязи = ОпределениеЖелудя.НайтиМетодыСАннотациями(ИмяКорневойАннотации); - - Для Каждого МетодЗавязи Из МетодыЗавязи Цикл - - ИмяЖелудя = ПрочитатьИмяЖелудя(МетодЗавязи.Аннотации, ИмяКорневойАннотации, МетодЗавязи.Имя); - ТипЖелудя = ПрочитатьТипЖелудя(МетодЗавязи, МетодЗавязи.Аннотации); - - ОпределениеЗавязи = СоздатьОпределениеЖелудя( - ИмяЖелудя, - ТипЖелудя, - ТипДуба, - МетодЗавязи, - МетодЗавязи.Аннотации, - ИмяКорневойАннотации - ); - СохранитьОпределениеЖелудя(ОпределениеЗавязи); - - КонецЦикла; - - Возврат ОпределениеЖелудя; - +Функция ДобавитьДуб(ТипДуба) Экспорт + + ОпределениеЖелудя = ДобавитьЖителяЛеса(ТипДуба, "", "Дуб"); + + Возврат ОпределениеЖелудя; + КонецФункции Функция ДобавитьЗавязьИзЛямбды(ЛямбдаЗавязи, Контекст = Неопределено) Экспорт @@ -173,160 +85,116 @@ КонецЕсли; - Завязь = Завязи[0]; - - ИмяЖелудя = ПрочитатьИмяЖелудя(Завязь.Аннотации, ИмяКорневойАннотации, ""); - ТипЖелудя = ПрочитатьТипЖелудя(Завязь, Завязь.Аннотации); - - ОпределениеЗавязи = СоздатьОпределениеЖелудя( - ИмяЖелудя, - ТипЖелудя, - Объект, - Завязь, - Завязь.Аннотации, - ИмяКорневойАннотации - ); - - СохранитьОпределениеЖелудя(ОпределениеЗавязи); + Завязь = Завязи[0]; + + ИмяЖелудя = ЧитательАннотаций.ПрочитатьИмяЖелудя(Завязь.Аннотации, ИмяКорневойАннотации, ""); + ТипЖелудя = ЧитательАннотаций.ПрочитатьТипЖелудя(Завязь, Завязь.Аннотации); + + ОпределениеЗавязи = СоздатьОпределениеЖелудя( + ИмяЖелудя, + ТипЖелудя, + Объект, + Завязь, + Завязь.Аннотации, + ИмяКорневойАннотации + ); + + РепозиторийОпределенийЖелудей.СохранитьОпределениеЖелудя(ОпределениеЗавязи); Возврат ОпределениеЗавязи; КонецФункции -Функция ДобавитьНапильник(ТипНапильника) Экспорт - ОпределениеНапильника = ДобавитьЖителяЛеса(ТипНапильника, "", "Напильник"); - - // Реинициализация сортированного списка напильников для возможности их использования в заготовках. - ОпределенияНапильников = ПолучитьСписокОпределенийЖелудей("Напильник"); - КэшПрименяемыхНапильников.Очистить(); - ОпределенияНапильниковПоИмени.Вставить(ОпределениеНапильника.Имя(), ОпределениеНапильника); - - Возврат ОпределениеНапильника; +Функция ДобавитьНапильник(ТипНапильника) Экспорт + ОпределениеНапильника = ДобавитьЖителяЛеса(ТипНапильника, "", "Напильник"); + + МенеджерНапильников.ДобавитьНапильник(ОпределениеНапильника); + + Возврат ОпределениеНапильника; КонецФункции -Функция НайтиЖелудь(ИмяЖелудя, ПрилепляемыеЧастицы) Экспорт - - ОпределениеЖелудя = Поделка.ПолучитьОпределениеЖелудя(ИмяЖелудя); - - Если ОпределениеЖелудя = Неопределено Тогда - ВызватьИсключение СтрШаблон("Не удалось получить определение Желудя по имени Желудя %1", ИмяЖелудя); - КонецЕсли; - - ЭтоНапильник = ОпределенияНапильниковПоИмени.Получить(ОпределениеЖелудя.Имя()) <> Неопределено; - - Если ЭтоНапильник Тогда - Если ИнициализируемыеНапильники.Найти(ОпределениеЖелудя.Имя()) = Неопределено Тогда - ИнициализируемыеНапильники.Добавить(ОпределениеЖелудя.Имя()); - КонецЕсли; - КонецЕсли; - - ПереданныеПрилепляемыеЧастицы = ПрилепляемыеЧастицы; - Если ПереданныеПрилепляемыеЧастицы = Неопределено Тогда - ПереданныеПрилепляемыеЧастицы = Новый Массив; - КонецЕсли; - - Если ПереданныеПрилепляемыеЧастицы.Количество() = ОпределениеЖелудя.ПрилепляемыеЧастицы().Количество() Тогда - ПередаваемыеПрилепляемыеЧастицы = ПереданныеПрилепляемыеЧастицы; - Иначе - - КоличествоБлестяшек = ПосчитатьКоличествоБлестяшек(ОпределениеЖелудя.ПрилепляемыеЧастицы()); - - Если КоличествоБлестяшек <> ПереданныеПрилепляемыеЧастицы.Количество() Тогда - ВызватьИсключение СтрШаблон( - "При поиске желудя %1 количество переданных произвольных параметров отличается от количества параметров не-желудей/не-деталек.", - ИмяЖелудя - ); - КонецЕсли; - - СчетчикИспользованияБлестяшек = 0; - ПередаваемыеПрилепляемыеЧастицы = Новый Массив; - Для Каждого ДанныеОПрилепляемойЧастице Из ОпределениеЖелудя.ПрилепляемыеЧастицы() Цикл - - Если ДанныеОПрилепляемойЧастице.ТипЧастицы() = ТипыПрилепляемыхЧастиц.Блестяшка() Тогда - ПрилепляемаяЧастица = ПереданныеПрилепляемыеЧастицы[СчетчикИспользованияБлестяшек]; - СчетчикИспользованияБлестяшек = СчетчикИспользованияБлестяшек + 1; - Иначе - ПрилепляемаяЧастица = ПрилепляторЧастиц.НайтиПрилепляемуюЧастицу(ДанныеОПрилепляемойЧастице); - КонецЕсли; - - ПередаваемыеПрилепляемыеЧастицы.Добавить(ПрилепляемаяЧастица); - КонецЦикла; - КонецЕсли; - - Завязь = ОпределениеЖелудя.Завязь(); - - Действие = Завязь.Действие(); - Если Завязь.ЭтоКонструктор() Тогда - Желудь = Действие.Выполнить(ОпределениеЖелудя.ТипЖелудя(), ПередаваемыеПрилепляемыеЧастицы); - ИначеЕсли Не ЗначениеЗаполнено(Завязь.Родитель()) Тогда - Желудь = Рефлектор.ВызватьМетод(Действие, "Выполнить", ПередаваемыеПрилепляемыеЧастицы); - Иначе - Желудь = Действие.Выполнить(Поделка, Завязь.Родитель(), Завязь.ИмяМетода(), ПередаваемыеПрилепляемыеЧастицы); - КонецЕсли; - - Если ЭтоНапильник Тогда - ИндексНапильника = ИнициализируемыеНапильники.Найти(ОпределениеЖелудя.Имя()); - ИнициализируемыеНапильники.Удалить(ИндексНапильника); - Иначе - Если НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда - - ПрименяемыеНапильники = ОпределитьПрименяемыеНапильники(ОпределениеЖелудя); - - Для Каждого ОпределениеНапильника Из ПрименяемыеНапильники Цикл - - Если ОпределениеНапильника.Имя() = ОпределениеЖелудя.Имя() Тогда - ТекстСообщения = СтрШаблон( - "Напильник %1 не может быть применен сам к себе", - ОпределениеНапильника.Имя() - ); - Лог.Отладка(ТекстСообщения); - - Продолжить; - КонецЕсли; - - Если ИнициализируемыеНапильники.Найти(ОпределениеНапильника.Имя()) <> Неопределено Тогда - ТекстСообщения = СтрШаблон( - "Напильник %1 не может быть применен к желудю %2, так как он уже инициализируется.", - ОпределениеНапильника.Имя(), - ОпределениеЖелудя.Имя() - ); - Лог.Отладка(ТекстСообщения); - - Продолжить; - КонецЕсли; - - Напильник = Поделка.НайтиЖелудь(ОпределениеНапильника.Имя()); - Желудь = Напильник.ОбработатьЖелудь(Желудь, ОпределениеЖелудя); - - КонецЦикла; - КонецЕсли; - КонецЕсли; - - Возврат Желудь; - +Функция НайтиЖелудь(ИмяЖелудя, ПрилепляемыеЧастицы) Экспорт + + ОпределениеЖелудя = Поделка.ПолучитьОпределениеЖелудя(ИмяЖелудя); + + Если ОпределениеЖелудя = Неопределено Тогда + ВызватьИсключение СтрШаблон("Не удалось получить определение Желудя по имени Желудя %1", ИмяЖелудя); + КонецЕсли; + + ЭтоНапильник = МенеджерНапильников.ЭтоНапильник(ОпределениеЖелудя); + + Если ЭтоНапильник Тогда + МенеджерНапильников.НачатьИнициализациюНапильника(ОпределениеЖелудя.Имя()); + КонецЕсли; + + ПереданныеПрилепляемыеЧастицы = ПрилепляемыеЧастицы; + Если ПереданныеПрилепляемыеЧастицы = Неопределено Тогда + ПереданныеПрилепляемыеЧастицы = Новый Массив; + КонецЕсли; + + Если ПереданныеПрилепляемыеЧастицы.Количество() = ОпределениеЖелудя.ПрилепляемыеЧастицы().Количество() Тогда + ПередаваемыеПрилепляемыеЧастицы = ПереданныеПрилепляемыеЧастицы; + Иначе + + КоличествоБлестяшек = ПосчитатьКоличествоБлестяшек(ОпределениеЖелудя.ПрилепляемыеЧастицы()); + + Если КоличествоБлестяшек <> ПереданныеПрилепляемыеЧастицы.Количество() Тогда + ВызватьИсключение СтрШаблон( + "При поиске желудя %1 количество переданных произвольных параметров отличается от количества параметров не-желудей/не-деталек.", + ИмяЖелудя + ); + КонецЕсли; + + СчетчикИспользованияБлестяшек = 0; + ПередаваемыеПрилепляемыеЧастицы = Новый Массив; + Для Каждого ДанныеОПрилепляемойЧастице Из ОпределениеЖелудя.ПрилепляемыеЧастицы() Цикл + + Если ДанныеОПрилепляемойЧастице.ТипЧастицы() = ТипыПрилепляемыхЧастиц.Блестяшка() Тогда + ПрилепляемаяЧастица = ПереданныеПрилепляемыеЧастицы[СчетчикИспользованияБлестяшек]; + СчетчикИспользованияБлестяшек = СчетчикИспользованияБлестяшек + 1; + Иначе + ПрилепляемаяЧастица = ПрилепляторЧастиц.НайтиПрилепляемуюЧастицу(ДанныеОПрилепляемойЧастице); + КонецЕсли; + + ПередаваемыеПрилепляемыеЧастицы.Добавить(ПрилепляемаяЧастица); + КонецЦикла; + КонецЕсли; + + Завязь = ОпределениеЖелудя.Завязь(); + + Действие = Завязь.Действие(); + Если Завязь.ЭтоКонструктор() Тогда + Желудь = Действие.Выполнить(ОпределениеЖелудя.ТипЖелудя(), ПередаваемыеПрилепляемыеЧастицы); + ИначеЕсли Не ЗначениеЗаполнено(Завязь.Родитель()) Тогда + Желудь = Рефлектор.ВызватьМетод(Действие, "Выполнить", ПередаваемыеПрилепляемыеЧастицы); + Иначе + Желудь = Действие.Выполнить(Поделка, Завязь.Родитель(), Завязь.ИмяМетода(), ПередаваемыеПрилепляемыеЧастицы); + КонецЕсли; + + Если ЭтоНапильник Тогда + МенеджерНапильников.ЗавершитьИнициализациюНапильника(ОпределениеЖелудя.Имя()); + Иначе + Если НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда + Желудь = МенеджерНапильников.ПрименитьНапильники(Желудь, ОпределениеЖелудя); + КонецЕсли; + КонецЕсли; + + Возврат Желудь; + КонецФункции #КонецОбласти -#Область СлужебныеПроцедурыИФункции - -Функция НайтиОпределениеВерховного(Коллекция) - Для Каждого Элемент Из Коллекция Цикл - Если Элемент.Верховный() = Истина Тогда - Возврат Элемент; - КонецЕсли; - КонецЦикла; - Возврат Неопределено; -КонецФункции - -Функция ПосчитатьКоличествоБлестяшек(ПрилепляемыеЧастицы) - Количество = 0; - Для Каждого Элемент Из ПрилепляемыеЧастицы Цикл - Если Элемент.ТипЧастицы() = ТипыПрилепляемыхЧастиц.Блестяшка() Тогда - Количество = Количество + 1; - КонецЕсли; - КонецЦикла; - Возврат Количество; +#Область СлужебныеПроцедурыИФункции + +Функция ПосчитатьКоличествоБлестяшек(ПрилепляемыеЧастицы) + Количество = 0; + Для Каждого Элемент Из ПрилепляемыеЧастицы Цикл + Если Элемент.ТипЧастицы() = ТипыПрилепляемыхЧастиц.Блестяшка() Тогда + Количество = Количество + 1; + КонецЕсли; + КонецЦикла; + Возврат Количество; КонецФункции Функция ДобавитьЖителяЛеса(ТипЖителяЛеса, ИмяЖителяЛеса, АннотацияНадКонструктором) Экспорт @@ -369,19 +237,19 @@ ); КонецЕсли; - Если Не ЗначениеЗаполнено(ИмяЖителяЛеса) Тогда - ИмяЖителяЛеса = ПрочитатьИмяЖелудя(Аннотации, АннотацияНадКонструктором, Строка(ТипЖителяЛеса)); - КонецЕсли; - - ОпределениеЖелудя = СоздатьОпределениеЖелудя( - ИмяЖителяЛеса, - ТипЖителяЛеса, - ТипЖителяЛеса, - Конструктор, - Аннотации, - АннотацияНадКонструктором - ); - СохранитьОпределениеЖелудя(ОпределениеЖелудя); + Если Не ЗначениеЗаполнено(ИмяЖителяЛеса) Тогда + ИмяЖителяЛеса = ЧитательАннотаций.ПрочитатьИмяЖелудя(Аннотации, АннотацияНадКонструктором, Строка(ТипЖителяЛеса)); + КонецЕсли; + + ОпределениеЖелудя = СоздатьОпределениеЖелудя( + ИмяЖителяЛеса, + ТипЖителяЛеса, + ТипЖителяЛеса, + Конструктор, + Аннотации, + АннотацияНадКонструктором + ); + РепозиторийОпределенийЖелудей.СохранитьОпределениеЖелудя(ОпределениеЖелудя); ПараметрыСобытия = Новый Массив; ПараметрыСобытия.Добавить(ОпределениеЖелудя); @@ -391,348 +259,87 @@ КонецФункции -Функция СоздатьОпределениеЖелудя( - ИмяЖелудя, - ТипЖелудя, - ВладелецСвойств, - Конструктор, - Аннотации, - ИмяКорневойАннотации -) - - Завязь = СоздатьЗавязь(ВладелецСвойств, Конструктор); - - ПрилепляемыеЧастицы = ПрочитатьПрилепляемыеЧастицыВМетоде(Конструктор, ВладелецСвойств); - Характер = ПрочитатьХарактерЖелудя(Аннотации); - Прозвища = ПрочитатьПрозвища(Аннотации, ИмяЖелудя); - Порядок = ПрочитатьПорядок(Аннотации); - Верховный = ПрочитатьПризнакВерховногоЖелудя(Аннотации); - Спецификация = ПрочитатьСпецификацию(Аннотации); - КорневаяАннотация = ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации); - - // TODO: Унести в Приемку &Дуб - // Если Спецификация = СостоянияПриложения.Инициализация() - // И НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда - // ТекстСообщения = СтрШаблон( - // "Дуб %1 имеет завязь %2, которая имеет &Спецификацию ""Инициализация"", но сам дуб не имеет этой спецификации.", - // ОпределениеЖелудя.Имя(), - // Конструктор.Имя - // ); - // ВызватьИсключение ТекстСообщения; - // КонецЕсли; - - ОпределениеЖелудя = Новый ОпределениеЖелудя( - РазворачивательАннотаций, - ТипЖелудя, - ИмяЖелудя, - Характер, - ПрилепляемыеЧастицы, - Завязь, - Прозвища, - Порядок, - Верховный, - Спецификация, - КорневаяАннотация - ); - - Возврат ОпределениеЖелудя; - -КонецФункции - -#Область СозданиеЗавязи - -Функция СоздатьЗавязь(ВладелецСвойств, Конструктор) - - Если НРег(Конструктор.Имя) = НРег("ПриСозданииОбъекта") - ИЛИ НРег(Конструктор.Имя) = НРег("OnObjectCreation") Тогда - - Возврат СоздатьЗавязьЧерезКонструкторОбъекта(ВладелецСвойств, Конструктор); - - ИначеЕсли ТипЗнч(ВладелецСвойств) = Тип("Сценарий") Тогда - - Возврат СоздатьЗавязьЧерезМетодЛямбды(ВладелецСвойств, Конструктор); - - Иначе - - Возврат СоздатьЗавязьЧерезМетодЗавязи(ВладелецСвойств, Конструктор); - - КонецЕсли; - -КонецФункции - -Функция СоздатьЗавязьЧерезКонструкторОбъекта(ТипЖелудя, Конструктор) - - Действие = Новый Действие(ФабричныеМетоды, "КонструкторОбъекта"); - Завязь = Новый Завязь(Строка(ТипЖелудя), Конструктор.Имя, Конструктор, Действие, Истина); - - Возврат Завязь; - -КонецФункции - -Функция СоздатьЗавязьЧерезМетодЗавязи(ТипДуба, МетодЗавязи) - - Действие = Новый Действие(ФабричныеМетоды, "МетодЗавязи"); - Завязь = Новый Завязь(Строка(ТипДуба), МетодЗавязи.Имя, МетодЗавязи, Действие, Ложь); - - Возврат Завязь; - -КонецФункции - -Функция СоздатьЗавязьЧерезМетодЛямбды(Сценарий, МетодЗавязи) - - Действие = Новый Действие(Сценарий, МетодЗавязи.Имя); - Завязь = Новый Завязь("", МетодЗавязи.Имя, МетодЗавязи, Действие, Ложь); - - Возврат Завязь; - -КонецФункции - -#КонецОбласти - -#Область ЧтениеПараметровЖелудя - -Функция ПрочитатьИмяЖелудя(Аннотации, АннотацияНадМетодом, ЗначениеПоУмолчанию) - - Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, АннотацияНадМетодом); - ИмяЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, , ЗначениеПоУмолчанию); - - Возврат ИмяЖелудя; - -КонецФункции - -Функция ПрочитатьТипЖелудя(Метод, Аннотации) - - Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Завязь"); - ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( - Аннотация, - "Тип" - ); - - Если ТипЖелудя = Неопределено Тогда - ТипЖелудя = Метод.Имя; - КонецЕсли; - - Попытка - РеальныйТип = Тип(ТипЖелудя); - Исключение - ВызватьИсключение СтрШаблон( - "Тип желудя в Завязи %1 не известен. Укажите тип желудя в аннотации или переименуйте метод завязи.", - Метод.Имя - ); - КонецПопытки; - - Возврат РеальныйТип; -КонецФункции - -Функция ПрочитатьПрилепляемыеЧастицыВМетоде(Метод, ВладелецСвойств) - - ПрилепляемыеЧастицы = Новый Массив; - Для Каждого ПараметрМетода Из Метод.Параметры Цикл - - РазворачивательАннотаций.РазвернутьАннотацииСвойства(ПараметрМетода, ВладелецСвойств); - - ПрилепляемаяЧастица = ПрилепляторЧастиц.ДанныеОПрилепляемойЧастице(ПараметрМетода); - ПрилепляемыеЧастицы.Добавить(ПрилепляемаяЧастица); - - КонецЦикла; - - Возврат ПрилепляемыеЧастицы; - -КонецФункции - -Функция ПрочитатьХарактерЖелудя(Аннотации) - ЗначениеПоУмолчанию = ХарактерыЖелудей.Одиночка(); - - Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Характер"); - Если Аннотация = Неопределено Тогда - Возврат ЗначениеПоУмолчанию; - КонецЕсли; - - ХарактерЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( - Аннотация, - , - ЗначениеПоУмолчанию - ); - - Если НЕ ХарактерыЖелудей.ЭтоХарактерЖелудя(ХарактерЖелудя) Тогда - ВызватьИсключение "Неизвестный характер желудя " + ХарактерЖелудя; - КонецЕсли; - - Возврат ХарактерЖелудя; -КонецФункции - -Функция ПрочитатьПрозвища(Аннотации, ЗначениеПоУмолчанию) - - Результат = Новый Массив; - Результат.Добавить(ЗначениеПоУмолчанию); - - Прозвища = РаботаСАннотациями.НайтиАннотации(Аннотации, "Прозвище"); - Для Каждого Аннотация Из Прозвища Цикл - Прозвище = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация); - - Результат.Добавить(Прозвище); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ПрочитатьПорядок(Аннотации) - - Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Порядок"); - - ОпределениеАннотации = Поделка.ПолучитьОпределениеАннотации("Порядок"); - ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); - - Возврат ОбъектАннотации.Значение(); - -КонецФункции - -Функция ПрочитатьПризнакВерховногоЖелудя(Аннотации) - - Возврат РаботаСАннотациями.НайтиАннотацию(Аннотации, "Верховный") <> Неопределено; - -КонецФункции - -Функция ПрочитатьСпецификацию(Аннотации) - - Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Спецификация"); - - ОпределениеАннотации = Поделка.ПолучитьОпределениеАннотации("Спецификация"); - ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); - - Возврат ОбъектАннотации.Значение(); - -КонецФункции - -Функция ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации) - - КорневаяАннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, ИмяКорневойАннотации); - ОпределениеАннотации = Поделка.ПолучитьОпределениеАннотации(КорневаяАннотация.Имя); - - ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(КорневаяАннотация); - - Возврат ОбъектАннотации; - -КонецФункции - -#КонецОбласти - -Процедура СохранитьОпределениеЖелудя(ОпределениеЖелудя) - - СохраненноеОпределениеЖелудя = ОпределенияЖелудейПоИмени.Получить(ОпределениеЖелудя.Имя()); - Если СохраненноеОпределениеЖелудя <> Неопределено Тогда - Если ОпределениеЖелудя.Верховный() И СохраненноеОпределениеЖелудя.Верховный() Тогда - ВызватьИсключение "Определение верховного желудя с именем """ + ОпределениеЖелудя.Имя() + """ уже существует"; - ИначеЕсли ОпределениеЖелудя.Верховный() И НЕ СохраненноеОпределениеЖелудя.Верховный() Тогда - // no-op: Допустимая ситуация переопределения. - // todo: Логирование - ИначеЕсли НЕ ОпределениеЖелудя.Верховный() И СохраненноеОпределениеЖелудя.Верховный() Тогда - // no-op: Допустимая ситуация непереопределения. - // todo: Логирование - Возврат; - Иначе - ВызватьИсключение "Определение желудя с именем """ + ОпределениеЖелудя.Имя() + """ уже существует"; - КонецЕсли; - КонецЕсли; - - ОпределенияЖелудейПоИмени.Вставить(ОпределениеЖелудя.Имя(), ОпределениеЖелудя); - - Прозвища = ОпределениеЖелудя.Прозвища(); - Для Каждого Прозвище Из Прозвища Цикл - - СуществующиеИмена = ОпределенияЖелудейПоПрозвищу.Получить(Прозвище); - Если СуществующиеИмена = Неопределено Тогда - СуществующиеИмена = Новый Массив; - КонецЕсли; - СуществующиеИмена.Добавить(ОпределениеЖелудя); - ОпределенияЖелудейПоПрозвищу.Вставить(Прозвище, СуществующиеИмена); - - КонецЦикла; - -КонецПроцедуры - -Функция ОпределитьПрименяемыеНапильники(ОпределениеЖелудя) - - ИмяЖелудя = ОпределениеЖелудя.Имя(); - - ПрименяемыеНапильники = КэшПрименяемыхНапильников.Получить(ИмяЖелудя); - Если ПрименяемыеНапильники <> Неопределено Тогда - Возврат ПрименяемыеНапильники; - КонецЕсли; - - Лог.Отладка("Кэш применяемых напильников для желудя %1 пуст. Выполняется расчет...", ИмяЖелудя); - - ПрименяемыеНапильники = Новый Массив; - - АннотацииЗавязи = ОпределениеЖелудя.Завязь().ДанныеМетода().Аннотации; - АннотацияОсобоеОбращение = РаботаСАннотациями.НайтиАннотацию(АннотацииЗавязи, "ОсобоеОбращение"); - ОпределениеАннотацииОсобоеОбращение = Поделка.ПолучитьОпределениеАннотации("ОсобоеОбращение"); - Если АннотацияОсобоеОбращение <> Неопределено Тогда - ОбъектАннотацииОсобоеОбращение = ОпределениеАннотацииОсобоеОбращение.СоздатьОбъектАннотации(АннотацияОсобоеОбращение); - КонецЕсли; - - Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл - - ИмяНапильника = ОпределениеНапильника.Имя(); - Лог.Отладка("Проверка применения напильника %1", ИмяНапильника); - - КорневаяАннотация = ОпределениеНапильника.КорневаяАннотация(); - - НапильникМожетПрименяться = КорневаяАннотация.МожетПрименятьсяНа(ОпределениеЖелудя); - - Лог.Отладка("Напильник %1 может применяться на желуде %2: %3", - ИмяНапильника, - ИмяЖелудя, - НапильникМожетПрименяться - ); - - Если НапильникМожетПрименяться И ОбъектАннотацииОсобоеОбращение <> Неопределено Тогда - НапильникМожетПрименяться = ОбъектАннотацииОсобоеОбращение.НапильникМожетПрименяться(ИмяНапильника); - - Лог.Отладка( - "Желудь %1 требует особого обращения. Напильник %2 применяется: %3", - ИмяЖелудя, - ИмяНапильника, - НапильникМожетПрименяться - ); - КонецЕсли; - - Если НапильникМожетПрименяться Тогда - ПрименяемыеНапильники.Добавить(ОпределениеНапильника); - КонецЕсли; - - КонецЦикла; - - КэшПрименяемыхНапильников.Вставить(ИмяЖелудя, ПрименяемыеНапильники); - - Возврат ПрименяемыеНапильники; - -КонецФункции - -#КонецОбласти - +Функция СоздатьОпределениеЖелудя( + ИмяЖелудя, + ТипЖелудя, + ВладелецСвойств, + Конструктор, + Аннотации, + ИмяКорневойАннотации +) + + Завязь = ФабрикаЗавязей.СоздатьЗавязь(ВладелецСвойств, Конструктор); + + ПрилепляемыеЧастицы = ПрочитатьПрилепляемыеЧастицыВМетоде(Конструктор, ВладелецСвойств); + Характер = ЧитательАннотаций.ПрочитатьХарактерЖелудя(Аннотации); + Прозвища = ЧитательАннотаций.ПрочитатьПрозвища(Аннотации, ИмяЖелудя); + Порядок = ЧитательАннотаций.ПрочитатьПорядок(Аннотации); + Верховный = ЧитательАннотаций.ПрочитатьПризнакВерховногоЖелудя(Аннотации); + Спецификация = ЧитательАннотаций.ПрочитатьСпецификацию(Аннотации); + КорневаяАннотация = ЧитательАннотаций.ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации); + + // TODO: Унести в Приемку &Дуб + // Если Спецификация = СостоянияПриложения.Инициализация() + // И НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда + // ТекстСообщения = СтрШаблон( + // "Дуб %1 имеет завязь %2, которая имеет &Спецификацию ""Инициализация"", но сам дуб не имеет этой спецификации.", + // ОпределениеЖелудя.Имя(), + // Конструктор.Имя + // ); + // ВызватьИсключение ТекстСообщения; + // КонецЕсли; + + ОпределениеЖелудя = Новый ОпределениеЖелудя( + РазворачивательАннотаций, + ТипЖелудя, + ИмяЖелудя, + Характер, + ПрилепляемыеЧастицы, + Завязь, + Прозвища, + Порядок, + Верховный, + Спецификация, + КорневаяАннотация + ); + + Возврат ОпределениеЖелудя; + +КонецФункции + +Функция ПрочитатьПрилепляемыеЧастицыВМетоде(Метод, ВладелецСвойств) + + ПрилепляемыеЧастицы = Новый Массив; + Для Каждого ПараметрМетода Из Метод.Параметры Цикл + + РазворачивательАннотаций.РазвернутьАннотацииСвойства(ПараметрМетода, ВладелецСвойств); + + ПрилепляемаяЧастица = ПрилепляторЧастиц.ДанныеОПрилепляемойЧастице(ПараметрМетода); + ПрилепляемыеЧастицы.Добавить(ПрилепляемаяЧастица); + + КонецЦикла; + + Возврат ПрилепляемыеЧастицы; + +КонецФункции + +#КонецОбласти + #Область Инициализация -Процедура ПриСозданииОбъекта(пПоделка, пРазворачивательАннотаций, пПрилепляторЧастиц) - - Рефлектор = Новый Рефлектор(); - - Поделка = пПоделка; - РазворачивательАннотаций = пРазворачивательАннотаций; - ПрилепляторЧастиц = пПрилепляторЧастиц; - - ОпределенияЖелудейПоИмени = Новый Соответствие(); - ОпределенияЖелудейПоПрозвищу = Новый Соответствие(); - - ИнициализируемыеНапильники = Новый Массив(); - - ОпределенияНапильниковПоИмени = Новый Соответствие(); - ОпределенияНапильников = Новый Массив(); - КэшПрименяемыхНапильников = Новый Соответствие(); - - Лог = Логирование.ПолучитьЛог("oscript.lib.autumn.core.ФабрикаЖелудей"); - +Процедура ПриСозданииОбъекта(пПоделка, пРазворачивательАннотаций, пПрилепляторЧастиц) + + Рефлектор = Новый Рефлектор(); + + Поделка = пПоделка; + РазворачивательАннотаций = пРазворачивательАннотаций; + ПрилепляторЧастиц = пПрилепляторЧастиц; + + РепозиторийОпределенийЖелудей = Новый РепозиторийОпределенийЖелудей(); + МенеджерНапильников = Новый МенеджерНапильников(Поделка, РепозиторийОпределенийЖелудей); + ЧитательАннотаций = Новый ЧитательАннотаций(Поделка); + ФабрикаЗавязей = Новый ФабрикаЗавязей(); + КонецПроцедуры #КонецОбласти diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\227\320\260\320\262\321\217\320\267\320\265\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\227\320\260\320\262\321\217\320\267\320\265\320\271.os" new file mode 100644 index 0000000..6c10467 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\227\320\260\320\262\321\217\320\267\320\265\320\271.os" @@ -0,0 +1,61 @@ +#Область ПрограммныйИнтерфейс + +Функция СоздатьЗавязь(ВладелецСвойств, Конструктор) Экспорт + + Если НРег(Конструктор.Имя) = НРег("ПриСозданииОбъекта") + ИЛИ НРег(Конструктор.Имя) = НРег("OnObjectCreation") Тогда + + Возврат СоздатьЗавязьЧерезКонструкторОбъекта(ВладелецСвойств, Конструктор); + + ИначеЕсли ТипЗнч(ВладелецСвойств) = Тип("Сценарий") Тогда + + Возврат СоздатьЗавязьЧерезМетодЛямбды(ВладелецСвойств, Конструктор); + + Иначе + + Возврат СоздатьЗавязьЧерезМетодЗавязи(ВладелецСвойств, Конструктор); + + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьЗавязьЧерезКонструкторОбъекта(ТипЖелудя, Конструктор) + + Действие = Новый Действие(ФабричныеМетоды, "КонструкторОбъекта"); + Завязь = Новый Завязь(Строка(ТипЖелудя), Конструктор.Имя, Конструктор, Действие, Истина); + + Возврат Завязь; + +КонецФункции + +Функция СоздатьЗавязьЧерезМетодЗавязи(ТипДуба, МетодЗавязи) + + Действие = Новый Действие(ФабричныеМетоды, "МетодЗавязи"); + Завязь = Новый Завязь(Строка(ТипДуба), МетодЗавязи.Имя, МетодЗавязи, Действие, Ложь); + + Возврат Завязь; + +КонецФункции + +Функция СоздатьЗавязьЧерезМетодЛямбды(Сценарий, МетодЗавязи) + + Действие = Новый Действие(Сценарий, МетодЗавязи.Имя); + Завязь = Новый Завязь("", МетодЗавязи.Имя, МетодЗавязи, Действие, Ложь); + + Возврат Завязь; + +КонецФункции + +#КонецОбласти + +#Область Инициализация + +Процедура ПриСозданииОбъекта() + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\271.os" new file mode 100644 index 0000000..d73760f --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\271.os" @@ -0,0 +1,127 @@ +#Область ОписаниеПеременных + +// Поделка - Управляющий ioc-контейнер. +Перем _Поделка; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +Функция ПрочитатьИмяЖелудя(Аннотации, АннотацияНадМетодом, ЗначениеПоУмолчанию) Экспорт + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, АннотацияНадМетодом); + ИмяЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, , ЗначениеПоУмолчанию); + + Возврат ИмяЖелудя; + +КонецФункции + +Функция ПрочитатьТипЖелудя(Метод, Аннотации) Экспорт + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Завязь"); + ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( + Аннотация, + "Тип" + ); + + Если ТипЖелудя = Неопределено Тогда + ТипЖелудя = Метод.Имя; + КонецЕсли; + + Попытка + РеальныйТип = Тип(ТипЖелудя); + Исключение + ВызватьИсключение СтрШаблон( + "Тип желудя в Завязи %1 не известен. Укажите тип желудя в аннотации или переименуйте метод завязи.", + Метод.Имя + ); + КонецПопытки; + + Возврат РеальныйТип; +КонецФункции + +Функция ПрочитатьХарактерЖелудя(Аннотации) Экспорт + ЗначениеПоУмолчанию = ХарактерыЖелудей.Одиночка(); + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Характер"); + Если Аннотация = Неопределено Тогда + Возврат ЗначениеПоУмолчанию; + КонецЕсли; + + ХарактерЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( + Аннотация, + , + ЗначениеПоУмолчанию + ); + + Если НЕ ХарактерыЖелудей.ЭтоХарактерЖелудя(ХарактерЖелудя) Тогда + ВызватьИсключение "Неизвестный характер желудя " + ХарактерЖелудя; + КонецЕсли; + + Возврат ХарактерЖелудя; +КонецФункции + +Функция ПрочитатьПрозвища(Аннотации, ЗначениеПоУмолчанию) Экспорт + + Результат = Новый Массив; + Результат.Добавить(ЗначениеПоУмолчанию); + + Прозвища = РаботаСАннотациями.НайтиАннотации(Аннотации, "Прозвище"); + Для Каждого Аннотация Из Прозвища Цикл + Прозвище = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация); + + Результат.Добавить(Прозвище); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПрочитатьПорядок(Аннотации) Экспорт + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Порядок"); + + ОпределениеАннотации = _Поделка.ПолучитьОпределениеАннотации("Порядок"); + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); + + Возврат ОбъектАннотации.Значение(); + +КонецФункции + +Функция ПрочитатьПризнакВерховногоЖелудя(Аннотации) Экспорт + + Возврат РаботаСАннотациями.НайтиАннотацию(Аннотации, "Верховный") <> Неопределено; + +КонецФункции + +Функция ПрочитатьСпецификацию(Аннотации) Экспорт + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Спецификация"); + + ОпределениеАннотации = _Поделка.ПолучитьОпределениеАннотации("Спецификация"); + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); + + Возврат ОбъектАннотации.Значение(); + +КонецФункции + +Функция ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации) Экспорт + + КорневаяАннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, ИмяКорневойАннотации); + ОпределениеАннотации = _Поделка.ПолучитьОпределениеАннотации(КорневаяАннотация.Имя); + + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(КорневаяАннотация); + + Возврат ОбъектАннотации; + +КонецФункции + +#КонецОбласти + +#Область Инициализация + +Процедура ПриСозданииОбъекта(пПоделка) + _Поделка = пПоделка; +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" index 1626a03..4589222 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\270\320\265\320\226\320\265\320\273\321\203\320\264\321\217.os" @@ -120,16 +120,30 @@ Ожидаем.Что(Спецификация).ИмеетТип("Строка"); Ожидаем.Что(КорневаяАннотация).Не_().ИмеетТип("СтрокаТаблицыЗначений"); - Если Спецификация = СостоянияПриложения.Инициализация() Тогда - ТекстСообщения = СтрШаблон( - "К желудю времени инициализации %1 можно прилеплять только детальки.", - Имя - ); - Для Каждого ПрилепляемаяЧастица Из ПрилепляемыеЧастицы Цикл - Если (ПрилепляемаяЧастица.ТипЧастицы() <> ТипыПрилепляемыхЧастиц.Деталька()) И (ПрилепляемаяЧастица.ИмяЧастицы() <> "Поделка") Тогда - ВызватьИсключение ТекстСообщения; - КонецЕсли; - КонецЦикла; + Если Спецификация = СостоянияПриложения.Инициализация() Тогда + ТекстСообщения = СтрШаблон( + "К желудю времени инициализации %1 можно прилеплять только детальки или другие желуди времени инициализации.", + Имя + ); + // Список известных желудей времени инициализации, доступных как служебные желуди + ИзвестныеЖелудиИнициализации = Новый Массив; + ИзвестныеЖелудиИнициализации.Добавить("КонтейнерАннотаций"); + ИзвестныеЖелудиИнициализации.Добавить("РазворачивательАннотаций"); + ИзвестныеЖелудиИнициализации.Добавить("ПрилепляторЧастиц"); + ИзвестныеЖелудиИнициализации.Добавить("МенеджерНапильников"); + ИзвестныеЖелудиИнициализации.Добавить("РепозиторийОпределенийЖелудей"); + ИзвестныеЖелудиИнициализации.Добавить("ЧитательАннотаций"); + ИзвестныеЖелудиИнициализации.Добавить("ФабрикаЗавязей"); + + Для Каждого ПрилепляемаяЧастица Из ПрилепляемыеЧастицы Цикл + Разрешено = (ПрилепляемаяЧастица.ТипЧастицы() = ТипыПрилепляемыхЧастиц.Деталька()) + ИЛИ (ПрилепляемаяЧастица.ИмяЧастицы() = "Поделка") + ИЛИ (ИзвестныеЖелудиИнициализации.Найти(ПрилепляемаяЧастица.ИмяЧастицы()) <> Неопределено); + + Если НЕ Разрешено Тогда + ВызватьИсключение ТекстСообщения; + КонецЕсли; + КонецЦикла; КонецЕсли; _Имя = Имя;