Можно ли сохранить производные атрибуты и отключить деривацию в Ecore и OCL?

Я хочу портировать унаследованный формат данных, который состоит из концепций, подобных Eclipse Modeling Framework (EMF) Ecore: элементы с параметрами, которые имеют разные типы данных и значения по умолчанию.

Пользовательский инструмент позволяет редактировать такие экземпляры модели с помощью необычного графического интерфейса на основе таблиц.

Кроме того, общей особенностью параметров является то, что можно добавить правило деривации, которое указывает, что значение параметра автоматически вычисляется из других параметров. Это также похоже на производные от Ecore атрибуты, которые могут быть реализованы с помощью кода Java или OCLinEcore.

Однако автоматический вывод параметра в устаревшем формате не является обязательным. Т.е. пользователь всегда может выбрать такой производный параметр и выбрать, что он или она хочет ввести значение вручную. Следовательно, даже полученные значения параметров не являются временными, но всегда сохраняются, включая состояние, находится ли параметр в "автоматическом" или "ручном" режиме.

Есть ли способ в Ecore (включая такие расширения, как OCLinEcore) сохранить производные атрибуты и выборочно / временно включить / отключить деривацию во время выполнения?

Обходным путем может быть не использование производной от Ecore функции атрибутов, а ручная реализация необязательного деривации в клиентском коде. Однако объявление необязательного правила деривации не будет стандартным способом. Любой способ использовать OCLinEcore или как?

2 ответа

Решение

Вот как мне это сделать в Xcore:

interface Identifier {
    id String uid
    boolean derive_enabled = "true"
    unsettable String uid_derived

    readonly String uid_generated get {  // this is the 'derived' parameter
        if (uid_derived == null || uid_derived.isEmpty) {
            uid_derived  = EcoreUtil.generateUUID().toString
        }
        if (derive_enabled) {
            uid = uid_derived
        }
        return uid
    }
}

Вы можете легко реализовать это в Ecore/OCL-in-Ecore.

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

Я не уверен, что это возможно. Проблема в том, что у вас есть два возможных значения: ручное и производное, которые могут быть одинаковыми. Если производное не сохранилось легко. Но если производная сохраняется, как вы знаете, кто является хозяином.

Аналогичная проблема возникает в представлениях свойств EMF, где было бы хорошо различать вычисляемое и явное значение с серым / не серым фоном. Например, ID плагина редактирования GenModel вычислен или явный. Хуже это пустое свойство по умолчанию - буквально не установлено или явно пусто.

Если у вас есть дополнительный мастер-флаг в вашей метамодели, это должно быть относительно просто. До этого у вас может быть решение, которое работает в большинстве случаев, но в других случаях это может сбить с толку.

Другие вопросы по тегам