メタプログラミングの光と影

メタプログラミングとはソースコードを生成するプログラミングのことです。メタプログラミングによって生成したソースコードは、eval関数で実行することができます。

メタプログラミングとは、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。
メタプログラミング - Wikipedia
だから、eval関数は、手段であり、メタプログラミングそのものではない。これは弾さんが指摘してますね。

evalだけがメタプログラミングの技法ではないし、またevalはその威力ゆえ最後の選択肢とすべきだ。


弾さんのパフォーマンスの指摘に対して、miyagawaさんが、「必ずしもevalが遅いとは限らない」と指摘してますね。
メタプログラミングとevalのベンチマーク - Bulknews::Subtech - subtech


これは、evalに限らず、「メタプログラミングは、パフォーマンスがボトルネックになることもあるが、適切な方法をとれば、問題になることはない」ということをいっているんだと思います。これは、私の感覚にかなり近い。


私は、結構メタプログラミングを駆使するほうです。例えば、S2Daoで次のようなインターフェースのメソッドがあったとします。


public Employee findById(Long id);
これをみると、S2Daoは、戻り値がオブジェクト(Listではない)なので、1件データを返すんだなと判断します。また、引数がidなので、where句にid = ?で検索したいんだなと判断します。
これが、メタプログラミングS2Daoでは、AOPを使って、メタデータからメソッドの実装ロジックを生成しています。


メタプログラミングは、強力です。高位ロジックによって、ソースコードを自動生成するので、生産性が高い。でも、デメリットもあります。何だと思いますか。


高位ロジックが、高度であればあるほど、最終的に何が起こるのかが、わからなくなってしまうことです。黒魔術的といいましょうか。
だから、メタプログラミングは、結果が予想できる範囲にとどめておいたほうが良い。強力なため、乱用は厳禁ということです。


Rails以降、メタプログラミングは、Convention over Configuration(以降CoC)として、はやりました。CoCは強力です。でも、使いすぎるとわけがわからなくなる。このことは、念頭に入れておいたほうが良い。