${}とか#{}とか。from Ruby to EL
Rubyで次のようなコードがありました。
uri = URI.parse(uri_str) response = Net::HTTP::Proxy(proxy_addr, proxy_port).start(uri.host) { |http| if (uri.query) http.get2 [uri.path, uri.query].join('?'), 'Authorization'=>auth else http.get2 uri.path, 'Authorization'=>auth end }
if節だけでは、uri.pathがnilの時、? で終わるURLにアクセスします。たいていのサイトは問題ありませんが、問題が生じるケースもあります。しかし、このコードのために5行消費するのは気に入りません。次のようにすると、1行にできます。
http.get2 uri.path + ((uri.query && "?#{uri.query}") || ''), 'Authorization'=>auth
Rubyでの空文字は真なので、uri.queryが空文字の時、?で終わるURIになります。これは仕様です(URI.parseと対称性あり)。
こうやってifを追放できる余地が大きい言語ほど世間の受けは良いですが、可読性の観点からどちらが良いかは微妙です。
話は変わりますが、某UIデザイナからJSPのELに関する質問を受けました。ELで次のように文字列だけを真偽値として評価すると、どうなるかという質問です。
<c:if test="'foobar'">...</c:if>
Cの感覚から真かと思ったのですが、実際の動作は偽となっています。
http://jcp.org/aboutJava/communityprocess/final/jsr245/index.html からたどるとELのスペックを見ることができます。「Type Conversion」に次のように書いてあります。以前同じことを調べたような記憶もありますが、定かではありません。
1.18.5 Coerce A to Boolean If A is null or "", return false Otherwise, if A is a Boolean, return A Otherwise, if A is a String, and Boolean.valueOf(A) does not throw an exception, return it
世の中ではEL式という訳語が目につきます。今まで、EL(expression language) expressionはおかしいと思っていたのですが、Sunの文書を見るとEL expressionと普通に書いてあります。EL式は素直な訳語だったようです。普通名詞として"expression language"、固有名詞として"EL expression"や"JSP expression"が使われているようです。ややこしいです。
Java系の周辺技術の中で、個人的にELは気に入っています。モデルオブジェクトに対して参照専用に割り切ったシンプルさが魅力です。覚えることが実に少ないです。.と[]の記法、各演算子の意味、演算子の優先順位、型変換、これだけ覚えれば使えます。しかも、上のスペック文書を見ればすべて簡潔にまとまっています。
http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html を見ると、"unified EL"とあります。JSP由来のexpression languageと、JavaServer Faces(JSF)由来のexpression languageのふたつがあるので、統合して"unified EL"にしたと書いてあります。外野から見れば、ふたつ似たようなものを作っておいてunifiedも無いだろう、と突っ込みたくなりますが、まあJavaはそんなものです。
上のunified ELのページを読むと、遅延評価(deferred evaluationなので遅延評価の訳語は良くないかも)、左辺値(lvalue)、メソッド式(method expression)、とUIデザイナへの嫌がらせみたいな用語が並んでいます。SunはELを書くのが誰だと思っているのでしょう。
unified ELでは、モデルオブジェクトの参照専用の式は ${} と表記して、モデルオブジェクトの参照更新両用の式は #{} と表記します。ELからモデルオブジェクトを更新可能と聞くと、一見、MVCの明らかな逸脱に聞こえます。しかし、モデルオブジェクトの更新は、JSPページをレスポンスするタイミングではなく(もしそうならMVCの逸脱)、HTMLフォームからデータをポストしたタイミングで起きる話です。
JSFは http://java.sun.com/javaee/5/docs/tutorial/doc/bnapl.html を読んだ程度の理解ですが、なんとなく作りたい気持ち(unified ELが必要になる背景)は分かります。
HTMLフォームとそれに結びついたモデルオブジェクト(Javaでは一般にJava Beans)の関連を、現状、どこかに持つ必要があります。JSFはそれをJSPページに書こうとしています(unified ELが必要な理由)。ついでに、入力値の妥当性検査(用のコードとの関連)もJSPページに書きたいようで、これがunified ELにメソッド式がある理由です。気持ちは分かりますが、世間のUIデザイナはこれを理解できるのでしょうか。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/from-ruby-to-el/tbping