Skip to content

[NEW] Интерфейсы-владельцы для массовых свойств объектов метаданных (BasedOn, ДополнительныеИндексы, ВводПоСтроке, …) #677

Description

@sfaqer

Описание функциональности

По обсуждению в #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 (имена на усмотрение), с единственным геттером каждый. Реализация у классов уже есть — нужно только объявить, что класс его реализует.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions