なんか最近どんどんこういう頭の悪い方向に走ってるわけなのですけど。言語をそのままで楽しめなくなってるのかな。
デバッグの時に dump を適度に埋めるデバッグ手法は printf デバッグなどと言われみんなに愛されているわけですが、アスペクト指向の言語だとクラスやらメソッドに外部から dump コードを追加できたりしてちょっと便利です。
D でも invariant を使ってこれができます。
class C { this() { v = 1; } int v; } void C_invariant(Object o) { printf("%d\n", (cast(C)o).v); } int main() { ClassInfo ci = C.classinfo; ci.classInvariant = &C_invariant; C c = new C(); return 0; }
完全に外部から printf デバッグ文を追加できてます。クラス内の全てのメソッドに勝手に追加されるわけで結構便利かも。ていうかこれだと invariant 節書けばいいじゃんって言われておしまいだな。嬉しいのは、動的に invariant を加えるということなのね。ほら、特定のタイミングでだけ printf デバッグしたい時とかあるじゃないですか。まあ他にもヘンな応用は考えられそうなのですけど今のところ思いつかないのです…
ちなみに D の invariant の実現方法を説明しときます。メソッド呼び出しがあって、 -release オプションが無い場合、 dmd は _d_invariant 関数呼び出しを追加します。 _d_invariant は phobos の internal/invariant.d にある関数で、 ClassInfo.classInvariant が null でなければ呼び出します。
ClassInfo クラスは vtbl や interfaces や base をいじってみてもそれはそれで面白い遊びができるかもしれません。
メモ。今はメソッド名が取れないけど、 reflection.d と組み合わせて instruction pointer を抜ければメソッド名も取れるはず。そうすればログ機構を外部から追加できてまさに AOP。