概要
開発をしていると殆ど似たようなソースコードを記述したり、殆ど似たようなクラスを作ったりすると思います。
そういった手間を削減するために、ソースコードをプログラムで設定して生成するためのライブラリを作りました。
ClassFileGenerator
https://github.com/nrslib/NrsLib.ClassFileGeneratorCSharp
クラスを作る
クラスをプログラムで作る
上記のようにDriver に対してメタクラスを渡して出来上がった文字列を受け取ります。
受け取った文字列がクラスなどになっているので、そのままファイルに書き出してあげればクラスファイルの完成です。
設定基本
設定は各種 Setup メソッドを呼び出して、それに対してメソッドチェーンで設定をしていくようになっています。
なぜこのような形にしたかというと、趣味構文チックにしたかったからです。
using 設定
using の設定です。
こんな感じで using を設定します。
using は複数指定可能です。
Implements 設定
継承などの設定です。
複数の implements が設定できて、またジェネリクスも設定できます。
最初に定義したものが左側に設定されるので、継承をする場合は一番最初に追加してあげてください。
フィールド設定
任意のフィールドも設定できます。
もちろん複数設定可能です。
フィールドの型設定
型を指定する場合はこのように指定してください。
文字列で指定できるので存在しない型でも OK です。
未設定の場合 object になります。
アクセスレベル設定
アクセスレベルは enum で指定します。
設定しなかった場合 private です。
readonly 設定
readonly の設定ができます。
初期値設定
フィールドは初期値が設定できます。
フィールドまとめ
これらの設定は同時に衝突せず設定することができます。
メソッド設定
上記で、メソッドのセットアップが開始できます。
メソッドの追加
これでメソッドが追加できます。
何も設定がされていない状態なので void 型で引数無しのメソッドが定義されます。メソッドの内容は’throw new NotImplementException();’になります。
戻り値設定
こんな感じで戻り値を設定できます。
自由に文字列で設定できるのでお好きな型を指定してください。
メソッド処理内容設定
メソッドの処理内容は AddBody で追加してください。
可変長引数で受け取っています。
なお、改行で区切られますがセミコロンについては任意に入力するようにしてください(文の終わりにしていいのか判別不可能のため)。
ジェネリクス設定
ジェネリクスも指定可能で、必要であれば where も追記できます。
引数設定
引数については AddArgument で設定できます。
引数の名前とその型を定義してください。
もちろん複数設定することが可能です。
メソッドまとめ
これらの機能をすべて使うと以下のようになります。
インターフェースを作る
基本的にクラスと作り方は一緒なので割愛します。
実装周り
t4 Template を利用しています。
つまるところ、t4 Template の Facade みたいなものです。
そのため必然的に .net framework になります。
Template についてですが、改行周りを意図したとおりに動作させるのが非常に面倒で、かなり見栄えが悪い物になっています。
結構気合で記述しているので、可読性については悪いとしか言えません。
まとめ
コーディングの速度はある程度まで行くと頭打ちになりがちです。
その上で「あの人コード書くの早いなー」と思われるためにはプログラムでコードを作ることが大きなアドバンテージになるのではないかな、と思います。