Skip to content

Commit

Permalink
Merge pull request #89 from autumn-library/feature/tune-file
Browse files Browse the repository at this point in the history
Возможность ограничения применения напильников на желуде
  • Loading branch information
nixel2007 authored Mar 18, 2024
2 parents 082352b + 75c6b08 commit f098904
Show file tree
Hide file tree
Showing 11 changed files with 383 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .bsl-language-server.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"listOfIncorrectFirstSymbol": ";"
},
"Typo": {
"userWordsToIgnore": "Разворачиватель,Блестяшка,Блестяшек,Блестяшки,Блестяшками,Блестяшку,Блестяшкой,Инит,Структурочка,Запускатель,Осенизатор,Просканированные,Аппендера"
"userWordsToIgnore": "Разворачиватель,Блестяшка,Блестяшек,Блестяшки,Блестяшками,Блестяшку,Блестяшкой,Инит,Структурочка,Запускатель,Осенизатор,Прилеплятор,Просканированные,Аппендера"
}
}
}
Expand Down
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,32 @@ JSON обычно содержит вложенные объекты и масс

Метод обработки напильником возвращает желудь, причем не обязательно возвращать *тот же самый* желудь. Вам может захотеться обернуть его в объект-контейнер и накинуть на него несколько новых методов, например, с помощью [decorator](https://github.com/nixel2007/decorator).

Не каждый напильник стоит применять ко всем желудям. Вспоминая замечательный пример с панками, мы можем захотеть добавить напильник для полировки заклепок на напульсниках наших музыкантов. При этом очевидно, что далеко не все носят напульсники, да еще и с заклепками. В задаче ограничения применения напильника поможет повторяемый параметр аннотации `&Напильник` под названием `ПрименяетсяТолькоНа`. В нем можно указать имена или прозвища желудей, к которым применяется данный напильник.

```bsl
// file: Классы/ПолировщикЗаклепок.os
&Напильник(ПрименяетсяТолькоНа = "Панк")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
```

С другой стороны сам желудь может захотеть ограничить список напильников, которые могут по нему вжухнуть. Или даже вовсе отключить вжухание всех напильников. Для этого на желудь можно навесить аннотацию `&ОсобоеОбращение`, которая может принимать булев параметр `ОтключитьВсеНапильники`, повторяемый строковый параметр `ПрименятьТолькоНапильник` и опять же повторяемый строковый параметр `НеПрименятьНапильник`. Назначение первого параметра, надеемся, достаточно очевидно, поэтому вот пример работы с одним из других:

```bsl
// file: Классы/ПозерВНапульсниках.os
&Желудь
&ОсобоеОбращение(
ПрименятьТолькоНапильник = "ПолировщикЗаклепок"
)
Процедура ПриСозданииОбъекта()
КонецПроцедуры
```

Зачем все это может быть нужно? Перфоманса ради, например. В случае большого количества компанейских желудей, которые не нуждаются в обработке напильником, можно отключить работу всех напильников для них. Ведь зачем тратить время на обработку, если она не нужна? При этом можно сохранить все плюшки от внедрения зависимостей и деталек через конструктор. Удобненько.

Напильник в этой удивительной осенней вселенной тоже является желудем, поэтому может иметь зависимости от других желудей. Но тут надо аккуратно - можно окончательно упороться и улететь таки на дно циклических зависимостей.

> Чтобы уберечь себя ото дна, все напильники инициализируются перед запуском приложения. Как в жизни - сначала разложил рядом инструменты, а потом начинаешь творить.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,38 @@
#Использовать asserts
#Использовать collectionos

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

Функция МожетПрименятьсяНа(ОпределениеЖелудя) Экспорт

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

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

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

КонецЕсли;

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

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

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

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

_ПрименяетсяТолькоНа.Добавить(МестоПрименения);
КонецЦикла;

КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#Использовать asserts

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

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

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

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

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

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

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

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

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

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

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

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

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

0 comments on commit f098904

Please sign in to comment.