Skip to content

Commit

Permalink
Добавлен новый тип перехватчика "Перед синхронизацией полей"
Browse files Browse the repository at this point in the history
  • Loading branch information
sfaqer committed Oct 11, 2023
1 parent 533f967 commit 05f48af
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 4 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,12 @@ docs - todo;
#### После
Перехватчик вызывается после выполнения перехватываемого метода

#### ПослеВызоваИсключения
Перехватчик вызывается если перехватываемый метод упал в исключение, в момент перед пробросом исключения

#### ПередСинхронизациейПолей
Перехватчик вызывается в самом начале, перед синхронизацией полей декоратора и оригинального метода

### Перечисление ТипыПодключенияБибилотек

#### ПоИмени
Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// BSLLS:CodeOutOfRegion-off
Описание.Имя("decorator")
.Версия("1.6.0")
.Версия("1.7.0")
.Автор("Nikita Gryzlov")
.АдресАвтора("[email protected]")
.Описание("Библиотека для создания декораторов над объектами")
Expand Down
2 changes: 2 additions & 0 deletions src/internal/Модули/КэшируемыеДанные.os
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
|// {АннотацияМетода}
|{Функция} Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт}
|
| // {Декоратор_ПередСинхронизациейПолей}
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| Иначе
Expand Down
14 changes: 12 additions & 2 deletions src/Классы/ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,9 @@

ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомМетода}";
ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваМетода}";
ЗаменяемаяСтрокаПередИсключением = "// {Декоратор_ПослеВызоваИсключения}";

ЗаменяемаяСтрокаПередИсключением = "// {Декоратор_ПослеВызоваИсключения}";
ЗаменяемаяСтрокаПередСинхронизациейПолей = "// {Декоратор_ПередСинхронизациейПолей}";

ТекстМетода = СтрЗаменить(
ТекстМетода,
Expand All @@ -494,6 +496,12 @@
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПослеВызоваИсключения), Символы.ПС)
);

ТекстМетода = СтрЗаменить(
ТекстМетода,
ЗаменяемаяСтрокаПередСинхронизациейПолей,
СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПередСинхронизациейПолей), Символы.ПС)
);

КонецПроцедуры

Функция ТекстыПерехватчиков(ИмяМетода)
Expand All @@ -502,7 +510,9 @@

Результат.Вставить(ТипыПерехватчиковМетода.Перед, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.После, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив);

Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив);
Результат.Вставить(ТипыПерехватчиковМетода.ПередСинхронизациейПолей, Новый Массив);

Для каждого Перехватчик Из ПерехватчикиМетодов Цикл

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
Перем Перед Экспорт;
Перем После Экспорт;

Перем ПослеВызоваИсключения Экспорт;
Перем ПередСинхронизациейПолей Экспорт;

Перед = "Перед";
После = "После";
ПослеВызоваИсключения = "ПослеВызоваИсключения";

ПослеВызоваИсключения = "ПослеВызоваИсключения";
ПередСинхронизациейПолей = "ПередСинхронизациейПолей";
57 changes: 57 additions & 0 deletions tests/Тесты_ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -794,3 +794,60 @@
Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1);

КонецПроцедуры

&Тест
Процедура ПерехватчикиПередСинхронизациейПолейДекорируемыхФункцийРаботаютКорректно() Экспорт

// Дано
МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьЭтотОбъект")
.ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей)
.Тело("Поле = 124;");

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Перехватчик(ПерехватчикПередСинхронизациейПолей)
.Построить();

// Когда

Результат = Декоратор.ВернутьЭтотОбъект();

// Тогда

Ожидаем.Что(Результат.Поле).Равно(124);
Ожидаем.Что(МойКласс.Поле).Равно(124);

КонецПроцедуры

&Тест
Процедура ПерехватчикиПередСинхронизациейПолейДобавленныхФункцийРаботаютКорректно() Экспорт

// Дано
МойКласс = Новый МойКласс;
МойКласс.Поле = 123;

НовыйМетод = Новый Метод("ВернутьСебя")
.Публичный()
.ТелоМетода("Возврат ЭтотОбъект;");

ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьСебя")
.ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей)
.Тело("Декоратор_ИсходныйОбъект.Поле = 124;");

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Метод(НовыйМетод)
.Перехватчик(ПерехватчикПередСинхронизациейПолей)
.Построить();

// Когда

Результат = Декоратор.ВернутьСебя();

// Тогда

Ожидаем.Что(Результат.Поле).Равно(124);
Ожидаем.Что(МойКласс.Поле).Равно(124);

КонецПроцедуры

0 comments on commit 05f48af

Please sign in to comment.