Personal tools
You are here: Home ブログ 井上 ${}とか#{}とか。from Ruby to EL
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

${}とか#{}とか。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デザイナはこれを理解できるのでしょうか。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/from-ruby-to-el/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.