連載第15-1回
UMLの基礎と応用

(株)NTTデータ 技術開発本部 副本部長
山本修一郎

 今回は前回に引き続き、エリクソンとペンカーの本[1]で紹介されているビジネスルールの記述法について説明しよう。ビジネスパターンについては、次回紹介する。

ビジネスルール

 ビジネスモデリングで記述するビジネスルールには、制約ルール、存在ルール、計算ルール、推論ルールがある。制約ルールには、構造制約、操作制約、刺激応答制約がある。

 構造制約では、関連するクラス間の多重度を指定する。操作制約では、クラス操作を実行する前に成立する必要のあるクラス属性やクラス操作の引数などに関する事前条件と、クラス操作を実行した後で、実行後のクラス操作の結果やクラス属性およびクラス操作引数などに関する事後条件を指定する。クラス操作に関する事前条件と事後条件を厳密に定義することにより、クラス操作の仕様を明確に定義できるようになる。刺激応答制約では、状態遷移図や、アクティビティ図、シーケンス図、コラボレーション図で見たように、特定の状態遷移やメッセージ送信が発生するための条件を指定する。

 存在ルールでは、クラスオブジェクトが存在するための条件を指定する。

 計算ルールでは、与えられた属性や値などから、結果としての属性を計算する方程式を指定する。推論ルールでは、ある条件が真のときに成立する真偽値を持つ条件式を指定する。計算ルールと推論ルールをまとめて導出ルールと呼ぶ。

 UML図式を用いて記述できるビジネスルールは制約ルールと存在ルールである。これに対して導出ルールはUML図式だけでは記述できない。導出ルールはUML のオブジェクト制約言語OCL(ObjectConstraint Language)で記述することができる。またOCLは制約ルールや存在ルールも記述できる。

 以下では、まずOCLの経緯、構文や必要となる演算子について述べ、OCLによるビジネスルールの記述例を説明しよう。

OCLの経緯

 OCLはUMLで制約とルールを記述するためのテキスト形式の言語である。1995年にJ.WarmerとS.CookらによるIBM のビジネスモデリンググループが考案してOMGに提案した。OCLは1997年にUML1.1で採用された[2]。ビジネスルールにおけるOCL の用途は、前述したように、次の5つである(表1)。

表1 OCLの用途
表1 OCLの用途

(1)クラスの不変表明式
(2)クラス操作の事前条件式と事後条件式
(3)関連するクラス属性間のナビゲーションルール
(4)導出ルール
(5)ガード式


 OCLでは、これらの条件式を宣言的な関数型言語で記述することができる。このため明確なクラス仕様を定義できるという特徴がある。またOCL は型付け言語であり、基本型、コレクション型、モデル型を持つ。基本型には、整数型、実数型、論理型、文字列型がある。コレクション型によりクラスのインスタンスとしてのオブジェクトの集合を表すことができる。モデル型はクラスを表す。OCL演算子では基本型やコレクション型に関する演算が定義されている。

 しかし、通常のプログラミング言語のようにシーケンス文やループ文を用いて計算手順を定義できないので、クラス操作によって何を計算すべきかをOCLで記述することはできても、どのようにして計算結果を求めるかをOCLでは記述することはできない。それではOCLの具体的な構文を見ていこう。

OCL構文


 OCL構文には、クラスの属性に関する属性制約とクラス操作に関する操作制約の2種類のcontext構文がある。

[構文]属性制約
context クラス名 inv 制約名 : 制約式--コメント

[説明]
 inv はinvariant の省略形で、不変表明を意味する。制約名を省略することもできる。制約式により、クラスの属性に関するOCL 演算子を用いた条件式を記述する。コメントを記述する場合、記号--に続けて、任意の文字列を記述する。

[構文]操作制約
context クラス名:: 操作名() : 型
pre :   事前条件式
post :  事後条件式

[説明]
 以下の予約語を用いた式により操作の入力引数やクラス属性と操作結果に関する条件を記述する。pre:に続く事前条件式により、操作を実行する前の制約を記述する。またpost:に続く事後条件式により、操作を実行した後で成立する制約を記述する。以下のような予約語が用意されている。

result :結果を表す予約語
self :context で指定されたクラスのオブジェクトを明示的に表す予約語
@pre :指定された変数のクラス操作を実行する前の値を表す予約語

条件を指定するために、次のif条件式を用いる。

[構文]if 条件式
if 条件式-1 then 条件式-2 else 条件式-3 endif

[説明]
if 式の値は、条件式-1 が真のとき、条件式-2 の値である。そうでないとき、条件式-3 の値となる。

OCL式
 OCL式ではクラスの属性や値を要素としてクラス操作やOCL演算子を用いて式を構成する。OCL演算子を表2に示す。

表2 OCL演算子
表2 OCL演算子

 以下では図1に示したクラス図を用いてOCL式の例を示す。図1に示したように、エリクソンとペンカーによるUMLの拡張方式では、ステレオタイプ<<business rule>>が付いたノートの中でビジネスルールをOCL式で記述されている。

図1 ビジネスルールが付けられたクラス図
図1 ビジネスルールが付けられたクラス図

[例]顧客Customer、注文Order、商品Articleとそれらの関係(図1)

 顧客Customer属性にはnameとageがある。

 注文Orderには属性として合計sum、手数料feeがある。sumは商品Articleの価格priceの合計である。sumが10以上であればfeeはsumの10%である。また操作として税金tax,費用totalCostがある。totalCostは商品価格の合計である。商品Articleには属性として入手可能性availability、個数numbe、価格priceがある。availabilityの値はinStockもしくはoutStockのいづれかである。また操作として印刷printと配達可能deliverableがある。入手可能性の値がinStockのときdeliverableはtrueである。そうでないときfalseである。

[例]注文のOCL式
context Order
inv feeCalculation:fee=0 .01*
self.sum--Calculation of fee
inv : self.sum> 10
inv : customer_of_order.age>18

[説明]
feeCalculationは手数料はOrderの属性sumの1%であるということを表す制約に付けられた名前である。またsumは10より大きいという制約がある。注文に関してロールcustomer_of_order.ageで関連する顧客の年齢は18歳以上である。

[例]商品のdeliverable操作に関するOCL式

context Article::deliverable ():Boolean
pre: --
post: result =(avairability = #inStock)

[説明]
事前条件に対する指定はない。事後条件は、入手可能性の値がinStockのときdeliverableはtrueであり、そうでないときfalseであることが必要になる。

ナビゲーション

 関連するクラスのオブジェクトを選択するときにナビゲーション式->を用いることができる。ナビゲーション式は、context で指定されたオブジェクトと関連するコレクション型オブジェクトを返却する。コレクション型については後述する。

[構文]ナビゲーション
ロール名->

[説明]
 contextで指定されたクラスと関連するコレクションのプロパティや操作を参照することをロール名を用いて指定する。クラス間の関連にロール名が付与されていない場合には、関連するクラス名を小文字で指定することにより、ロール名を代替する。

[例]注文の個数
context Customer inv: orders->size>1

[説明]
顧客とロールordersで関連する注文クラスに対するオブジェクトの集合の大きさは1より大きいことを示している。ここでsizeはコレクション型のオブジェクトの個数を返すコレクション演算子である。

NEXT >> 

・連載第1回

・連載第2回

・連載第3回

・連載第4回

・連載第5回

・連載第6回

・連載第7回

・連載第8回

・連載第9回

・連載第10回

・連載第11回

・連載第12回

・連載第13回

・連載第14回

・連載第15回

・連載第16回

・連載第17回