コードの自動生成

最近ではRonR、DSL、古くは4GLなどコードの自動生成を行って開発速度を上げようとする試みは多い。
実際どの程度役立つかはケースバイケースだが、良く似たパターンを大量生産する場合に利用できると効果が大きい。Visual Studioにも様々な自動生成を支援する仕組みがある。代表的なのは型指定されたDataSetやリソースアクセスクラスか、コンポーネントやWeb画面、Window画面もコードの自動生成と考えてよいと思うが、これはあまりにも一般化しているのでわざわざいわないか。

コード生成のパターンもいくつかある。Code Generation Networkによると以下のような分類をしている。

  • Code Munger(NDocなどソースコードからヘルプドキュメントを生成するパターン)
  • Inline Code Expander(SQL文が埋め込み可能に汎用言語を拡張するようなパターン)
  • Mixed Code Generator(ソース中のコメント情報などを利用して自ソースコード内に生成するパターン。一般に画面コードの生成はこのパターンとして考えるようだ)
  • Partial Class Generator(定義情報とテンプレートからベースクラスを生成するパターン。型指定されたDataSet)
  • Tier Generator Model(レイヤークラスを生成するパターン。データアクセスコンポーネントを自動生成する例が多い)
  • Domain Language(特定領域に特化して作成された言語。BPELなど)

さらに、Visual Studioを利用するとこれらを実現できるが、その実装方法がいろいろあって悩ましい。
主なものはこんなものかな。

  • カスタムツール(型指定されたDataSetやWebサービスのプロキシ)
  • アドイン
  • マクロ
  • スニペット(自動生成というかは微妙だが選択子として考えれる)

良く利用するのはカスタムツールでDACとBLレイヤーを生成している。あとは単純な検証ロジックや型指定されたクエリの定義からコードを生成する場合にも利用している。マクロもソースをもとに何か別のソースやドキュメントを生成する場合に若干利用している。アドインはほとんど使っていないな。マクロで代用している感じですね。ソースレベルでクラスの合成(MIXINもどき)などはマクロ+CodeModelを使えば簡単に実現でき実用的なんだけどな。