2008年10月31日金曜日

Rubyがなぜ読みやすい?

# はコメントなのか?違うのか? わかりずらい。

読みやすいって言う基準は何?
結局正規表現とかシェルのパイプで繋ぎまくったスクリプトが読みやすい、つまり書き方が分かっていれば簡潔、っていう読みやすさだと思う。だって全然読めないじゃん。パラメータ受けてないのに、書いてないときは呼び元で指定?? じゃ何が来るか分かんないじゃん。でもコレとかアレが来る前提で書くわけでしょ? 故に読みやすいと。いや〜絶対くじけると思う。そもそも出来るだけ冗長に書こうとする人間には無理。

例えば、
a[1] ||= 1
a[1]がnilでなければ1が代入される。理屈はそうなんでしょうね。でもこれを見て、直感的にそうだと分かる人がどれだけいるんだろう。簡潔と短いは同じじゃないはず。知ってる人にしか分からない。それは言語ですからね。でも同じ言語の中で、一つの文法にそってない。

によると、まず文法として、

式1 op= 式2

という形、つまりa[1] += 1、a[1] |= 1、a[1] ||= 1などがある。
ところが、opが、&&、||の場合とそれ以外の場合は意味が異なる。
opが、&&、||以外の場合は、

式1 = 式1 op 式2

&&、||の場合は、

式1 op ( 式1 = 式2 )となる。

つまり、||の場合は式1から評価するため、式1がtrueだと(式1 = 式2 )は評価されないことによるわけだ。しかし計算上、式1がtrueなら(式1 = 式2 )は評価されないということを意識するというのは、読みやすいということになるのだろうか。

a || b

と書いたとき、次の2つの文を比べてみよう。

(1)『aかbの「どっちかが」trueならtrue、それ以外はfalse』
(2)『まずaを先に判断して、aがtrueだったら、true、falseだったら次にbを判断して、trueだったらtrue、そうじゃなかったらfalse。』

どちらがより一般的な考え方なのか。それが読みやすさに繋がる意識の源ではないかと私は思う。というかそれが私。

私は「英語のように書ける」という説明を読んでこう思いました。私自身の英語力の問題はさておき、自然言語とコードが一致する、と。それは私向きに違いないと。何故かと言えば、私は例えば仕様書を日本語で書いたようなコードを書こうとするから。だから1行しかない関数が山のようにあったり、C言語なのに、値を返すだけの関数があったり。それはできるだけ思ったまま書きたいから。コンピュータのためのコード編集はその後やればいい。そうすればどうしたい(実際にした)けどペンティアムのためにこうしようという履歴が明確になって、意識とコードがずれない。

rubyには他にもProc.newのパラメータが呼び元で指定するとか、短く書きたいがためにハッシュの{}を省略するほうが美しいとか、とにかく意識とのギャップがそこここに散らばってる気がする。それが自分の意識の中で普通になれば、短い分読みやすくなる(速く読める)のかも。事実、Rubyの代表作であるRoRのプログラムが、その賞讃とは裏腹に読み難いという、何とも皮肉な評価を目にする。オブジェクト指向は外から使い安くする分、中身が苦労してるというのは最もな話。でもそれは読みやすさとは関係ない。RoRが読み難いならRubyで書いたプログラムは読み難いと思って、なぜ間違いなのだろうか。

evalはどうだろう? まだ簡単な例しか見てないけど、読みやすいのだろうか? HTMLやXMLを出力するのは良く分かるけど、同じ要領でclassを出力するのはねえ。何となくテーブルをオブジェクトにするには、それも有りなのかもしれない気はしてるけど。

余りにも遠い道のり。このままではダメだ。
ここは一つ、劇的な割り切りとすっ飛ばし!が必要だな。

ということで、10日でおぼえる本に戻ろう。
そして軽く一本書き上げよう。

俺だけが分からず屋で、Rubyが読み難かったり書き難かったりしても、いいかしら?byミシェルじゃない、いいんだよ。

0 件のコメント: