 |
使えるUML 第9回 |
2007.10.4 掲載
あいまいさを排除する
UMLの追加機能的な仕様である OCL(Object Constraint Language : オブジェクト制約言語)という言語に注目します。OCLとは、UMLで記述したモデルをより厳密にするための追加情報を記述するための言語です。システム開発の現場では、まだそれほど浸透していませんが、状況によってはとてもメリットのある技術です。今回の記事では、OCLを使用することで回避できる問題と、OCLの概要について説明します。
◇飼育担当が所属する組を表現できないクラス図
学校の教室で、モルモットとセキセイインコのペットを飼っており、それぞれに学生の飼育担当がいるものとします。これをクラス図で表現すると図 1のようになるでしょう。
図1 飼育係りのクラス図
ところで、当然ながらペットの飼育担当は同じ教室の学生でなければなりません。しかし上記図1のクラス図ではこのことを表現できていません。例えば図2のようなオブジェクト図で表現される関係が許されてしまいます。
図2 飼育係りのオブジェクト図
このような問題は、クラス図中に制約を加えることで回避することができます。制約は日本語などの自然言語や、プログラミング言語の書式での擬似コードなどでも記述することができますが、ここでは、内容を誤解される心配がなく、制約を記述するための言語として標準化されているOCLで記述することにします。OCLで「ペットの飼育担当は同じ教室の学生」ということを表現する場合には、図3のように「ペット」クラスにノートを追加します。
図3 飼育係りのクラス図(OCL付き)
OCLによる制約を、UMLの図の中ではなく、別の場所に記述する場合は、次のような書式になります。
図4 別の場所に記述する際のOCL
このOCLの解説は以下のとおりです。
| 記号 |
説明 |
| (a) |
“Context”はOCLが属するクラスや属性を表し、この例では「ペット」クラス。 |
| (b) |
“inv:”は不変条件(invariant)を意味し、その後に続く式が常に満たすべき条件であることが示される。 |
| (c) |
“->includes()”はコレクション(セットを含む)に対する操作の一種で、引数がコレクション中に存在する場合に真となる。 |
| (d) |
“self”はContextであるペットを意味する。その後の「.場所.所属学生」のように関連の関連端をドットでつなげることで、関連を走査することができる。ここでは所属学生の多重度が * なので、全体として学生のセットとなる。 |
表1 OCLの説明
まとめて、このOCLを日本語で表現すると、「ペットの場所の所属学生に、ペットの飼育担当は含まれなければならない」となります。
OCLは、一見するとJavaやC#のようなオブジェクト指向言語の文法表現に似ていることが分かります。これらの言語に親しんでいれば理解するのは簡単です。また式による記述なので自然言語のような曖昧さがなく、誰が読んでも同じ意味となり誤解をあたえることがありません。
◇OCLの特徴
例でみてきたように、OCLによってクラス図で表現できなかった制約を追記することができます。もちろんこれ以外にもOCLが活用できる場面は数多くあります。以下にOCLの主な特徴をまとめました。
- 宣言的言語
- 契約による設計(不変条件、事前条件 事後条件)
- 派生属性や動的な多重度を定義できる
- メッセージの引数やガード条件に使用できる
1.の「宣言的言語」というのは、「何を(What)」したいのかということを記述する言語ということです。これはJavaなどのような命令型言語が「どのように(How)」処理を行うのかについて記述する言語であることと対照的です。リレーショナルデータベースを使ったことがある方はSQLを思い浮かべれば分かりやすいかもしれません。SQLは最も有名な宣言的言語の1つです。SQLでは、どのようなデータ(何を)を欲しいのかが問い合わせ命令(SELECT文)で指定し、その処理の方法はデータベースに任されます。
2.の「契約による設計(DbC : Design by Contract)」とは、不変条件・事前条件・事後条件によって、クラスまたはメソッドの仕様を記述することを指しています。「契約による設計」についての解説はまた次の機会に行いたいと思います。
3.の派生属性とは、それ自身が値を持たずに、その他の属性や関連先のクラスから導出することによって値が求められる属性です。この導出方法をOCLで定義することができます。また、OCLでは、オブジェクトの状態によって変化する関連の多重度を定義することができます。
4.の「メッセージの引数やガード条件に使用できる」というのは、例えばシーケンス図の中でのメッセージの引数をOCLで記述したり、ステートマシン図の中のガード条件をOCLで記述したりすることで、自然言語に比べてより厳密にモデルを記述することができるということです。またOCLはクラス図以外のダイアグラムでも使用することができるということもポイントです。
◇まとめ
今回は、クラス図で不足していた制約をOCLで補うこと、またOCLの概要について紹介しました。モデルからあいまいさを排除するための制約は、必ずしもOCLで記述しなければいけないというものではなく、日本語などの自然言語で記述した方がよい状況がたくさんあることに注意してください。
「契約による設計」を通して、より多くのOCLに触れる機会は、今後の回にとっておくこととさせていただきます。
■筆者紹介 山下 智也/Tomonari Yamashita 株式会社テクノロジックアート テクニカルデプト UMLモデリングチーム
|