Описание функциональности
По обсуждению в #659: @nixel2007 предложил заводить интерфейс под свойства, повторяющиеся во многих объектах метаданных, @theshadowco попросил завести таску при наличии кейса использования. Кейс есть, ниже.
Сейчас такие свойства объявлены полем в каждом классе, без общего интерфейса:
| свойство |
объявлено в классах |
интерфейс |
basedOn (ВводитсяНаОсновании) |
8 |
нет |
additionalIndexes (ДополнительныеИндексы) |
14 |
нет |
dataLockFields (ПоляБлокировкиДанных) |
8 |
нет |
inputByString (ВводПоСтроке) |
8 |
нет |
fullTextSearch (ПолнотекстовыйПоиск) |
13 |
нет |
characteristics (Характеристики) |
9 |
есть — CharacteristicOwner |
То есть соглашение в проекте уже своё: *Owner-интерфейсов одиннадцать (AttributeOwner, TabularSectionOwner, ModuleOwner, FormOwner, PredefinedDataOwner, TemplateOwner, CommandOwner, ChildrenOwner, AccessRightsOwner, ValueTypeOwner, CharacteristicOwner), и для самого свежего из этих свойств — характеристик — интерфейс завели. Просьба лишь распространить это на остальные.
Кейс использования
BSL Language Server ходит по объектам метаданных обобщённо: конфигурация приходит как Iterable<MD>, и код спрашивает не «это справочник?», а «есть ли у него такое-то свойство». На существующих интерфейсах это ровно одна проверка, и в нашем коде их 67 обращений (AttributeOwner 14, TabularSectionOwner 14, ModuleOwner 9, FormOwner 24, PredefinedDataOwner 4, ChildrenOwner 2):
if (md instanceof AttributeOwner owner) {
owner.getPlainStorageFields().forEach(...);
}
Для свойств без интерфейса тот же код превращается в перебор классов — и по одному такому перебору на каждое свойство:
List<MdoReference> basedOn =
md instanceof Document d ? d.getBasedOn()
: md instanceof Catalog c ? c.getBasedOn()
: md instanceof BusinessProcess b ? b.getBasedOn()
: md instanceof Task t ? t.getBasedOn()
: md instanceof ChartOfAccounts a ? a.getBasedOn()
: md instanceof ChartOfCharacteristicTypes ch ? ch.getBasedOn()
: md instanceof ChartOfCalculationTypes cc ? cc.getBasedOn()
: md instanceof ExchangePlan e ? e.getBasedOn()
: List.of();
У additionalIndexes веток будет уже 14. Хуже того, такой перебор молча устаревает: добавится в mdclasses девятый класс со свойством — потребитель об этом не узнает, ветку никто не допишет, и свойство просто не будет видно. С интерфейсом новый класс подхватывается сам.
Нам эти свойства нужны предметно: ВводитсяНаОсновании — чтобы сузить тип параметра Основание (сейчас это обобщённое «любая ссылка»), а ВводПоСтроке, ДополнительныеИндексы, ПоляБлокировкиДанных, Характеристики — чтобы развернуть имена в коллекциях Метаданные.<Объект>.<Коллекция>.
Что хотелось бы получить
Интерфейсы по образцу уже существующих — BasedOnOwner, AdditionalIndexOwner, DataLockFieldsOwner, InputByStringOwner, FullTextSearchOwner (имена на усмотрение), с единственным геттером каждый. Реализация у классов уже есть — нужно только объявить, что класс его реализует.
Описание функциональности
По обсуждению в #659: @nixel2007 предложил заводить интерфейс под свойства, повторяющиеся во многих объектах метаданных, @theshadowco попросил завести таску при наличии кейса использования. Кейс есть, ниже.
Сейчас такие свойства объявлены полем в каждом классе, без общего интерфейса:
basedOn(ВводитсяНаОсновании)additionalIndexes(ДополнительныеИндексы)dataLockFields(ПоляБлокировкиДанных)inputByString(ВводПоСтроке)fullTextSearch(ПолнотекстовыйПоиск)characteristics(Характеристики)CharacteristicOwnerТо есть соглашение в проекте уже своё:
*Owner-интерфейсов одиннадцать (AttributeOwner,TabularSectionOwner,ModuleOwner,FormOwner,PredefinedDataOwner,TemplateOwner,CommandOwner,ChildrenOwner,AccessRightsOwner,ValueTypeOwner,CharacteristicOwner), и для самого свежего из этих свойств — характеристик — интерфейс завели. Просьба лишь распространить это на остальные.Кейс использования
BSL Language Server ходит по объектам метаданных обобщённо: конфигурация приходит как
Iterable<MD>, и код спрашивает не «это справочник?», а «есть ли у него такое-то свойство». На существующих интерфейсах это ровно одна проверка, и в нашем коде их 67 обращений (AttributeOwner14,TabularSectionOwner14,ModuleOwner9,FormOwner24,PredefinedDataOwner4,ChildrenOwner2):Для свойств без интерфейса тот же код превращается в перебор классов — и по одному такому перебору на каждое свойство:
У
additionalIndexesветок будет уже 14. Хуже того, такой перебор молча устаревает: добавится в mdclasses девятый класс со свойством — потребитель об этом не узнает, ветку никто не допишет, и свойство просто не будет видно. С интерфейсом новый класс подхватывается сам.Нам эти свойства нужны предметно:
ВводитсяНаОсновании— чтобы сузить тип параметраОснование(сейчас это обобщённое «любая ссылка»), аВводПоСтроке,ДополнительныеИндексы,ПоляБлокировкиДанных,Характеристики— чтобы развернуть имена в коллекцияхМетаданные.<Объект>.<Коллекция>.Что хотелось бы получить
Интерфейсы по образцу уже существующих —
BasedOnOwner,AdditionalIndexOwner,DataLockFieldsOwner,InputByStringOwner,FullTextSearchOwner(имена на усмотрение), с единственным геттером каждый. Реализация у классов уже есть — нужно только объявить, что класс его реализует.