今回はDBからの読み込み処理において,筆者が過去に経験したまずい設計と,その改良例を挙げてみました。今回の設計のポイントは以下の通りです。
[ポイント1]タイプセーフ
HashMapにDBの行データを格納すると,列名,列データの両方がタイプセーフでなくなります。列名がタイプセーフでないことの弊害は,列名のタイプミスが実行時まで検出できないことです。そして列データがタイプセーフでないことの弊害は,実行時にClassCastExceptionが発生する危険があることです。
列名をタイプセーフにする設計例として,Enumを使用する例を示しました。これにより列名の間違いをコンパイル時に検出できるようになります(使用メモリー量も削減できます)。さらに行のデータ定義を,そのままクラス定義とした行クラスを用意し,行をオブジェクトとして直接格納することで,列名と列データの両方をタイプセーフとする例を示しました。これにより,ClassCastExceptionの危険も無くなり,さらなるメモリー使用量の削減が実現できます。またIDEの補完機能による開発生産性の向上も見込めることを示しました。
タイプセーフにすることのデメリットは,Enumもしくは,行クラスを別途用意しなければならないことです。しかしこれらはIDEの機能などにより比較的簡単に生成できるので,全体として見れば,メリットの方が上回るでしょう。
[ポイント2]Iterator
Iteratorは,一連のデータを一方向に走査するための,必要最低限の機能を提供するインタフェースです。もしもアプリケーションの要求する機能がこれで十分ならば,Iteratorを利用することで必要なメモリー量を大幅に減らすことができます。ただしこの場合,DBとのコネクションを開いたまま保つ必要があるなど,制御構造が複雑になります。
現在はDAO部分を担う「O-Rマッピング・ソフト製品」があり,こうしたソフトを使えばわざわざ自分でDAO部分を実装する必要はありません。O-R マッピング・ソフトは照会機能だけでなく,更新機能も備えています。また次のJDBC仕様では,今回取り上げたような行クラスを用いたタイプセーフな照会を可能とする機能が追加される予定です。
日本IBM グローバル・ビジネス・サービス ソフトウェア・エンジニアリング ITスペシャリスト