HOME    BRMSブログ  No.7 Corticonの語彙の継承機能を使ってみよう

BRMS徹底活用ブログ

No.7 Corticonの語彙の継承機能を使ってみよう

2016.09.30 Progress Corticon

本エントリーは株式会社アシスト様が寄稿したエントリー(https://www.ashisuto.co.jp/product/category/brms/progress_corticon/column/detail/brmstech07.html)を転載したものとなります。

No.7 Corticonの語彙の継承機能を使ってみよう

語彙の構築時に、1つのエンティティに関連する属性も含めてしまっていませんか?
たとえば、物を運搬するときに人がおこなう場合と装置やロボットが行うのでは費用の考え方が異なります。
この場合、運搬をするということを1つのエンティティで表現すると人には関連するが装置には関連しない属性が混在することになります。この混在する状態をシンプルにするためにCorticonでは語彙構築時に継承の機能を使用することができます。この継承機能を使用すると、見て分かりやすくシンプルな語彙を作ることができます。今回はこの継承機能を使った語彙の作り方と、その語彙を使うルールについて紹介します。

継承の使用について

シナリオ

業務に必要な要件(能力)と、それに対応可能なリソース(人、装置、ロボット)とをマッチングし、リソース(人、装置、ロボット)を業務に割り当てるサービスを作ります。また、このマッチング時の処理の一環として、業務に割り当て可能なリソース(人、装置)の総費用も求めます。
この割り当てにかかる総費用は、業務期間 * リソース費用です。

リソースには以下の種類があり、このために複雑になります。
1. Human(人) (costPerHour=baseCostPerHour + additionalCostPerHour)
2. Equipment(装置) (costPerHour=fuelCostPerHour + maintenanceCostPerHour)
3. Robots(ロボット) (costPerHour=baseCostPerHour+ fuelCostPerHour + maintenanceCostPerHour+ programmingCost)

それぞれのリソースには、共通の属性と、固有の属性とがあります。
この場合に作成する語彙とルールをみてみましょう。

継承を使用しない場合

シナリオに対して実装する際に以下のような語彙を作成します。
この語彙には、Resourceエンティティに、必要な属性全てと、リソースの種類を示す属性(type)があります。

case1

しかし、すべてのリソースの種類に対して、すべての属性を適用する必要はありません。たとえば、Equipment(装置)には、製造日(dateOfManufacture)や時間当たりの燃料費(fuelCostPerHour)が必要ですが、Human(人)には必要ありません。Human(人)は誕生日(dateOfBirth)はあっても製造日(dateOfManufacture)とは言いません。
以下のルールシートは、先ほどの語彙を使用してすべての属性を1つのエンティティに組み入れた場合のリソースの費用を計算します。

case2

アクションEでは、Equipment(装置) と Robot(ロボット)に対する追加費用を求めています。
アクションFでは作業者(Human(人) と Robot(ロボット))に対する追加費用を求めています。
Corticonの継承機能を使用しない場合は、上のようになります。

また、リソースをタスクに割り振るルールは、次のようにシンプルに書くことができます。

case3

継承を使用する場合

以下のように語彙を作成します。語彙ツリービューに、灰色で表示される属性は、継承した属性であることを示します。

case4

継承を使用すると、Resourceにはルール作成に必要な属性のみとなり、とてもシンプルになります。
異なる種類のリソース(Equipment、Worker)は、Resource を継承元にして、それぞれ別のエンティティとして定義します。

ここでは、Humanはworkerの種類の1つとし、workerを継承して作成しています。

case5

Robotは Worker と Equipment の両方のエンティティを継承します。Corticonは複数のエンティティからの継承をサポートしています。

case6

継承の設定は語彙エディタの継承する側の継承元プロパティで行います。

case7

リソースの種類ごとに、それぞれ別のエンティティを作成すると、リソースをタスクに割り振るルールは複雑になるのでしょうか?
いいえ。ルールを変える必要はありません。

case8

Resourceへの参照は、Resourceから継承したすべてのエンティティを自動的に含みます。
つまり、リソースをタスクに割り振るルールを変更することなく、Resourceの種類を追加することができます。

唯一必要なことは、リソースを割り振りルールシートの中で必要となる、リソースの時間単価を計算することです。これは、ある意味、プログラミング言語のインタフェースという概念がない場合の対応に似ています。つまり、必要なデータエンティティを計算するルールを自分で書く必要があります。

・ルールシート

時間単価の計算は、以下のように1枚のルールシートに書くことができます。

case9

リソースの種類(HumanやRobot)を明示的に照会する以外は、最初のルールシートにとてもよく似ています。

この書き方以外にも、Resourceの種類ごとにルールシートを分けるという方法もあります。この場合、新しい種類のリソースを追加する場合はいつでも、時間単価を計算するルールシートの追加が必要です。追加費用は、Equipmentという新しい種類のエンティティを作ったことで、Equipmentルールシートで自動的に処理されます。

各リソースの時間あたりの費用を初期化

case10

Human(人)の時間単価と年齢を計算

case11

Robot(ロボット)の時間単価を計算

case12

Worker(ワーカー)の追加費用を計算

case13

Equipment(装置)の時間単価および追加費用と製造日(dateOfManufacture)からの経過年数を計算

case14

RobotはWorkerとEquipmentの両方を継承しているため、3つのルールシートは、それぞれ相当する費用をRobotに適用することに注意してください。

・ルールフロー

作成したそれぞれのルールシートを適用する順に定義します。

case15

・テストケース

それぞれのワーカーが2時間稼働したときの費用を求めています。

case16

継承の機能を少しお分かりいただけましたでしょうか。
ぜひ使ってみてくださいね。

ではまた。

著者紹介

毛井さん

株式会社アシスト 情報基盤事業部 製品統括部プログレス推進部

株式会社アシスト入社以来、5インチFDを使うソフトウェアやメイン
フレームの簡易開発言語の時代から現在のProgress Corticonまで、
製品の日本語化や技術サポート、研修などを行う。

download close

閉じる

[2月16日(木)]

「Progress Corticon」ハンズオンセミナー

詳細はこちら