Язык объектных ограничений - Object Constraint Language

Язык объектных ограничений ( OCL ) - это декларативный язык, описывающий правила, применяемые к моделям Unified Modeling Language (UML), разработанные в IBM, и теперь он является частью стандарта UML. Изначально OCL был просто расширением формального языка спецификаций для UML. OCL теперь можно использовать с любой мета-моделью Meta-Object Facility (MOF) Object Management Group (OMG) , включая UML. Язык объектных ограничений - это точный текстовый язык, который предоставляет выражения ограничений и объектных запросов для любой модели MOF или метамодели, которые иначе не могут быть выражены в схематической нотации. OCL является ключевым компонентом новой стандартной рекомендации OMG по преобразованию моделей, спецификации запросов / представлений / преобразований ( QVT ).

Описание

OCL является потомком Syntropy , объектно-ориентированного метода анализа и проектирования второго поколения. В определении OCL 1.4 указан язык ограничений. В OCL 2.0 определение было расширено за счет включения общих определений языка объектных запросов.

Операторы OCL состоят из четырех частей:

  1. контекст, который определяет ограниченную ситуацию, в которой утверждение действительно
  2. свойство, которое представляет некоторые характеристики контекста (например, если контекст является классом, свойство может быть атрибутом)
  3. операция (например, арифметическая, ориентированная на набор), которая манипулирует или квалифицирует свойство, и
  4. ключевые слова (например, if, then, else и, or, not, подразумевает), которые используются для определения условных выражений.

Связь

OCL и UML

OCL дополняет UML , предоставляя выражения, в которых нет ни двусмысленности естественного языка, ни трудностей, присущих использованию сложной математики. OCL также является языком навигации для моделей на основе графов.

OCL и MOF

OCL делает модель Meta-Object Facility более точной, связывая утверждения с ее метаэлементами.

OCL и QVT

Особое значение для проектирования, управляемого моделями (MDE) или управляемой моделями архитектуры, имеет понятие преобразования модели . OMG определил стандарт специфический для модели трансформации под названием МФ / QVT или в коротком QVT . В настоящее время доступно несколько языков преобразования моделей, таких как GReAT , VIATRA или Tefkat , с разными уровнями соответствия стандарту QVT. Многие из этих языков построены на основе OCL, который является основной частью QVT- совместимости.

Альтернативы

Schematron - это язык проверки, основанный на правилах, и его можно рассматривать как альтернативу OCL. Однако Schematron работает с деревьями расширяемого языка разметки (XML), в то время как OCL позволяет перемещаться по моделям и метамоделям на основе MOF (то есть деревьям обмена метаданными XML ( XMI )). Другими словами, OCL относится к UML или MOF аналогично тому, как Schematron относится к XML . (Обратите внимание, что Schematron использует XPath для навигации внутри XML-деревьев.)
Будучи языком спецификации модели, позволяющим дизайнерам украшать модель или метамодель аннотациями без побочных эффектов, OCL можно заменить такими языками, как Alloy . Автоматическая генерация OCL в принципе возможна из естественного языка.

Примеры
Ограничение Эквивалент OCL
Возраст человека не отрицательный. context Person inv: self.age >=0
Человек моложе своих родителей. context Person inv: self.parents->forAll(p|p.age>self.age)
После дня рождения человек становится старше на год. context Person::hasBirthday() post: self.age=self.age@pre+1
У человека не более 2 родителей. context Person inv: self.parents->size()<=2
После того, как у кого-то появляется ребенок, его детский набор не пустой, а больше, чем раньше. context Person::getsChild() post: self.childs->notEmpty() and self.childs->size() > self.childs@pre->size()
Владельцем автомобиля может быть только взрослый человек. context Person inv: self.age<18 implies self.cars->isEmpty()
Первая регистрация автомобиля не может быть произведена до его постройки. context Auto inv: self.registration>=self.constructionYear
У каждого человека, у которого есть машина, есть хотя бы одна машина моложе этого человека. context Person inv: self.cars->notEmpty() implies self.cars->exists( c | Calendar.YEAR - c.constructionYear < self.age)
Никто не может быть самим себе родителем. context Person inv: self.parents->excludes(self)
По крайней мере, у одного человека есть машина. context Person inv: Person.allInstances()->exists(p | p.cars->size() > 0)


Смотрите также

Ссылки

внешние ссылки

Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.