Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Улучшения декоратора #11

Merged
merged 4 commits into from
Mar 26, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
oscript_version: ['1.8.2', 'stable', 'dev']
oscript_version: ['1.8.3', 'stable', 'dev']

steps:
# Загрузка проекта
Expand Down
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,17 @@ docs - todo;
Функция Публичный() Экспорт
```

#### ЭтоПроцедура

```bsl
// Устанавливает признак того что этот метод Процедура
//
// Возвращаемое значение:
// Метод - Ссылка на текущий инстанс Метод
//
Функция ЭтоПроцедура() Экспорт
```

### ПараметрМетода

#### ПриСозданииОбъекта
Expand Down
4 changes: 2 additions & 2 deletions packagedef
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// BSLLS:CodeOutOfRegion-off
Описание.Имя("decorator")
.Версия("1.4.1")
.Версия("1.5.0")
.Автор("Nikita Gryzlov")
.АдресАвтора("[email protected]")
.Описание("Библиотека для создания декораторов над объектами")
.ВерсияСреды("1.8.2")
.ВерсияСреды("1.8.3")
.ВерсияМанифеста("1.0.0")
.ВключитьФайл("src")
.ВключитьФайл("docs")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
Перем Декоратор_ИсходныйОбъект;
Перем Декоратор_Лог;
Перем Декоратор_Рефлектор;
Перем Декоратор_ЗначениеПоля;

// {Область методов}

Expand Down
45 changes: 40 additions & 5 deletions src/internal/Классы/ШаблонМетода.os_template
Original file line number Diff line number Diff line change
@@ -1,10 +1,45 @@
// {АннотацияМетода}
Функция Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт}
{Функция} Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт}

Декоратор_ЗначениеПоля = Декоратор_Рефлектор.ПолучитьСвойство(
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А осени на этом методе был дикая просадка перфоманса. Тебе не хватит обращения к Декоратор_ИсходныйОбъект напрямую?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выпилил ненужные поля и почистил шаблон метода

ЭтотОбъект,
Константы_Декоратор.Поле_ИнстансОбъекта
);

Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ЗначениеПоля);
Иначе
ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ЗначениеПоля, ЭтотОбъект);
КонецЕсли;

Декоратор_ВозвращаемоеИзМетодаЗначение = NULL;

// {Декоратор_ПередВызовомМетода}

// {Декоратор_ТекстМетода}

// {Декоратор_ТипМетода}

Декоратор_Лог.Отладка(Декоратор_ТипМетода);

// {Декоратор_ВыполняемаяСтрока};

Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ЗначениеПоля, ЭтотОбъект);
Иначе
ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ЗначениеПоля);
КонецЕсли;

Если Декоратор_ВозвращаемоеИзМетодаЗначение = Декоратор_ЗначениеПоля Тогда
Декоратор_ВозвращаемоеИзМетодаЗначение = ЭтотОбъект;
КонецЕсли;

// {Декоратор_ПослеВызоваМетода}

КонецФункции

// {Декоратор_ВозвращаемоеЗначение}

{КонецФункции}

{Функция} ДекораторВнутренний_ИмяМетода(Декоратор_ОписаниеПараметровМетода)

// {Декоратор_ТекстМетода}

{КонецФункции}

This file was deleted.

22 changes: 2 additions & 20 deletions src/internal/Модули/КэшируемыеДанные.os
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
#Область ОписаниеПеременных

Перем ТекстШаблонаОбъектаДекоратора; // Шаблон объекта дкоратора
Перем ТекстШаблонаОбъектаДекоратора; // Шаблон объекта декоратора
Перем ТекстШаблонаМетодаДекоратора; // Шаблон декорируемого метода
Перем ТекстШаблонаПользовательскогоМетода; // Шаблон добавляемого метода
Перем ТекстШаблонаТелоМетодаДекоратора; // Шаблон тела декорируемого метода

#КонецОбласти

Expand All @@ -26,16 +25,7 @@

Если ТекстШаблонаМетодаДекоратора = Неопределено Тогда

ТекстШаблона = ТекстШаблонаПользовательскогоМетода();

ТекстШаблона = СтрЗаменить(ТекстШаблона, "// {Декоратор_ПередВызовомМетода}", "");
ТекстШаблона = СтрЗаменить(ТекстШаблона, "// {Декоратор_ПослеВызоваМетода}", "");

ТекстШаблонаМетодаДекоратора = СтрЗаменить(
ТекстШаблона,
"// {Декоратор_ТекстМетода}",
ТекстШаблонаТелоМетодаДекоратора()
);
ТекстШаблонаМетодаДекоратора = ТекстШаблонаПользовательскогоМетода();

КонецЕсли;

Expand All @@ -51,14 +41,6 @@
Возврат ТекстШаблонаПользовательскогоМетода;
КонецФункции

Функция ТекстШаблонаТелоМетодаДекоратора() Экспорт
Если ТекстШаблонаТелоМетодаДекоратора = Неопределено Тогда
ТекстШаблонаТелоМетодаДекоратора = ПрочитатьТекстШаблона("ШаблонТелоМетодаДекоратора.os_template");
КонецЕсли;

Возврат ТекстШаблонаТелоМетодаДекоратора;
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Expand Down
44 changes: 35 additions & 9 deletions src/Классы/КонструкторДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -375,13 +375,18 @@

ШаблонИмениПараметра = "Парам%1";
ШаблонОписанияПараметра = "%1 %2 = Неопределено";
ШаблонВыполняемаяСтрока = "Декоратор_ВыполняемаяСтрока = ""Декоратор_ЗначениеПоля.%1(%2)"";";

Для Каждого Метод Из Методы Цикл

Если Не Метод.Экспорт Тогда
Продолжить;
КонецЕсли;

ШаблонВыполняемаяСтрока = "ДекораторВнутренний_%1(%2);";

Если Метод.ЭтоФункция Тогда
ШаблонВыполняемаяСтрока = "Декоратор_ВозвращаемоеИзМетодаЗначение = " + ШаблонВыполняемаяСтрока;
КонецЕсли;

МассивИменаПараметров = Новый Массив;
МассивСтрокаПараметров = Новый Массив;
Expand All @@ -407,15 +412,29 @@
ТипМетода = "Декоратор_ТипМетода = " + Формат(Метод.ЭтоФункция, "БЛ=Ложь; БИ=Истина") + ";";
ВозвращаемоеЗначение = "Возврат Декоратор_ВозвращаемоеИзМетодаЗначение;";

ШаблонТекстМетода = "%1 Декоратор_ЗначениеПоля.%2(%3);";

ТекстМетода = СтрШаблон(
ШаблонТекстМетода,
?(Метод.ЭтоФункция, "Возврат", ""),
ИмяМетода,
СтрСоединить(МассивИменаПараметров, ", ")
);

НовыйМетод = ШаблонМетода;
НовыйМетод = СтрЗаменить(НовыйМетод, "// {АннотацияМетода}", СтрокаАннотацийМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ИмяМетода", ИмяМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "ДекораторВнутренний_ИмяМетода", "ДекораторВнутренний_" + ИмяМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ОписаниеПараметровМетода", ОписаниеПараметровМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТипМетода}", ТипМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт");

НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция");
НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина");
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", ТекстМетода);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод, Истина);

НовыйМетод = НовыйМетод + Символы.ПС;
Expand All @@ -428,20 +447,32 @@
Процедура ДобавитьПользовательскиеМетоды(ОбластьМетодов)

ШаблонМетода = КэшируемыеДанные.ТекстШаблонаПользовательскогоМетода();

ШаблонВыполняемаяСтрока = "Декоратор_ВозвращаемоеИзМетодаЗначение = ДекораторВнутренний_%1(%2);";

Для Каждого Метод Из ПользовательскиеМетоды Цикл

СтрокаАннотацийМетода = "";
ИмяМетода = Метод.ИмяМетода;
ОписаниеПараметровМетода = "";

ВыполняемаяСтрока = СтрШаблон(ШаблонВыполняемаяСтрока, ИмяМетода, ОписаниеПараметровМетода);
ТипМетода = "Декоратор_ТипМетода = Истина;";
ВозвращаемоеЗначение = "Возврат Декоратор_ВозвращаемоеИзМетодаЗначение;";

НовыйМетод = ШаблонМетода;
НовыйМетод = СтрЗаменить(НовыйМетод, "// {АннотацияМетода}", СтрокаАннотацийМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ИмяМетода", ИмяМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "ДекораторВнутренний_ИмяМетода", "ДекораторВнутренний_" + ИмяМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ОписаниеПараметровМетода", ОписаниеПараметровМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", Метод.ТекстМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт");

НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция");
НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь");
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТипМетода}", ТипМетода);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод);

ОбластьМетодов = ОбластьМетодов + НовыйМетод;
Expand All @@ -457,11 +488,6 @@
ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомМетода}";
ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваМетода}";

Если ЭтоДекорируемыйМетод Тогда
ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомДекорируемогоМетода}";
ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваДекорируемогоМетода}";
КонецЕсли;

ТекстМетода = СтрЗаменить(ТекстМетода, ЗаменяемаяСтрокаПеред, ПередВызовомМетода);
ТекстМетода = СтрЗаменить(ТекстМетода, ЗаменяемаяСтрокаПосле, ПослеВызоваМетода);

Expand Down
Loading