見出し画像

BridgePoint で作成した概念モデルの振舞アクションを C# コードに変換する

※ 本ドキュメントの利用は、https://github.com/kae-made/kae-made/blob/main/contents-license.md に記載のライセンスに従ってご利用ください。
※ 本稿は、Knowledge & Experience への許可なく、本稿のPDF、XPS、スクリーンショット等による電子文書化、紙への印刷等を行い、第三者に提供する行為は、一切禁止とさせていただきます。

https://github.com/kae-made/kae-made/blob/main/contents-license.md

はじめに

本稿は、「BridgePoint で作成した概念モデルを In Memory で動作する C# アプリケーションライブラリに変換する」で解説した生成機能に加えて、以下の要素に定義されたアクション記述を C# のコードに変換する拡張機能について解説します。

  • ドメインファンクション

  • クラスオペレーション

  • 状態モデルのエントリアクション

  • 計算可能な特徴値

アクション記述は、非常に高い抽象度で定義された、Object Action Language の文法に従って記述されます。
この機能を使うことにより、BridgePoint のベリファイ機能で振舞検証された概念モデルから、同等の振舞の実行セマンティクスで動く C# コードが生成できます。

ジェネレータを使う

本稿で解説する C# コードジェネレータは、https://github.com/kae-made/domainmodel-code-generator-csharp で公開しています。clone または、ZIP ファイルのダウンロードを行い、Visual Studio 2022 で、CodeGenerator/CodeGenerator.sln を開きます。
CodeGenerator/ConsoleAppCsharpGenerator プロジェクトのプロパティで、デバッグ→全般で、生成に必要な引数を設定し、このプロジェクトを実行します。
BridgePoint で作成したモデルがない場合は、以下のモデルをサンプルとして使えるのでお試しください。

扱いたい主題領域の概念モデルを作成したい方は、

をはじめとする、https://note.com/kae-made のドキュメント群をご覧ください。

BridgePoint で用意した概念モデルを開き、Model Explorer で、プロジェクト(一番左のフォルダーアイコン)、もしくは、その直下のパッケージを右クリックし、”Build Project”を選択します。この項目がない場合は、右クリックした状態で表示されるコンテキストメニューの、”BridgePoint Utilities”の”Set Model Compilers”を選択して、図のように”MC3020”を選択すると、表示されます。

図1 アクション記述定義の生成設定準備


BridgePoint は、概念モデルから C/C++ で記述されたコードを生成する機能をデフォルトで持っています。この機能を使って、C# コードを生成するのに必要なモデル定義情報を生成します。

「?C/C++ でコード生成ができるならそれで十分では?」という声が聞こえてきそうですね。生成したアプリケーションを動かそうとしているハードウェアのメモリリソースが少なかったり、性能の低い CPU で高速で実行したいような場合は、こちらの方が断然有利です。C# で生成したコードは、リッチなハードウェアや、K8s 等を使ったクラウド上でのスケーラビリティが要求される場合に使用します。

補足コメント

生成されたモデル定義情報ファイルは、BridgePoint のワークスペースをファイルエクスプローラで開き、プロジェクトの名前のフォルダーの下の、gen → code_generation の下に、プロジェクト名.sql で保存されます。(ActionGenerationTest プロジェクトの場合は、"ActionGenerationTest.sql" という名前で保存される)
BridgePoint で作成した概念モデルを In Memory で動作する C# アプリケーションライブラリに変換する」では、生成する概念モデルの指定を、プロジェクトの名前のフォルダーの下の、models の下のプロジェクト名のフォルダーを指定しましたが、アクション記述も生成する場合は、生成された SQL ファイルを指定します。
CodeGenerator/ConsoleAppCsharpGenerator の実行時の引数は、以下の通りです。

--metamodel BridgePoint\tools\mc\schema\sql\xtumlmc_schema.sql --base-datatype BridgePoint\tools\mc\schema\Globals.xtuml --domainmodel domainmodel.sql --project projectName --dotnetver net5.0 --gen-folder genDirectory --action-gen true [--overwrite true|false ] [--backup true|false]
  • --metamodel 必須
    概念モデルの概念情報モデルの定義(OOA of OOA)ファイル
    BridgePoint をインストールしたフォルダーの tools\mc\schema\sql\xtumlmc_schema.sql を指定

  • --base-datatype 必須
    OOA of OOA で使われている基本データ型の定義ファイル
    BridgePoint をインストールしたフォルダーの tools\mc\schema\Globals.xtuml を指定

  • --domainmodel 必須
    上述の "Build Project” で生成した SQL ファイルの絶対パス

  • --project 必須
    生成する C# プロジェクトの名前

  • --dotnetver 必須
    生成するソース一式のベースの .NET Framework のバージョン
    特段の理由がない場合は、"net5.0" を指定

  • --gen-folder 必須
    生成先のフォルダーの絶対パス
    指定されたフォルダーの下に--project で指定したプロジェクト名でフォルダーが作成され、その下にソースコード一式が生成される

  • --action-gen 省略可能
    true の場合、アクション記述からの C# コード生成を行い、アクション記述から生成されたファイルを上書きする
    省略 あるいは、 false の場合、アクション記述からの C# コード生成は行わず、手書き実装用のファイルが未生成の場合は生成される

  • --overwrite 省略可能
    --action-gen true が指定された場合、このオプションの指定は無視され、true 指定とされる
    --action-gen false 指定の場合でかつ、省略、または、false 指定した場合は、手書き実装用のファイルは未生成の時だけ生成され、生成済みの場合は、上書きされない
    --overwrite true を指定した場合は、手書き実装用のファイルが上書きされる
    ※ アクション記述から生成されるファイル以外は、このオプションに関係なく、常に上書きされる。

  • --backup 省略可能
    --backup false 、あるいは、省略した場合は、--action-gen、--overwrite の指示に従う
    --backup true を指定した場合、生成済みのファイルがある場合は、そのファイル名に、”.bak” という拡張子が付いたファイル名に変更し、新しく生成されたファイルを保存する

C# コードジェネレータ本体は、CodeGenerator/ConsoleAppCsharpGenerator とは独立した、 CodeGenerator/Kae.XTUML.Tools.Generator.CodeOfDomainModel.Csharp という名前のライブラリプロジェクトとしてビルドされています。このライブラリは、

var generator = new CsharpCodeGenerator(...);
var contextParams = generator.ContextParams;

で、参照可能な、ContextParams を通じて上述の起動オプション設定を渡せるようになっています。この仕組みを使えば、より大規模なプロジェクト生成アプリケーションの一部として組み込んだり、DevOps のパイプラインに組み込むことも可能です。また、Kae.XTUML.Tools.Generator.CodeOfDomainModel.Csharp  という名前で、NuGet Package としても使えるようになっています。
Laundromat in Hotel チュートリアル」の概念モデルから生成したファイル一式を、https://github.com/kae-made/artifacts-laundromat-in-hotel/code/csharp  から公開しているので参照してみてください。

生成されるファイル群

ジェネレータが概念モデルから生成するモデル要素は以下の5種類です。

  • 概念クラスのオペレーション
    各クラス毎に、DomainClassClassNameBaseOperations.cs  という名前のファイルの中にそれぞれ生成

  • 概念クラスの状態モデルの各状態のエントリアクション
    状態モデルを持つクラス毎に、DomainClassClassNameStateMachineActions.cs  という名前のファイルの中にそれぞれ生成

  • 概念クラスの計算可能な特徴値
    計算可能な特徴値が定義されている場合、該当するクラスの、DomainClassClassNameBase.cs  の特徴値のプロパティの get メソッド内に生成

  • ドメインファンクション(BridgePoint では Function)
    CIMProjectNameLibOperations.cs  という名前のファイルの中にそれぞれ生成

  • External Entity の Wrapper コード
    ※ 後述

以上、表題で示した概要と、何ができるか、どう使うかを説明してきました。以降、アクション記述からの C# コード生成の仕組みを解説していきます。

アクション記述からの自動生成の基本

BridgePoint で作成した概念モデルを In Memory で動作する C# アプリケーションライブラリに変換する」 で解説しているように、概念モデルからの自動生成は、BridgePoint で作成された概念モデルの内容を、概念モデルの概念情報モデルである OOA of OOA メタモデルの定義に従って取り出し、決められた変換ルールに則って C# コードに置き換えていくのが基本です。アクションに関わるのは、xtumlmc_schema.sql で定義されている、ACT_やV_などでで始まる名前を持つ、概念クラス群です。

ここから先は

31,727字 / 16画像

¥ 4,760

この記事が気に入ったらチップで応援してみませんか?