astah* モデル駆動開発m2t(Model to Text) プラグイン のC#用テンプレートを作ってみた

#更新のお知らせ
「注意点」に、**2回目以降の「Generate」（＝コード生成実行）でエラーが出る時の対処法**を書いていましたが、
2017/11/20に作者の方が暫定対応してくださったため、記事をその方法に合わせて更新しました。

#はじめに
「[astah* community6.9で モデル駆動開発m2t(Model to Text) プラグイン を実行させる](https://qiita.com/azuki8/items/1a3855380de79481d687)」での予告通り、C#のテンプレートを作ってみました。
先だってフルスクラッチで書いた astah* プラグイン C#コード生成（[UMLモデリングツールastah*(Community版)でプラグイン開発環境を試してみた（3）C#コード出力](https://qiita.com/azuki8/items/6aadbe309ba6b004d9af)）とほぼ同等の機能にしました。
作成した内容と使い方を紹介します。

#対応したC#コード出力機能

- クラス
 - 可視性、abstract、クラス名、テンプレート、ベースクラス、実現するインタフェース
 - 関連（可視性、関連の型、関連端名、多重度によるList表現）
 - 属性（可視性、属性の型、属性名、初期値、=new、**初期値のサフィックス自動補完** ）
 - 操作（抽象、可視性、操作名、引数、引数の型、out、ref 、操作の定義、戻り値の型）
- インタフェースクラス
 - 属性 -> プロパティとして出力
 - 操作 -> 戻り値、操作名、引数、引数の型、out、ref）

※今回は、初期値のサフィックスの自動補完を入れておきました。
例えば、float型の属性に初期値が入っていると、0.1 → 0.1f のようにコード化されます。

#m2tのテンプレートを書いた感想
- 総合的に見て、フルスクラッチよりカッコいい
- テンプレートの書きかたが分からないところで試行錯誤した
- ヘルパー関数は意外と自由に書けた
- ステレオタイプに応じたテンプレートを作るので、１つ１つのテンプレートがすっきりする（目的ごとにコードが分離する）
- ステレオタイプに応じたテンプレートを作るので、両方に共通したヘルパー関数が書きたいと感じた（書けるのかも？） 
- テンプレートに日本語を入れてもエラーにならないのでコメントしやすい
- コード出力にオプションを付けたいと感じた（例えば、属性をプロパティとして出力するとか）

#今回作成したC#生成テンプレートのコード
githubからダウンロードしてください。
https://github.com/azuki8/m2tCsharpTemplate

#使用方法
以下の流れで説明します。
- テンプレートファイルを作成する
- m2tの設定をする
- astah*からコード生成する
- 注意点

##テンプレートファイルをダウンロードする
githubから以下の2つのファイルをダウンロードする

- csharp.template
- csharpinterface.template

※[csharp]フォルダごとダウンロード

##m2tの設定をする

m2tインストール時に設定されているTemplate Dirを参考に、C#用の設定を作ります。
↓ はじめにインストールされた時のgrsakuraの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/81841dae-a777-4432-b4cc-c3b5ed622172.png)

↓ C#用の設定（設定の完成例）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/a53a4f18-f71d-f566-be38-5e579ffbbeca.png)

1. 画面の一番上の「Add」ボタンを押下して、「CSharp」の設定を新規作成します。
2. 「Template Engine」は変更しません。
3. 「Template Dir」は、設定前に、C#用のフォルダを用意します。

   今回は、grsakuraのフォルダの隣にダウンロードしたcsharpフォルダをコピーしました。
エクスプローラでみると、次のようになっています。

   ![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/e042f186-b8cb-6a96-a949-26d9ab2fed4a.png)
   このcsharpフォルダが先ほどダウンロードしたフォルダで、.templateファイルが2つ入っています。
　 「Template Dir」にこのフォルダパスを設定します。
4. 「Destination Path」は、変えても変えなくてもいいです。ファイル生成されるパスです。
5. 画面の下方の「Add template」ボタンを２回押下し、テンプレートの行を２つ追加します。
6. 画面の通りに、テンプレートを設定します。ここの入力は、たぶんやってみれば分かります。

##astah*からコード生成する
1. UMLのモデルを用意します。今回は、↓を用意しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8ac842e8-b221-3ab4-9c4b-9141efa5c61d.png)
2. いつも通り、astah*の[ツール]から、m2tのGenerateを選んで、コードを生成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/1ef2bdec-aa77-9b2c-9dee-88d23be9b380.png)

3. 次のメッセージが表示されれば、完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/1ea19974-cfac-f290-9dd5-f408ec6379c1.png)
4. 「Destination Path」にファイルが出力されているのを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/4a4b4a06-78db-49e1-a395-d34deaed4d6e.png)
5. 一応、Visual Studioで適当なコンソールアプリを作って、ビルド＆実行してみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/2490f043-ee80-a2ea-3640-1d65b4b880f4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/ba8cdd2f-7428-eff4-b250-5414398b072c.png)

##注意点
m2tは、astah*のルートにあるクラスしか、生成対象になりません。
フォルダに入れたクラスは、コード生成されないので注意してください。

自分では、m2tのコードに手を入れて、フォルダ内のクラスも生成するようにしてみたのですが、逆に、astahが自動的に生成する「java」フォルダ内のjavaのクラスがすべて生成されてしまいました...(^^)ので、次は指定フォルダ以下を出力するような改造をしてみたいと思います。

また、2度目の「Generate」をすると、私の環境では「Code Generation is Failed.」が出ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/14babd1e-c096-b668-ff28-36b43de5e23b.png)
これは、タイミングによるものだそうで、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/bef70d0c-4572-f26e-df56-37db67426b4a.png)
のチェックボックスを外してから「Generate」をすると、大丈夫です。

#さいごに
m2tは、テンプレートにヘルパー関数に判断文を多くかけたので、自分の思う処理を作りやすかったです。
例えば、今回のC#テンプレートには、属性の多重度を判定してList<型> としてコード生成したり、属性の型を判断して初期値にサフィックスを入れたり、できました。

まだ変更したい点もあるのですが、欲を言うとキリがないので、現時点で記事にしました。
また、変更したらご紹介します。

※なお、注意点に挙げた部分については、別途、今回私の方で修正したコードを記事にしますが、適切な修正かの判断はできかねますので、作者の方にご相談したいと思います。