葛藤の3分類と言語内DSL

みる

Rails を契機にして Ruby 自体の人気がうなぎのぼりになっているっぽい。2年ほど前から色んな人にで「RubyRuby、いや、まじで使いやすいって!」と宣伝していたにもかかわらず、あまり大きな反応は無しでした。が、いまや、Java な人のなかでも、Ruby の認知度はかなり高まってきたように思います。とはいっても技術好きの一部の間でだけ?

で、DSL

で、Rails といえば Web アプリケーションに特化した 言語内DSLと言われることがある。まぁ、AWDwR 日本語訳を読んでいるのだけど、ホントに良くできているソフトウェアだなぁ、と思って関心するばかりです、いやマイッタ。
で、Ruby(とか)とJava(とか)を比較する時に、いつも出てくるのが、JavaってXMLバリバリで大変よね〜、という話。Javaでは、言語仕様が固い上に、パーザがサボっているのか、あまりリテラル表現も豊富でなく、言語内DSLにはとっても向かない。じゃあ仕方がないよね、ってことで言語外に助けを求めて、XMLにハマるわけです。
実際に、Spring を使ってアプリを書こうとすると、Javaいじんなきゃだし、XMLさわんなきゃだし、ってんで、IDEに頼るしかなくなる。そして、そこで大きな問題が発生する。

Java では データ構造 が書きにくいが
XMLでは ロジック が書きにくい

はぁ、ブブッと中学か高校頃の思い出が記憶をよぎって、葛藤の3分類ってのを思い出してしまいました

葛藤の3分類

http://ja.wikipedia.org/wiki/%E6%AC%B2#.E9.81.A9.E5.BF.9C.E6.A9.9F.E5.88.B6

接近と接近
ラーメンも食べたいけど、ハンバーグも食べたい
回避と回避
練習したくないけど、試合には負けたくない
接近と回避
試験に受かりたいけど、勉強はしたくない

なんか、例がとってもオコチャマですが、それは置いといて、、、
はいはい、まさに回避-回避の葛藤ですね。このコードをJavaで書くかXMLで書くか、それが問題だ。いや違う、問題は、そこか「回避-回避」にあるとこだと思うわけです。設計なり、可読性なり、何か(往々にして大きなこと)を捨てなければいけなくなります。
ちょっとヨコミチにそれますが、Seasar2では、XML内に OGNL を使って結構柔軟なコードを書けるので結構嬉しかったりする。でも、XMLで動的なコードを書いたら知り合いに「なんか気持ち悪い\(−"−)/ 」といわれてヘコンダ記憶がある。

接近-接近 ミルクレープ

ぶっちゃけ

設計/可読性を犠牲にするようなDSLはイヤだ!

そもそも、クラスライブラリってのはそれ自体 DSL なわけで、オブジェクト指向っぽく書くってのは、うす〜〜いDSLの層を、ミルクレープのように*1重ねていくもんだと。なら、言語外DSLみたいにミルクレープの間にアルミ箔が挟まってた、とかなると安心してあ〜〜んと食べられないわけですよ。銀歯がキーンってなるから(T_T)

さて、つまり、効果的にDSLを使いたいならやっぱり言語内だよ!って結論に勝手に、はい、自分勝手に至りました。言語内 DSL でミルクレープ、とりあえずあと3ヶ月くらいこの思想でコーディングをしてみようと思います。接近-接近になるようにもっていって、どちらを選ぶかのセンスを磨く!

*1:フラクタルに、とか書くとカッコよさげ?