※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 忘れないうちに書いておこう。きっと…。
誰かが作ってくれるだろう…
DjangoのDRYっぷりは徹底しています。
どのくらい徹底しているかというと
class Entry(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
class Comment(models.Model):
body = models.TextField()
entry = models.ForeignKey(Entry)
こんな感じのモデルがあるとして、EntryにいくつかのCommentが関連づいて保存されているとします。
>>> c.entry #cはCommentのインスタンス
これでcに関連づいているEntryのインスタンスがとれます。まぁ、当然ですね。
>>> e.comment_set #eはEntryのインスタンス
これでeに関連づいているCommentのインスタンス(のリスト)がとれます。
片方に向けて関連が定義されていれば、当然逆方向からも関連してるよね。二回書くのはDRYに反するよね。ってのが、Djangoの言い分です。
今回書いておきたかったのは、こんなことではありません。
ふと、JavaでDRYでらくちんなWebアプリケーションフレームワークを作ろうとしました。フツーにJavaでDjangoがしているようなことをしようとすると、コンパイルすらできません。
Entryクラスにcomment_setなんて名前はないので、Java的に当然ですね。
実行時にcomment_setという名前を追加するのは、javassistとかを使えばできるんですが。。。
とPython温泉でずっとJavaを書きながら悔しがっていました。
が、しかし!
Seasar Conference 2007 Autumnに行ってきたんですよ。古い話ですがw
Irenkaっていうプロジェクトがありました! コンパイル時ソリューションです!
Eclipseがコンパイルを行う際に動作するものだとのことでした。
そう!できるんですよ。Djangoと同じ仕組みが。
イメージはこんな感じ。
CommentクラスにEntryクラスを格納する変数を定義し、その変数に関連を表すアノテーションを書く
コンパイル時にアノテーションをチェックし、コンパイラが参照するEntryクラス(.class)にcomment_setのような変数を動的に追加する。ソースコード自体はいじらないところがみそ。
コンテナ起動時に、アノテーションをチェックし、Entryクラス(.class)にcomment_setのような変数を動的に追加する。
これで、Entryというクラスがjarの中に入って提供されていてもノープロブレム!