ソフトウェア設計において、図解によるモデル化は直感的で強力ですが、詳細なルールや厳密な制約を表現するには限界があります。そこで活用されるのがOCL (Object Constraint Language)です。OCLは、UML(Unified Modeling Language)などのモデルに対して、自然言語では曖昧になりがちな制約やルールを厳密に定義するための宣言型言語です。
もともとはIBMによって開発され、現在はOMG (Object Management Group) の標準規格の一部となっています。OCLを用いることで、設計者は図だけでは伝えきれない「ビジネスルール」や「データの整合性条件」を、数学的な厳密さを持ちつつ、複雑な数式を使わずに記述することが可能です。
Key Facts
- 役割: UMLやMOFモデルにおいて、図解では表現不可能な制約やクエリを記述するテキスト言語。
- 標準規格: OMGによって標準化されており、UML標準の一部として組み込まれている。
- 適用範囲: UMLだけでなく、あらゆるMOF (Meta-Object Facility) ベースのメタモデルに適用可能。
- 主要な用途: モデルの整合性検証、モデル変換(QVT)の基盤、仕様の厳密化。
- 特性: 副作用のない宣言型言語であり、モデルの状態を検証することに特化している。
OCLの基本構造と仕組み
OCLは、オブジェクト指向分析・設計手法であるSyntropyの流れを汲んで発展しました。初期のバージョン1.4では主に制約の記述に特化していましたが、バージョン2.0からは汎用的なオブジェクトクエリ言語としての機能が拡張されています。
OCLのステートメントは、主に以下の4つの要素で構成されます。
- コンテキスト (Context): その記述がどの範囲(クラスや操作など)で有効であるかを定義します。
- プロパティ (Property): コンテキストが持つ属性や特徴(クラスであればその属性など)を指します。
- 操作 (Operation): プロパティを操作したり、条件を判定したりするための演算(算術演算や集合演算など)です。
- キーワード (Keywords): 条件式を構築するための論理演算子(if, then, else, and, or, not, impliesなど)です。
エコシステムにおけるOCLの相互関係
UMLとの補完関係
UMLは視覚的なモデルを提供しますが、詳細なルールを自然言語で書き添えると解釈の齟齬が生じやすくなります。OCLはこれを補完し、曖昧さを排除した厳密な仕様定義を可能にします。また、グラフベースのモデルを探索するためのナビゲーション言語としての側面も持っています。
MOFおよびQVTとの連携
OCLは、MOF (Meta-Object Facility) モデルのメタ要素にアサーション(断言)を紐付けることで、モデルの精度を向上させます。特にMDE (Model Driven Engineering)において重要な「モデル変換」の標準規格であるQVT (Queries/Views/Transformations)では、OCLが中核的な役割を担っています。GReATやVIATRA、Tefkatといった多くのモデル変換言語がOCLをベースに構築されています。
OCLの具体例:制約の記述方法
以下に、日常的なルールをどのようにOCLで表現するかを示す例をまとめます。
| 自然言語による制約 | OCLによる表現 |
|---|---|
| 人の年齢はマイナスにならない | context Person inv : self.age >= 0 |
| 人は親よりも若くなければならない | context Person inv : self.parents -> forAll(p | p.age > self.age) |
| 誕生日の後、年齢が1歳増える | context Person::hasBirthday() post : self.age = self.age@pre + 1 |
| 親は最大2人まで | context Person inv : self.parents -> size() <= 2 |
| 18歳未満は車を所有できない | context Person inv : self.age < 18 implies self.cars -> isEmpty() |
| 自分自身を親に持つことはできない | context Person inv : self.parents -> excludes(self) |
代替手段と拡張機能
OCLと同様にルールベースの検証を行う言語としてSchematronがありますが、SchematronはXMLツリーを対象とするのに対し、OCLはMOFベースのモデル(XMIツリーなど)を対象とするという違いがあります。また、モデルへのアノテーションを目的とする場合、Alloyのような言語が代替案となることがあります。なお、自然言語からOCLを自動生成する研究も進められています。
さらに、標準的なOCLを拡張した実装も存在します。例えばEclipse OCLではMap型や追加のオペレータが導入されており、AgileUMLでもMap型や関数型がサポートされています。これらはPythonやSwiftといった現代的なプログラミング言語のデータ構造に近い設計となっています。
Frequently Asked Questions
OCLを導入する最大のメリットは何ですか?
最大のメリットは、UML図だけでは表現できない複雑なビジネスルールや整合性制約を、曖昧さなく厳密に定義できる点にあります。これにより、設計段階でのミスを減らし、実装への正確な橋渡しが可能になります。
OCLはプログラミング言語のように実行して処理を記述するものですか?
いいえ、OCLは「宣言型言語」であり、副作用を持ちません。つまり、データの値を変更したり処理を命令したりするのではなく、「あるべき状態」や「満たすべき条件」を記述して検証するための言語です。
UMLを使っていなくてもOCLは利用できますか?
はい。OCLはUMLだけでなく、あらゆるMOF (Meta-Object Facility) ベースのメタモデルに適用可能です。したがって、MOF準拠のモデルであればUML以外の環境でも利用できます。
QVTとOCLの関係について教えてください。
QVTはモデル変換のための標準規格であり、OCLはその変換ルールを記述するための主要な構成要素となっています。多くのQVT準拠言語がOCLをベースに構築されており、モデルの変換条件を定義する際にOCLの構文が利用されます。
OCLの学習において、数学的な知識は必須ですか?
高度な形式検証を行う場合は数学的知識が役立ちますが、基本的な制約記述においては、論理演算(AND/OR/NOT)や集合操作の概念があれば十分に利用可能です。複雑な数式を直接書くことなく、直感的なテキスト形式で制約を定義できるよう設計されています。
References
- Object Management Group (OMG); Object Constraint Language Specification, Chapter 7 of OMG Unified Modeling Language Specification, Version 1.3, March 2000 (first edition)
- Object Management Group (OMG); Object Constraint Language OMG Available Specification Version 2.0, May 2006
- This article is based on material taken from Object+Constraint+Language at the prior to 1 November 2008 and incorporated under the "relicensing" terms of the , version 1.3 or later.
- Imran Sarwar Bajwa (October 2010). "OCL Constraints Generation from Natural Language Specification, 2010". . :10.1109/EDOC.2010.33. 7495256.
{{}}: Cite journal requires|journal=() - "Eclipse OCL™ (Object Constraint Language)". 31 January 2013.
- Lano, Kevin; Kolahdouz-Rahimi, Shekoufeh (2021). "Extending OCL with Map and Function Types". Fundamentals of Software Engineering. Lecture Notes in Computer Science. Vol. 12818. pp. 108–123. :10.1007/978-3-030-89247-0_8. . 239029860.