NHibernate 3.0 は人気 ORM (Object-Relational Mapping) の,一年ぶりとなるメジャーリリースである。今回のリリースでは,CLR のバージョンが .NET 3.5 に変更されている。これに伴って QueryOver API が実現され,これまでの文字列ベースの ICriteria 式が,強く型付けされた lambda 式に置き換えられる。これはビルトインされた LINQ プロバイダの付加機能である。
今回のバージョンには 互換性のない変更 がいくつかある。nullable 型のサポート改善はそのひとつだ。以前のバージョンでは,"<map> に nullable 型 ( DateTime? など) の <element> を使用する場合,null 値の追加や null 値への更新はできない"。null 値を単に無視していた前バージョンとは異なり,NHibernate 3.0 はデータベースを正しく更新する。また2つの関数のシグネチャが変更され,前バージョンで obsolete と指定されていたメソッドが削除されている。
関連するニュースとして,NDepend の Patrick Smacchia 氏が NHibernate のコード解析報告 を公開している。分析の結果に対する同氏の意見 が,NHibernate のブログに掲載されている。氏の要約によれば,
要約すると,NH は以下の問題については OK です。
- アセンブリの数が多すぎる問題 (なんと,私の知るプロフェッショナルプロジェクトの 95% が数百ものアセンブリを抱えているのです。開発者のワークステーションとビルドマシンのすべてをとんでもなく遅くする以外,何の役にも立ちません !!)
- コードカバレッジ不足。NH は 76% という,十分なコードカバレッジレシオを持っています。ただし手作業による記述と生成コードについてであって,テストコードはカウントしていません。参考までに,全体で 63K の LoC (Lines of Code,コード行数) 中,18K LoC が生成されたコードです。
- API の非互換的変更。開発チームは NH の公開部分に十分な注意を払っていて,以前の NH 2.1.2 バージョンと NH V3.0.0 の比較に関しては明確に警告されています。
- 不要コード
以下の点には改善の余地があると思います。
- Code Contract の使用。NH では Code Contracts フレームワークがまったく (MS Code Contract API や Debug.Assert(..) なども) 使用されていません 。
- 全体のコードカバレッジレシオが 76% もありながら,多くのメソッドあるいはタイプのカバレッジが 90%+ 止まりであり,100% に達していないこと。問題なのは,テストが困難でカバーされずに残った数パーセントのコードの中に,往々にして微妙なバグが残っていることなのです。
- 全体的なコードアーキテクチャの改善 (NH の公開 API のリファクタが不可能なのが明白である以上,非現実的ですが)。
- 基本的なコードメトリックスの品質しきい値の重視 (複雑すぎるメソッド,神的クラス,ファットコード,パラメータ数の多いメソッド ... など)。