No.7 Corticonの語彙の継承機能を使ってみよう
2016.09.30 Progress Corticon
本エントリーは株式会社アシスト様が寄稿したエントリー(https://www.ashisuto.co.jp/product/category/brms/progress_corticon/column/detail/brmstech07.html)を転載したものとなります。
|
語彙の構築時に、1つのエンティティに関連する属性も含めてしまっていませんか?
たとえば、物を運搬するときに人がおこなう場合と装置やロボットが行うのでは費用の考え方が異なります。
この場合、運搬をするということを1つのエンティティで表現すると人には関連するが装置には関連しない属性が混在することになります。この混在する状態をシンプルにするためにCorticonでは語彙構築時に継承の機能を使用することができます。この継承機能を使用すると、見て分かりやすくシンプルな語彙を作ることができます。今回はこの継承機能を使った語彙の作り方と、その語彙を使うルールについて紹介します。
継承の使用について
・シナリオ
業務に必要な要件(能力)と、それに対応可能なリソース(人、装置、ロボット)とをマッチングし、リソース(人、装置、ロボット)を業務に割り当てるサービスを作ります。また、このマッチング時の処理の一環として、業務に割り当て可能なリソース(人、装置)の総費用も求めます。
この割り当てにかかる総費用は、業務期間 * リソース費用です。
リソースには以下の種類があり、このために複雑になります。
1. Human(人) (costPerHour=baseCostPerHour + additionalCostPerHour)
2. Equipment(装置) (costPerHour=fuelCostPerHour + maintenanceCostPerHour)
3. Robots(ロボット) (costPerHour=baseCostPerHour+ fuelCostPerHour + maintenanceCostPerHour+ programmingCost)
それぞれのリソースには、共通の属性と、固有の属性とがあります。
この場合に作成する語彙とルールをみてみましょう。
・継承を使用しない場合
シナリオに対して実装する際に以下のような語彙を作成します。
この語彙には、Resourceエンティティに、必要な属性全てと、リソースの種類を示す属性(type)があります。
|
しかし、すべてのリソースの種類に対して、すべての属性を適用する必要はありません。たとえば、Equipment(装置)には、製造日(dateOfManufacture)や時間当たりの燃料費(fuelCostPerHour)が必要ですが、Human(人)には必要ありません。Human(人)は誕生日(dateOfBirth)はあっても製造日(dateOfManufacture)とは言いません。
以下のルールシートは、先ほどの語彙を使用してすべての属性を1つのエンティティに組み入れた場合のリソースの費用を計算します。
|
アクションEでは、Equipment(装置) と Robot(ロボット)に対する追加費用を求めています。
アクションFでは作業者(Human(人) と Robot(ロボット))に対する追加費用を求めています。
Corticonの継承機能を使用しない場合は、上のようになります。
また、リソースをタスクに割り振るルールは、次のようにシンプルに書くことができます。
|
・継承を使用する場合
以下のように語彙を作成します。語彙ツリービューに、灰色で表示される属性は、継承した属性であることを示します。
|
継承を使用すると、Resourceにはルール作成に必要な属性のみとなり、とてもシンプルになります。
異なる種類のリソース(Equipment、Worker)は、Resource を継承元にして、それぞれ別のエンティティとして定義します。
ここでは、Humanはworkerの種類の1つとし、workerを継承して作成しています。
|
Robotは Worker と Equipment の両方のエンティティを継承します。Corticonは複数のエンティティからの継承をサポートしています。
|
継承の設定は語彙エディタの継承する側の継承元プロパティで行います。
|
リソースの種類ごとに、それぞれ別のエンティティを作成すると、リソースをタスクに割り振るルールは複雑になるのでしょうか?
いいえ。ルールを変える必要はありません。
|
Resourceへの参照は、Resourceから継承したすべてのエンティティを自動的に含みます。
つまり、リソースをタスクに割り振るルールを変更することなく、Resourceの種類を追加することができます。
唯一必要なことは、リソースを割り振りルールシートの中で必要となる、リソースの時間単価を計算することです。これは、ある意味、プログラミング言語のインタフェースという概念がない場合の対応に似ています。つまり、必要なデータエンティティを計算するルールを自分で書く必要があります。
・ルールシート
時間単価の計算は、以下のように1枚のルールシートに書くことができます。
|
リソースの種類(HumanやRobot)を明示的に照会する以外は、最初のルールシートにとてもよく似ています。
この書き方以外にも、Resourceの種類ごとにルールシートを分けるという方法もあります。この場合、新しい種類のリソースを追加する場合はいつでも、時間単価を計算するルールシートの追加が必要です。追加費用は、Equipmentという新しい種類のエンティティを作ったことで、Equipmentルールシートで自動的に処理されます。
各リソースの時間あたりの費用を初期化
|
Human(人)の時間単価と年齢を計算
|
Robot(ロボット)の時間単価を計算
|
Worker(ワーカー)の追加費用を計算
|
Equipment(装置)の時間単価および追加費用と製造日(dateOfManufacture)からの経過年数を計算
|
RobotはWorkerとEquipmentの両方を継承しているため、3つのルールシートは、それぞれ相当する費用をRobotに適用することに注意してください。
・ルールフロー
作成したそれぞれのルールシートを適用する順に定義します。
|
・テストケース
それぞれのワーカーが2時間稼働したときの費用を求めています。
|
継承の機能を少しお分かりいただけましたでしょうか。
ぜひ使ってみてくださいね。
ではまた。
著者紹介
|
株式会社アシスト 情報基盤事業部 製品統括部プログレス推進部 |