メタプログラミングについて(--;)


id:higayasuoさんのエントリーで「メタプログラミング」について記述されていたので書いておこうかと。。。

メタプログラミングの光と影 - yvsu pron. yas

私の開発しているフレームワークでも「メタプログラミング」を利用しているので書いておこうかと…
フレームワークでは、ランタイムに処理するタイプの「メタプログラミング」になります。


EzJDBCの場合は、主にテーブルからデータを参照した結果を、find系メソッドで指定したEntityにセットするロジックの箇所で行っています。

1.参照されたテーブルのフィールド名をキャメル記法に変換した名称と同名のプロパティーがpublicで存在するかを判別。

2.参照されたテーブルのフィールド名をキャメル記法に変換した名称のsetterが存在するかを判別。

3.1または2で存在した場合は、テーブルの情報をEntityにセットするソースを作成します。
 この時、Entityのプロパティーの型またはセッターのシグニチャーの型にコンバートするソースも作成されます。


EzServletの場合は、下記の3箇所で利用しています。

1.クライアントからサーバーを呼び出す際のロジック
 ボタンが押された時に対象となるControllerのメソッドを呼び出すロジック

2.クライアントから送信された(Request)値をDTOにセットする際のロジック
 EzRequest#set(DTO)

3.サーバーからクライアントに画面(ファイル)を送信するロジック
 EzResponse#setPage(DTO)


エントリーの中で、ひがやすをさんも記述されていますが、メタプログラミングは、まさに「黒魔術的」であるため、利用する箇所に気を付ける必要があります。


また、利用する場合は、メタプログラミングの箇所でエラーが発生する(を発生させる)場合は、エラーの理由が明確になるメッセージを出力する必要があります。
そうでないと、メタプログラミングの箇所でエラーが発生した場合は、利用者は理由が分からずに右往左往する羽目になってしまうからです。


メタプログラミングは、とても協力な手法ですが、間違いなく「ブラックボックス化」する手法なのですね。。。
自分の経験上の考えですが…^^;