MetaInfoクラスの単体試験
小さいプログラムを書くとき、データを保持するオブジェクトの永続化やビジュアライゼーションが面倒くさい。Serializableは使いたくないし、使ったとしても、ビジュアライゼーションはコードを書かないといけなくなるし。。。 と、毎回同じようなコードを書いているため、これを共通化しようと思い立ち、昔MetaInfoクラスを作成した。
MetaInfoクラスとは、その名前のとおり、データオブジェクトのメタ情報とメタ機能を提供するクラスだ。主に、次の機能を提供する。
- プロパティに関する情報
- プロパティ名
- プロパティ数
- プロパティ値の型
- プロパティ値の設定・取得
- データオブジェクト作成
- プロパティ値変化の監視と通知
データオブジェクトを永続化したければ、プロパティ値の設定・取得機能と、プロパティ値の型の取得、データオブジェクトの作成機能を用いて、シリアライズ・デシリアライズ(?)することで実現できる。
JTableにデータオブジェクトの集合を表示したければ、プロパティ値の取得機能と、プロパティ値の型の取得機能を用いて実現でき、さらにダイナミックにViewを更新したければ、プロパティ値変化の監視と通知機能を用いれば実現できる。
MetaInfoクラス*1には、2つのサブクラスがある。
- アノテーション+リフレクションを用いたAnnotationMetaInfo
- MetaInfoの見せかたを変化させるMappedMetaInfo
AnnotationMetaInfoは、データオブジェクトに付加されたアノテーションを用いて、動的にMetaInfoの機能を構成するもの。リフレクションを多用しているため、速度はそれほど期待できないが、スピーディーに開発するときに、楽ちん。速度が欲しくなれば、getter/setter系のメソッドを、ハードコーディングすることで、アプリケーション側には影響を与えずに簡単に速度を向上させることが出来る。すばらしい!w
MappedMetaInfoは、主にプロパティ名の変換を行う。JTableのカラム名にプロパティ名を用いる場合、他の言語を使うことが難しくなるけど、ResourceBundleから読み出した設定情報を元にMappedMetaInfoでプロパティ名を変換してあげれば、瞬時にいろんな言語に対応できるようになる。しかも、コーディングいらず。すばらしい!!w
で、この二つのMetaInfoクラスの抽象クラスとして、AbstractMetaInfoがあり、これが基本的な機能を定義している。サブクラスは3つのメソッドをオーバーライドするだけで、オリジナルMetaInfoとなることができる。すばらしい!!!w
今日は、そのMetaInfoクラスを本格活用すべく、その前にAbstractMetaInfoクラスの単体試験を実施した。AbstractMetaInfoが、コメント込みで300行ほど。単体テスト項目数が、74項目だから、試験密度は250/1k*2ほどで、バグ検出密度は。。。言いたくない*3。最近、データクオリティに染まってきているなあ。どうりでコーディングが進まないわけだorz
で、突然MetaInfoを活用しようと思ったきっかけは、Swingのアプリケーションを開発するのがめんどくせえ!!とか思ったから。正直、GUIビルダーとか使いたくないンよ。使ったとしても、効率化するとは思えないし。正直、Swingプログラミングで面倒なのは、モデル・ビュー・コントローラを互いに結びつける糊を書くのがめんどくさい。GUIビルダーは、その辺のところをあまりお手伝いしてくれない。そこで、簡単Swingプログラミングつーるきっとヲ開発しようと思い立ち、MetaInfoを引っ張り出した。
このツールキットの開発には、いくつかの似たようなアプリケーションを開発していき、共通部分を切り抜いていくって言う方針でやっていく。現状だと、CSV読取・保存機能+JTableによる編集機能があるアドレス帳が、
- Addressクラス:70行(自動生成)
- AddressMetaInfo:30行(オブジェクトの生成はハードコーディングしなきゃいけない仕様なため)
- AddressBookクラス:50行(実際のGUIアプリ部。Swing部品は、既にMetaInfoと絡めて作成済み)
で実現できてる。はっきり言って、すげー楽。下手なスクリプト言語よりも、開発効率良くね?とか思い出してる(冗談だけど)。
ということで、目指、Swing界隈のSpring! Swing界隈のStruts!! Swing万歳!!!w