C#にIronRubyでDSLを組み込む

C#のアプリを作る時に設定をどう持たせるか、いろいろ問題があって悩んでました。
・設定追加時の下位互換性。
・設定ブロック×nの表現。
 (接続先1~接続先20まで可変など)
・コメント表記。
 (設定をXMLの属性で表現すると近くにコメント書けないなど)
・10進数、16進数や文字列の扱い。
 (CSVやXMLだと全て文字列の扱い)
・試験用設定などで設定ブロックを膨大にしたいとき。
 (接続先1000ヶ所などの最大容量試験など)
・設定項目追加時にコードの修正が煩雑。
などなど
いい案をさがしてましたが、やっとしっくりくる案を見つけました。
それは「IronRubyを組み込んでDSLとして設定を記述する」です。
仕組みは「設定したいオブジェクトをC#側で用意して、Rubyスクリプトで記述した設定ファイルに設定させる」
というものです。
この手法により設定をRubyで記述できることで、記述の自由度が大幅に広がるわけです。
こんな設定ファイルを記述して、


<configuration>
<appSettings>
<add key="Node001" value='
info.title       = "中央装置"                  # 名前
info.uri_name    = "TcpServer://0.0.0.0:58017" # 接続設定
info.src_no      = 30                          # 設定1
info.src_dai_no  = 167                         # 設定2
info.dst_no      = 42                          # 設定3
info.dst_dai_no  = 166                         # 設定4
info.kensa_t     = 60                          # 設定5
info.sts_str[0]  = "[状態1]"
info.sts_str[1]  = "[状態2]"
info.sts_str[2]  = "[状態3]"
info.sts_str[3]  = "[状態4]"
info.AddNode(75, 0)
info.AddNode(78, 0)
info.AddNode(82, 0)
info.AddNode(76, 35)
info.AddNode(76, 36)
info.AddNode(76, 37)
'/>
</appSettings>
</configuration>

C#側からこんなコードで読み込みます。


var setting, = ConfigurationSettings.AppSettings["Node001"];
var eng = IronRuby.Ruby.CreateEngine();
var scope = eng.CreateScope();
scope.SetVariable(
"info",
this);
eng.Execute(
setting,
scope);

しばらくはこの手法で開発してメリット・デメリットを判断したいです。

Author: kachi

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です