「Perlベストプラクティス」まとめ を読んでふと「Ruby使えばいいのに」と思った
Posted by yoosee on Clip at 2006-10-15 23:42 JST1 「Perlベストプラクティス」一通り読んだのでまとめ
えーと、先日 Ruby信奉者の本拠地サイトってどこにあるんだろう と書いた上に Ruby もきちんと知っているとは言いがたいんだけど、これを読んで「Ruby 使えばいいのに」と思ってしまった。参照の変数名は_ref付きに。そもそも参照渡しが大量に必要になる時点で不便。Perl の getter/setter に参照を入れる場合にいつも悩んでしまう (ObjectTemplate 使う際は結局 ref で入れることが多いけど) 。Ruby のように配列やハッシュもオブジェクトとして渡せればいいのに。
if-efsif-efsif-elseの連鎖は止めてテーブル参照に。これは Perl4 の頃から不思議なんだけど、何故 case が使えるようにしないんだろう?
エラー発生でundefを返さずに例外を出す。Perl の例外って言語仕様にきちんと無いので使いにくい気がするけど最近のはそうでもないのだろうか。Ruby では標準で
begin ... raise ... rescue
が使える。is_validやhas_foundなど真偽値にちなんだ名前にする。foo.valid? や bar.found? と書ければ一目瞭然。
サブルーチン、メソッド、変数、ラベル付き引数の名前は小文字のみ。パッケージ、クラスには大文字と小文字を。Rubyだと自然にそうなる。賛否ありそうだけど。
モジュールやクラスの内部専用のサブルーチン名には、先頭に_を付ける。命名方針はともかく、Perl の場合にはそもそも package に隠蔽という概念が無かったので、その部分はいかんともしがたかった。今は private pragma があるんだっけ?
どうしても必要なとき以外はmyによるレキシカル変数だけを使う。なぜ標準が lexical にならないんですかね(もちろん過去互換性のためだろうけど)。いや単に毎回 my を書くのが面倒だというだけの話なんだけど、use strict; したら lexical じゃないと怒られるのになぁと。
ループで配列やハッシュのインデックスを使わない。配列を直接ループさせる。こんなのや、
keys %hash は遅いから values %hash を使うなんてのは Bad Know-how 以外の何者でもないな。Ruby なら
hash.each do |key, value| .... end
と明瞭にかける。$_の乱用は混乱の元。$_ は Perl 習いたての頃は凄い仕組みだと思っていたけど、今となっては混乱の元でしかないというのが悲しい。
for, whileは$_ではなくmy $hogeで名前付きレキシカル変数を使う。
Perl の There are many ways to do it. と言う考え方は好きだけど、実際には too many ways だったり、後から小声で But, the best way is only one. だなんて言われそうな気がするのがなぁ、と思ってしまう。
いやもちろん、こんな事だけで「Perl よりも Ruby の方がいいよ!」などと言いたいわけではないので念のため。所詮は言語なんて、使えるなら好きな方を、制約条件があるなら使わなければならない方を使うしかないんだし。でも上記のような部分は、個人的には Ruby の方が楽だなと思う。
それはともかく「Perlベストプラクティス」は読んでみようと思った。*::Util とか全然使ってなかったけど便利そう。結局は「不便な事も少なくないけど捨てがたい」というのが Perl の罪深いところなのかも。