OCL - Нужны некоторые разъяснения по инвариантам? - PullRequest
2 голосов
/ 24 февраля 2012

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

Разработчик программного обеспечения во мне заставляет меня думать, что OCL позволит наложить общие ограничения на модель.Ограничения, подобные всем объектам класса Person в этой модели имеют мужской пол, или все объекты класса car имеют четыре колеса, которые кажутся невероятно полезными, и использование декларативной парадигмы в отношении моей модели кажется правильным.

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

Он считает, что в OCL мы можем определять ограничения (предварительные и последующие условия / инварианты) внутри функций, которые предоставляют контекст.

Может кто-нибудь прояснить это для меня?

Ответы [ 4 ]

2 голосов
/ 21 февраля 2013

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

У OCL есть ключевое слово под названием context, которое в основном может ссылаться на любые классификаторы UML (типы, классы, интерфейсы)., ассоциации, типы данных, ...).

Упомянутый вами пример на самом деле проще всего описать в OCL с помощью простых выражений, таких как:

context Person inv: self.age <= 120 </p>

context Person inv: self.countChildren () <= 20 </p>

2 голосов
/ 25 ноября 2012

Не уверен, что я действительно понимаю, что вы подразумеваете под контекстами функций.Тем не менее, OCL выходит за рамки просто условия инвариантов / до / после.

Из спецификации OMG OCL 2.3.1 [1] 7.2.1 Где использовать OCL :

OCL может использоваться для различных целей:

  • в качестве языка запросов,
  • для указания инвариантов классов и типов в модели классов ,
  • для указания инварианта типов для стереотипов,
  • для описания условий до и после операции и методов ,
  • для описания охраны,
  • для определения цели (наборов) для сообщений и действий,
  • для указания ограничений на операции и
  • для указания правил деривации для атрибутов для любого выражения в модели UML.

Итак, другими словами, выверно, вы можете иметь ограничения (не уверен, что вы подразумеваете под общими) на классах модели, которые вы описываете.

[1] http://www.omg.org/spec/OCL/2.3.1

1 голос
/ 10 августа 2013

В соответствии со спецификацией UML (2.5 все еще находится в стадии бета-версии на момент написания) контекстом для контекста ограничения является любое пространство имен модели, включая классификаторы (классы). Ограничение может быть задано с помощью выражения OpaqueExpression, определенного, например, через OCL.

В качестве примера рассмотрим этот пост: http://lowcoupling.com/post/57689107913/constraining-uml-models-through-ocl

0 голосов
/ 18 декабря 2017

Как уже отмечалось, ограничение может быть помещено в любое пространство имен UML. Однако семантика инвариантов определена только для классов. Инвариант, определенный в пакете, не определен, что, к сожалению, требует, чтобы определение универсальной истины (для allInstances ()) было связано с каждым экземпляром некоторого класса, потенциально приводящим к избыточной переоценке в наивных инструментах OCL. С нетерпением ждем включения инвариантов пакетов в будущем OCL.

...