Go to the previous, next section.

プログラミングスタイル

プログラマには皆、当然ながら、体裁に関して自分自身の好みがあるが、 プログラムを読み易くするための一般的なガイドラインがいくつかある。

  1. あることをある方法でできるからといって、 それはその方法でせねばならないということではない。

    perl はどんなことをする場合でも複数の方法があるように設計されているので、 もっとも読み易い方法を選ぶのがよい。たとえば、

    open(FOO,$foo) || die "Can't open $foo: $!";
    

    は次よりもよい。

    die "Can't open $foo: $!" unless open(FOO,$foo);
    

    なぜなら、後者は文のメインポイントを修飾子として隠しているからである。

    一方、

    print "Starting analysis\n" if $verbose;
    

    は次よりもよい。

    $verbose && print "Starting analysis\n";
    

    なぜなら、 メインポイントはユーザが -v をタイプしたかどうかではないからだ。

    同様に、演算子がデフォルトの引数を仮定しているからといって、 それはデフォルトを用いなければならないということではない。 デフォルトはちょっとしたプログラムを書く 怠け者のシステムプログラマのためにある。 プログラムを読み易くしたければ、引数を書いた方がよい。

    上と同じようなことだが、 あちこちで括弧を省略することができるということは次のように書け、 ということではない。

    return print reverse sort num values array;
    return print(reverse(sort num (values(%array))));
    

    あやふやな時は、括弧をつけよう。 少なくとも、物好きが、vi% キーを押すかもしれない。(?)

    When in doubt, parenthesize. At the very least it will let some poor schmuck bounce on the % key in vi.

    あやふやでない時でも、 君の後を継いでコードのメンテナンスをしなければならない人物の 精神福利を考えよう。彼はおそらく誤った所に括弧をつけるだろう。

  2. ループの最初や最後でループから抜けるようなゆがんだことをしてはいけない。

    perl は真ん中から抜けられるように `last' 宣言子を用意している。 見易くするため、インデントを少し少なくしよう。

    line:
     for (;;) {
         statements;
     last line if $foo;
         next line if /^#/;
         statements;
     }
    

  3. 安心して loop ラベルを使え --- ラベルは多重ループから抜けるためだけでなく、 より読み易くするためにある。

    一つ前の例を見よ。

  4. 移植性を高めるには、全マシンでインプリメントされていない機能を使う際に、 eval 構造の中でそれが失敗するかどうかテストせよ。

    ある機能が どのバージョン、どのパッチレベルでインプリメントされたかが分かっているなら、 $] を使ってその機能があるかどうかを調べることができる。

  5. 覚え易い識別子を選べ。

  6. 首尾一貫。(Be consistent.)

Go to the previous, next section.