Perlベストプラクティス(1〜5章)

「バグを埋め込まないためによいコーディングスタイルを身に付けたい!」ということでこの本を読んでみました。


〜1から5章までの感想を簡単に〜

第1章 ベストプラクティス

  • ここは「はじめに」のような章になっていて、この本の位置付けが書かれています。
  • Perlは記述の自由度が高い言語なので、それぞれが自らのバックグラウンドのままに自由にコーディングすると、無法地帯となりがちです。
  • 本書は「行儀がいいことは息苦しいがうまくいく」という考えから、実践の中から産み出された「ベストプラクティス」を定義していこうという内容になっています。それにより、「堅牢性」「効率性」「保守性」を実現することを目標としています。
  • ここに怖い言葉が書かれていたので引用させて頂きます。肝に銘じておきます。。

コードを書くときには、あなたのプログラムを保守する誰かが、
あなたの居場所を知っている凶暴な変質者であると心得よ

第2章 コードのレイアウト

  • ここでは、ブロックの書き方や改行の位置などコードの見た目に関することが書かれています。
  • コードのスタイルは可読性に大きく影響するので、しっかり標準に従いたいものです。変な改行やインデントのコードは読む気がなくなります。。
  • 全体としては、現在も従っているようなものが多かったのですが下記のようなものはそうなのかと思いました。
    • else(elsif)の閉じかっこは別の行
if () {

}
elsif () {
# } elsif () {  ←自分はこう書いてます。

}
else {
# } else {  ←自分はこう書いてます。

}
    • 行の幅は78文字
    • 縦を揃える
$person{ name   } = 'koba04';
$person{ age    } = '28';
$person{ hatena } = 'id:koba04';
my $total
    = $element1 + $element2 + element3
        + element4 + element5;
  • 後は、perltidy(ぱーるたいでぃ)の設定方法についても載っていました。(.perltidyrc)
-l=78
-i=4
-ci=4
-st
-se
-vt=2
-cti=0
-pt=1
-bi=1
-sbt=1
-bbt=1
-nsfs
-nolq
-wbb"% + - * / x != == >= <= =~ !~ < > | & **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
    • 使ったことなかったので使ってみようと思いました。
  • その他3項演算子についてなどはかなり見慣れない感じがありました。
# 上手い例が思いつかず。。
リターン = 条件1                   ? 条件1が真だったら
        : (条件1が偽の場合)条件2 ? 条件2が真だったら 
        :                            条件2が偽だったら
        ;

第3章 命名規則

  • 命名規則は、本当に難しいなぁといつも思います。関数や変数のいい名前が思いつかなくて苦労することはよくありますし。
  • しかも日本では、英語という壁があるのでさらに難しいなと思います。英単語以外にも、ローマ字表記で日本語のまま変数や関数名に付けたりするプロジェクトもありますよね。(個人的には・・・ですが、基幹系のシステムなんかに多いんですかね?)
  • この中に、参照変数には「_ref」を付けるというのがあったのですが、変数名に型の説明を付けること(例:H_hoge)はダメなのかなと思い、付けたことはなかったです。(でも確かにCPANモジュールの中で見たことあります)
  • 「意味不明な名前」として挙げられていた下記のような単語は自分もよく使っていましたので、「そうなのか〜」と思いました。やっぱり変数名は難しい。。

last, set => この2つは特に混乱しやすい。
left, right, no, abstract, contract, record, second, close, bases

第4章 値と式

  • ここでは、文字列や数値、演算子、ヒアドキュメント、リストの表現方法について書かれています。
  • 文字列に関しては基本的にはシングルクォーテーション、変数展開するときにダブルクォーテーションを使い、空文字は「''」ではなく「q{}」とするなどが定義されています。
    • 変数展開がない時でもダブルクォーテーションを使ってしまっている時があるので気をつけようと重いました。
  • 定数を表現する際のCPANモジュールとして紹介されている「Readonly」は知りませんでした。
    • 「use constant」ではなく、Readonlyモジュールを使う。
  • ヒアドキュメントのターミネータを引用符で囲むというのは、その通りだなと納得しました。(あまりヒアドキュメントは使わないのでついつい引用符を使っていないこともあったので気をつけたいなと思いました。)
  • その他覚えておきたいと思ったプラクティス。
    • ファットコンマ(=>)は「ハッシュエントリ」、「名前付き引数」、「その他名前と値のペア」のみに使うべし。
    • 演算子「and」、「not」は使用せず「or」は組み込み関数が失敗した場合の代替案を指定する場合のみに使用する。

第5章 変数

  • ここでは、レキシカル変数やローカル変数、組み込み変数などについて書かれています。
    • レキシカルでない組み込み変数を使用しない。($1や$|など)
    • 正規表現のマッチ変数は使用しない。($`、$&、$')
    • ローカル変数は必ず初期化して使用する。
$LOCAL_VALUE = 'foo';
{
local $LOCAL_VALUE = $LOCAL_VALUE;
}
    • $_の変更には十分注意する。
      • 関数の中で、渡された引数の値を変更しない場合は、関数の頭で$_を変数に代入し、$_のまま使用しないようにするとわかりやすいかなと思います。いずれにしろ必要でない場合以外は、引数で渡された値を変更することは避けるべきと認識しています。(省略され、暗黙的に参照されている$_にも注意が必要かなと思います)
    • 配列の最後から数えるときは負のインデックスを使用する。
$array[-1] # 最後の値
$array[-2] # 最後の1つ前の値
    • スライスをうまく使う
my @week_list = qw/mon tue wed thu fri sat sun/;
# 配列のスライス
my @weekend = @week_list[-1, -2];

my %week = (
    mon => '月',
    tue   => '火',
    wed  => '水',
    thu   => '木',
    fri     => '金',
    sat    => '土',
    sun   => '日',
);

# ハッシュのスライス
my @weekend_jp = @week{'sat', 'sun'};
      • スライスはようやく最近になって使うようになってきたので、もっと勉強してうまく使いこなしたいなと思います。
    • ハッシュのキーや配列のインデックスが多い場合は、ハッシュテーブルを使い管理しやすくする。
      • わかりやすい例としては、localtimeで日時を取得するなどでしょうか。
sub now {
    # ハッシュテーブル
    my %time_table = ( 
        sec     => 0,
        min     => 1,
        hour    => 2,
        day     => 3,
        month   => 4,
        year    => 5,
        week    => 6,
    );  

    my @time = localtime;

    my %now_time;
    # スライス
    @now_time{ keys %time_table } = @time[ values %time_table ];

    # localtime の戻りを加工
    $now_time{year} += 1900;
    $now_time{month} += 1;
    my @week_list = qw(Sun Mon Tue Wed Thu Fri Sat);
    $now_time{week} = @week_list[$now_time{week}];

    return \%now_time;
}

my $time = &now;
print $time->{year} . "年" . $time->{month} . "月" . $time->{day} . "日(" . $time->{week} . ")\n";
print $time->{hour} . "時" . $time->{min} . "分" . $time->{sec} . "秒";                                                                       
2010年7月3日(Sat)
19時32分2秒
  • 次は6〜10章を読み終わったら書きたいと思います。
  • わかりやすくバグのないコードを書くためのお供には「ベストプラクティス」。