はじめに
テキストを生成するアプリケーション(メールの本文やソースコード生成など)を作る場合、プログラム中でテキストを結合する方法が一般的です。しかし、長いテキストをプログラムで編集することは思いのほか面倒ですし、内容を変更する場合には再コンパイルを行わなければなりません。
そこで本稿では、雛形(テンプレート)として用意しておいたテキストファイルをアプリケーションの実行時に読み込み、動的に値を埋め込める「NVelocity」というプロダクトについて紹介します。NVelocityを利用すると、単純な文字列の挿入だけではなく、条件分岐、繰り返し、メソッド/プロパティの戻り値の利用など柔軟なテキスト生成が可能になります。また、プログラムを変更することなくテキストを変更できるため、保守性の高いアプリケーションを構築できます。
対象読者
Visual Studio(.NET)にて開発を行っている方、テキストの効率的な生成、ソースコードの自動生成などに興味がある方を対象としています。
サンプルの概要
ダウンロードサンプルは、入力内容に合わせて、メールの文面を生成するアプリケーションです。ボタンを押すとメールの本文が生成されます。
必要な環境
このサンプルはVisual Studio .NET 2003と、NVelocityのバージョン0.5にて動作確認をしています。NVelocityは同梱していますので、NVelocityを改めて入手することなく簡単に動作を確認することができます。
本稿では、C#で解説していますが、VisualBasicのソースもサンプルには含まれています。また、Visual C#(Visual Basic) 2005 Express Editionでも動かすことができます(最初にプロジェクトをアップグレードするウィザードが表示されます)。
もし、自分でNVelocityを導入する場合は、後述するCastleプロジェクトからダウンロードできるファイルの[SharedLibs]-[nvelocity]フォルダに含まれる「NVelocity.dll」に参照設定をしてください。
NVelocityの入手方法
NVelocityは、JavaベースのVelocityを.NETで利用できるように移植したオープンソースライブラリです。Sourceforgeにて開発されていましたが、残念なことに2003年10月のバージョン0.42以降、Sourceforgeではバージョンアップが停滞しています。
現在の最新版0.5は、Castleプロジェクトが開発しているMonoRail(Railsの.NET版)のソースコードに同梱されています。このバージョンでは、依存DLLの切り離し、バグフィックス、VS 2005対応などが行われています。本稿では、このCastleが提供しているバージョン0.5を利用しています。
なお、NVelocityバージョン0.5のソースコードは、CastleプロジェクトのSVNレポジトリから参照することができます(まとめてダウンロードしたい場合は、TortoiseSVNなどのツールを利用するとよいでしょう)。
NVelocityの特長
NVelocityは、定型的なテキストを効率良く生成することができるテンプレートエンジンの一つです。テンプレートエンジンとは、あらかじめ用意しておいた雛形(テンプレート)に動的に値を設定できる仕組みで、Java、Perl、Ruby、PHPといった他の言語では、Webデザインとロジックを分離する用途で広く利用されています。
NVelocityの長所について整理してみましょう。
プログラムとデザインが容易
テキストの生成をプログラムにハードコーディングすると、改行、タブ、クォーテーションマークなどを\r\n、\t、\"などのようにエスケープする必要があるため手間がかかります。また、変数などの値を代入する場合にも+演算子で文字列を結合したり、StringBuilder
クラスとString.Format
メソッドによる整形をする必要があります。
これに対して、出力後のイメージに近いテンプレートファイルを使うNVelocityでは、デザインの確認が容易にできますし、変数の代入もNVelocityが実行してくれます。
保守性の高さ
また、テンプレートファイルによる保守性の高さもNVelocityの魅力の1つです。プログラムにハードコーディングしていないので、生成するテキストの変更が発生したとしても、テンプレートファイルの変更だけすれば良く、プログラムを変更する可能性が低くすみます。
豊富な機能
テキストファイルを読み込んで値を代入するだけであれば、NVelocityを使う必要がないと思われるかもしれません。しかし、NVelocityには、次のような高度な機能も備わっています。
if
文による条件分岐foreach
文による繰り返し- プロパティ、メソッドの値の設定
- 変数の利用
- アセンブリの埋め込みドキュメントであるテンプレートも読み出し可能
このように、テキストを生成する場合には、テンプレートエンジンは有用であることがお分かりになると思います。