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

Возможность ограничения применения напильников на желуде #89

Merged
merged 13 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from 5 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
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
#Использовать asserts

Перем _ПрименяетсяТолькоНа;

Check warning on line 3 in src/internal/Классы/АннотацияНапильник.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/АннотацияНапильник.os#L3

Добавьте описание переменной
Copy link

Choose a reason for hiding this comment

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

Добавьте описание переменной _ПрименяетсяТолькоНа для улучшения читаемости кода. Это поможет другим разработчикам быстрее понять её назначение.


Функция ПрименяетсяТолькоНа() Экспорт
Возврат _ПрименяетсяТолькоНа;
КонецФункции

&Аннотация("Напильник")
&Прозвище("Напильник")
Процедура ПриСозданииОбъекта(Значение = "")
Процедура ПриСозданииОбъекта(Значение = "", &Повторяемый ПрименяетсяТолькоНа = Неопределено)

Для Каждого МестоПрименения Из ПрименяетсяТолькоНа Цикл
Ожидаем.Что(МестоПрименения, "Ограничение применения напильника должно быть задано строкой").ИмеетТип("Строка");
КонецЦикла;

_ПрименяетсяТолькоНа = ПрименяетсяТолькоНа;
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#Использовать asserts

Перем _ОтключитьВсеНапильники;

Check warning on line 3 in src/internal/Классы/АннотацияОсобоеОбращение.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/АннотацияОсобоеОбращение.os#L3

Добавьте описание переменной
Перем _ПрименятьТолькоНапильники;

Check warning on line 4 in src/internal/Классы/АннотацияОсобоеОбращение.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/АннотацияОсобоеОбращение.os#L4

Добавьте описание переменной
Перем _НеПрименятьНапильники;

Check warning on line 5 in src/internal/Классы/АннотацияОсобоеОбращение.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/АннотацияОсобоеОбращение.os#L5

Добавьте описание переменной
Comment on lines +3 to +5
Copy link

Choose a reason for hiding this comment

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

Добавьте описания переменных _ОтключитьВсеНапильники, _ПрименятьТолькоНапильники, _НеПрименятьНапильники для улучшения читаемости кода.


Функция НапильникПрименяется(ИмяНапильника) Экспорт

Если _ОтключитьВсеНапильники Тогда
Возврат Ложь;
КонецЕсли;

Если _ПрименятьТолькоНапильники.Количество() > 0 Тогда
Возврат _ПрименятьТолькоНапильники.Найти(ИмяНапильника) <> Неопределено;
Иначе
Возврат _НеПрименятьНапильники.Найти(ИмяНапильника) = Неопределено;
КонецЕсли;

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

&Аннотация("ОсобоеОбращение")
Процедура ПриСозданииОбъекта(
ОтключитьВсеНапильники = Ложь,
&Повторяемый ПрименятьТолькоНапильник = Неопределено,
&Повторяемый НеПрименятьНапильник = Неопределено
)

Для Каждого МестоПрименения Из ПрименятьТолькоНапильник Цикл
Ожидаем.Что(МестоПрименения, "Ограничение ""только"" применения напильника должно быть задано строкой")
.ИмеетТип("Строка");
КонецЦикла;

Для Каждого МестоПрименения Из НеПрименятьНапильник Цикл
Ожидаем.Что(МестоПрименения, "Ограничение ""не"" применения напильника должно быть задано строкой")
.ИмеетТип("Строка");
КонецЦикла;

Если ОтключитьВсеНапильники И ПрименятьТолькоНапильник.Количество() > 0 Тогда
ВызватьИсключение "Нельзя одновременно отключать все напильники и задавать ограничения ""только""";
КонецЕсли;

Если ОтключитьВсеНапильники И НеПрименятьНапильник.Количество() > 0 Тогда
ВызватьИсключение "Нельзя одновременно отключать все напильники и задавать ограничения ""не""";
КонецЕсли;

Если ПрименятьТолькоНапильник.Количество() > 0 И НеПрименятьНапильник.Количество() > 0 Тогда
ВызватьИсключение "Нельзя одновременно задавать ограничения ""только"" и ""не""";
КонецЕсли;

_ОтключитьВсеНапильники = ОтключитьВсеНапильники;
_ПрименятьТолькоНапильники = ПрименятьТолькоНапильник;
_НеПрименятьНапильники = НеПрименятьНапильник;

КонецПроцедуры
113 changes: 105 additions & 8 deletions src/internal/Классы/ФабрикаЖелудей.os
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,15 @@

// Соответствие, в котором хранятся все определения желудей, являющихся напильниками.
// * Ключ - Строка - имя желудя.
// * Значение - ОпределениеЖелудя - определение желудя.
// * Значение - ОпределениеЖелудя - определение напильника.
Перем ОпределенияНапильниковПоИмени;

// Соответствие - Соответствие, в котором хранится список применяемых к конкретному
// желудю напильников.
// * Ключ - Строка - имя желудя.
// * Значение - ОпределениеЖелудя - определение напильника.
Перем КэшПрименяемыхНапильников;

// Массив из ОпределениеЖелудя - Список инициализируемых в данный момент напильников.
Перем ИнициализируемыеНапильники;

Expand Down Expand Up @@ -106,20 +112,22 @@

Функция ДобавитьДуб(ТипДуба) Экспорт

ИмяКорневойАннотации = "Завязь";
ОпределениеЖелудя = ДобавитьЖителяЛеса(ТипДуба, "", "Дуб");
МетодыЗавязи = ОпределениеЖелудя.НайтиМетодыСАннотациями("Завязь");
МетодыЗавязи = ОпределениеЖелудя.НайтиМетодыСАннотациями(ИмяКорневойАннотации);

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

ИмяЖелудя = ПрочитатьИмяЖелудя(МетодЗавязи.Аннотации, "Завязь", МетодЗавязи.Имя);
ИмяЖелудя = ПрочитатьИмяЖелудя(МетодЗавязи.Аннотации, ИмяКорневойАннотации, МетодЗавязи.Имя);
ТипЖелудя = ПрочитатьТипЖелудя(МетодЗавязи, МетодЗавязи.Аннотации);

ОпределениеЗавязи = СоздатьОпределениеЖелудя(
ИмяЖелудя,
ТипЖелудя,
ТипДуба,
МетодЗавязи,
МетодЗавязи.Аннотации
МетодЗавязи.Аннотации,
ИмяКорневойАннотации
Comment on lines +118 to +133
Copy link

Choose a reason for hiding this comment

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

Метод ДобавитьДуб использует аннотации для определения методов завязи и создания определений желудей. Это улучшает гибкость и расширяемость системы. Однако, рекомендуется добавить обработку исключений и проверки на корректность данных аннотаций для предотвращения ошибок во время выполнения.

);
СохранитьОпределениеЖелудя(ОпределениеЗавязи);

Expand All @@ -145,7 +153,7 @@
Возврат ОпределениеНапильника;
КонецФункции

Функция НайтиЖелудь(ИмяЖелудя, ПрилепляемыеЧастицы) Экспорт

Check failure on line 156 in src/internal/Классы/ФабрикаЖелудей.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/ФабрикаЖелудей.os#L156

Уменьшите когнитивную сложность "НайтиЖелудь" с 32 до 15

ОпределениеЖелудя = Поделка.ПолучитьОпределениеЖелудя(ИмяЖелудя);

Expand Down Expand Up @@ -208,7 +216,10 @@
ИнициализируемыеНапильники.Удалить(ИндексНапильника);
Иначе
Если НЕ ОпределениеЖелудя.Спецификация() = СостоянияПриложения.Инициализация() Тогда
Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл

ПрименяемыеНапильники = ОпределитьПрименяемыеНапильники(ОпределениеЖелудя);

Для Каждого ОпределениеНапильника Из ПрименяемыеНапильники Цикл
nixel2007 marked this conversation as resolved.
Show resolved Hide resolved

Если ОпределениеНапильника.Имя() = ОпределениеЖелудя.Имя() Тогда
Продолжить;
Expand Down Expand Up @@ -301,7 +312,8 @@
ТипЖителяЛеса,
ТипЖителяЛеса,
Конструктор,
Аннотации
Аннотации,
АннотацияНадКонструктором
);
СохранитьОпределениеЖелудя(ОпределениеЖелудя);

Expand All @@ -313,7 +325,14 @@

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

Функция СоздатьОпределениеЖелудя(ИмяЖелудя, ТипЖелудя, ТипВладельцаСвойств, Конструктор, Аннотации)
Функция СоздатьОпределениеЖелудя(
ИмяЖелудя,
ТипЖелудя,
ТипВладельцаСвойств,
Конструктор,
Аннотации,
ИмяКорневойАннотации
)

Завязь = СоздатьЗавязь(ТипВладельцаСвойств, Конструктор);

Expand All @@ -323,6 +342,7 @@
Порядок = ПрочитатьПорядок(Аннотации);
Верховный = ПрочитатьПризнакВерховногоЖелудя(Аннотации);
Спецификация = ПрочитатьСпецификацию(Аннотации);
КорневаяАннотация = ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации);

// TODO: Унести в Приемку &Дуб
// Если Спецификация = СостоянияПриложения.Инициализация()
Expand All @@ -345,13 +365,16 @@
Прозвища,
Порядок,
Верховный,
Спецификация
Спецификация,
КорневаяАннотация
);

Возврат ОпределениеЖелудя;

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

#Область СозданиеЗавязи

Функция СоздатьЗавязь(ТипВладельцаСвойств, Конструктор)

Если НРег(Конструктор.Имя) = НРег("ПриСозданииОбъекта")
Expand Down Expand Up @@ -385,6 +408,10 @@

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

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

#Область ЧтениеПараметровЖелудя

Функция ПрочитатьИмяЖелудя(Аннотации, АннотацияНадМетодом, ЗначениеПоУмолчанию)

Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, АннотацияНадМетодом);
Expand Down Expand Up @@ -503,6 +530,19 @@

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

Функция ПрочитатьКорневуюАннотацию(Аннотации, ИмяКорневойАннотации)

КорневаяАннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, ИмяКорневойАннотации);
ОпределениеАннотации = Поделка.ПолучитьОпределениеАннотации(КорневаяАннотация.Имя);

ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(КорневаяАннотация);

Возврат ОбъектАннотации;

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

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

Процедура ДобавитьОпределениеНапильника(ОпределениеНапильника, Системный = Ложь)

Порядок = ОпределениеНапильника.Порядок();
Expand All @@ -525,6 +565,7 @@

// Реинициализация сортированного списка напильников для возможности их использования в заготовках.
ОпределенияНапильников = ПолучитьСписокОпределенийЖелудей("Напильник");
КэшПрименяемыхНапильников.Очистить();
nixel2007 marked this conversation as resolved.
Show resolved Hide resolved
ОпределенияНапильниковПоИмени.Вставить(ОпределениеНапильника.Имя(), ОпределениеНапильника);

КонецПроцедуры
Expand Down Expand Up @@ -563,6 +604,61 @@

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

Функция ОпределитьПрименяемыеНапильники(ОпределениеЖелудя)

Check failure on line 607 in src/internal/Классы/ФабрикаЖелудей.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/ФабрикаЖелудей.os#L607

Уменьшите когнитивную сложность "ОпределитьПрименяемыеНапильники" с 19 до 15

ПрименяемыеНапильники = КэшПрименяемыхНапильников.Получить(ОпределениеЖелудя.Имя());
Если ПрименяемыеНапильники <> Неопределено Тогда
Возврат ПрименяемыеНапильники;
КонецЕсли;

ПрименяемыеНапильники = Новый Массив;
ПрозвищаЖелудя = ОпределениеЖелудя.Прозвища();

АннотацииЗавязи = ОпределениеЖелудя.Завязь().ДанныеМетода().Аннотации;
АннотацияОсобоеОбращение = РаботаСАннотациями.НайтиАннотацию(АннотацииЗавязи, "ОсобоеОбращение");
ОпределениеАннотацииОсобоеОбращение = Поделка.ПолучитьОпределениеАннотации("ОсобоеОбращение");
Если АннотацияОсобоеОбращение <> Неопределено Тогда
ОбъектАннотацииОсобоеОбращение = ОпределениеАннотацииОсобоеОбращение.СоздатьОбъектАннотации(АннотацияОсобоеОбращение);
КонецЕсли;

Для Каждого ОпределениеНапильника Из ОпределенияНапильников Цикл

КорневаяАннотация = ОпределениеНапильника.КорневаяАннотация();
ПрименяетсяТолькоНа = КорневаяАннотация.ПрименяетсяТолькоНа();

НапильникМожетПрименяться = Ложь;

Если ПрименяетсяТолькоНа.Количество() = 0 Тогда
НапильникМожетПрименяться = Истина;

Check warning on line 632 in src/internal/Классы/ФабрикаЖелудей.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/internal/Классы/ФабрикаЖелудей.os#L632

Синтаксическая конструкция "Если...Тогда...ИначеЕсли..." содержит повторяющиеся блоки кода
ИначеЕсли ПрименяетсяТолькоНа.Найти(ОпределениеЖелудя.Имя()) <> Неопределено Тогда
НапильникМожетПрименяться = Истина;
Иначе

Для Каждого ПрозвищеЖелудя Из ПрозвищаЖелудя Цикл
Если ПрименяетсяТолькоНа.Найти(ПрозвищеЖелудя) <> Неопределено Тогда
НапильникМожетПрименяться = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

КонецЕсли;

Если НапильникМожетПрименяться И ОбъектАннотацииОсобоеОбращение <> Неопределено Тогда
НапильникМожетПрименяться = ОбъектАннотацииОсобоеОбращение.НапильникПрименяется(ОпределениеНапильника.Имя());
КонецЕсли;

Если НапильникМожетПрименяться Тогда
ПрименяемыеНапильники.Добавить(ОпределениеНапильника);
КонецЕсли;

КонецЦикла;

КэшПрименяемыхНапильников.Вставить(ОпределениеЖелудя.Имя(), ПрименяемыеНапильники);

Возврат ПрименяемыеНапильники;

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

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

#Область Инициализация
Expand All @@ -580,6 +676,7 @@

ОпределенияНапильниковПоИмени = Новый Соответствие();
ОпределенияНапильников = Новый Массив();
КэшПрименяемыхНапильников = Новый Соответствие();

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

Expand Down
10 changes: 9 additions & 1 deletion src/Классы/ОпределениеЖелудя.os
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
Перем _Верховный;
Перем _Порядок;
Перем _Спецификация;
Перем _КорневаяАннотация;

Check warning on line 14 in src/Классы/ОпределениеЖелудя.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/Классы/ОпределениеЖелудя.os#L14

Добавьте описание переменной
Перем _РефлекторОбъекта;
Перем _РазворачивательАннотаций;

Expand Down Expand Up @@ -62,6 +63,10 @@
Возврат _Спецификация;
КонецФункции

Функция КорневаяАннотация() Экспорт
Возврат _КорневаяАннотация;
КонецФункции

Функция Свойства() Экспорт
Если Свойства = Неопределено Тогда
Свойства = ?(ЭтоПримитивныйТип, Новый ТаблицаЗначений, _РефлекторОбъекта.ПолучитьТаблицуСвойств(Неопределено, Истина));
Expand Down Expand Up @@ -89,7 +94,7 @@
КонецФункции

Процедура ПриСозданииОбъекта(
РазворачивательАннотаций,

Check warning on line 97 in src/Классы/ОпределениеЖелудя.os

View check run for this annotation

sonar.openbsl.ru qa-bot / autumn Sonarqube Results

src/Классы/ОпределениеЖелудя.os#L97

Уменьшите количество параметров c 11 до допустимого 7
ТипЖелудя,
Имя,
Характер,
Expand All @@ -98,7 +103,8 @@
Прозвища,
Порядок,
Верховный,
Спецификация
Спецификация,
КорневаяАннотация
)
Ожидаем.Что(РазворачивательАннотаций).ИмеетТип("РазворачивательАннотаций");
Ожидаем.Что(ТипЖелудя).ИмеетТип("Тип");
Expand All @@ -112,6 +118,7 @@
Ожидаем.Что(Порядок).ИмеетТип("Число");
Ожидаем.Что(Верховный).ИмеетТип("Булево");
Ожидаем.Что(Спецификация).ИмеетТип("Строка");
Ожидаем.Что(КорневаяАннотация).Не_().ИмеетТип("СтрокаТаблицыЗначений");

Если Спецификация = СостоянияПриложения.Инициализация() Тогда
ТекстСообщения = СтрШаблон(
Expand All @@ -134,6 +141,7 @@
_Порядок = Порядок;
_Верховный = Верховный;
_Спецификация = Спецификация;
_КорневаяАннотация = КорневаяАннотация;

_РазворачивательАннотаций = РазворачивательАннотаций;
_РефлекторОбъекта = Новый РефлекторОбъекта(ТипЖелудя);
Expand Down
Loading
Loading