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);
しばらくはこの手法で開発してメリット・デメリットを判断したいです。