Почему allInstance не для isUnique?

У меня есть клиент класса с атрибутом noClient, я хочу убедиться, что нет клиента с таким же атрибутом noClient.

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

context Client
inv NoClientUnique: Client.allInstances -> isUnique (noClient)

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

Это школьный вопрос. Может быть, там недостаточно сложно, но я провожу часы, пытаясь понять. Я застрял здесь.


ocl
person Kim    schedule 27.02.2014    source источник


Ответы (6)


Помимо незначительных синтаксических ошибок (должно быть allInstances()-> ), я не вижу проблем с вашим выражением. Убедитесь, что вы правильно поняли своего учителя относительно того, что ограничение должно было ограничивать.

person Jordi Cabot    schedule 27.02.2014

Я только что видел в примере, как мой учитель создал класс Singleton, а затем использовал Singleton в качестве контекста, а не Client.

class Singleton
-- nothing here.
end
...
context Singleton
inv SingletonisUnique : Singleton.allInstances -> size() = 1
inv noClientUnique : Client.allInstances -> isUnique(noClient)

Я думаю, что это ключ к моей проблеме, но я не понимаю, что там за механизм.

person Kim    schedule 27.02.2014
comment
Но noClient не определяется в контексте Singleton. Ваш пример (вопрос) означает, что не может быть двух экземпляров клиента с одним и тем же номером. Пример вашего учителя мог бы работать, если бы он был постусловием операции noClientUnique(noClient), но он не работает как инвариант Singleton. - person Javier; 07.03.2014
comment
Привет, отдал учителю, следую его примеру. Я задам ему вопрос позже об этом. И сообщение здесь, если я могу понять, что он сказал. :) Спасибо обоим за вашу помощь. - person Kim; 08.03.2014

Насколько я знаю, в типизированном видении параметр OclExpr in должен быть логическим выражением для оценки, а здесь это не так.

Конечно, результат будет варьироваться от одного инструмента OCL к другому.

person Pascal A    schedule 05.09.2017

Ваш учитель прав в том, что с типичными инструментами OCL оценка всех клиентов будет повторяться для каждого клиента.

Но ваш учитель также неправ в том, что приличный инструмент OCL должен оптимизировать инвариант без самости для достижения того же эффекта, что и ложный синглтон. Инструменты должны помогать пользователям не заставлять пользователей вручную оптимизировать.

Более реалистично, что контейнером Client может быть Business, и вы могли бы более разумно выразить бизнес-практику, что noClient уникален в Business, поскольку на самом деле это не ограничение Client.

person Ed Willink    schedule 25.07.2017

Другой вариант:

context Client
inv NoClientUnique: Client.allInstances()->forAll(c1, c2 : Client | c1 <> c2 implies c1.noClient <> c2.noClient)
person Santiago Murchio    schedule 10.11.2018

Для тех, кто ищет ответ в 2020 году:

Client.allInstances().collect(noClient) -> count(noClient) = 1

Я использую USE из Бременского университета, и операция isUnique() не работает должным образом. Мне потребовалось некоторое время, чтобы найти альтернативу.

person Chris Hamilton    schedule 26.11.2020