上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

役に立ったらぽちっとよろしく。 人気ブログランキングへ

EDSL とは 通信規格 ADSLの親戚ではなく(笑)、Embedded Domain Specific Language の略である。…日本語にすると"埋め込み分野指定言語"?JavaとかCは汎用的で強力なんだけど、ある種のテーマに対しては物凄く冗長な表現になる。テーマに適した言語の方が、ずーっと簡単で簡潔になる。

なので、そんな時はJavaやCに他の言語を直接(文字列型としてではなく)埋め込めたらなぁ…な~んて思う。で、実際、埋め込みSQLっていってJavaやCの中に、直接SQLを書き込めたりなんてのもある。ただ、SQLみたく有名な言語だとそういう方法をサポートしてくれるコンパイラもあるんだけど、My言語!!をサポートしてくれるコンパイラは無い。さらに、埋め込みSQLって言ったってそんな主流ではない…人にもよるだろうけど、どことなく後ろめたさの残る技術なのである。

そこで、結構みんな良くやるのが既存のJavaやCの枠組みの中で、文法の規則をホスト言語の型で表現して分かり易くする方法。例えばSQLの条件部分(よくCriateriaと呼ばれる)だと、criateriaX.and(criateriaY.or(criateriaZ))みたいにする。文法規則での入れ子の表現を型でも表現できるので、こうした方法はよく使われる。そして、こうすると検索条件をほいほい持ち運べるのでとても便利 (文字列で持ち運んで他の条件と結合すると"商品.単価 > 2000AND 商品.在庫 > 100"等のウッカリミスがある)


で、今日のメモはここから、GoogleのDIフレームワークにGUICEってのがある。なかなかよく出来たDIだと前々から聞いていたので、かなり遅ればせながら覗いてみた。そしたら、こんなとこにもEDSL発見 !!

bind(Service.class).annotatedWith(Red.class).to(ServiceImpl.class)

…思ったのは、何だかSQLの時の印象と違う…。しばらくして何でか分かったんだけど、SQLの時のはそもそも各文法木の一部の持ち運びを前提にしてる。けど、GUICEの場合、

bind_annotated_to(Service.class, Red.class, ServiceImpl.class)

のようにしたくないがためのシンタックスシュガーのみを意図してて、bind(Service.class)の結果の持ち運びは意図してないはず、…でもできちゃう。…確かに圧倒的に読みやすいんだけどね…。~難しいな…Javaにメソッドの引数を構造化できる機能とか…返り値を保存させない機構があればいいのかな…それも少し大げさか…うー悩ましい…。ただ、GUICEのJavaDocを見て感心したのは、EDSLのための導入ですよ~ってのをきちんと明文化してたとこ…。これなら、間違いにくい…さすが。

で、色々調べると、こうした使い方はMartin Fowlerが"Fluent Interface"と呼んでいる(日本語訳)ものらしい。記事は結構古いんだけど、その中でこれからもっと議論されるべき手法…とくくってある。…そして、GUICEの様な使い方は、代表的な手法ではないとの事。 う~ん、でも、GUICEみたく有名所が使ってるって事は、こうした方法も増えてくのかなぁ…。う~ん…。

スポンサーサイト

役に立ったらぽちっとよろしく。 人気ブログランキングへ

コメント
この記事へのコメント
コメントを投稿する

トラックバック
この記事のトラックバックURL
この記事へのトラックバック
Copyright © ふらふら技術者の日記 All Rights Reserved.
Powered by FC2 Blog
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。