tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

Perl Best Practice 一人読書会(1日目&2日目)

Perlベストプラクティスを読んでます。ずいぶん前に一度読んだはずなのですが、ほとんど忘れてました。。。

この本については、「良い本だけど、Perl のベストプラクティスではなく、Damian氏のベストプラクティスだから、気をつけて読まないと駄目だ」という噂をちらほら聞くので、そんな感じで読んでみました。
twilog からの抜粋なので、変なのが混じってたらすいません。

1日目

  • 2.9「78列の行を使用する」。うーんちょっと微妙。最近の大きなディスプレイを活用しないのはもったいないのではないか。 14:17:23
  • 2.10 「4列のインデントレベルを使用する」 同意なのだけど、emacs とか使わずにやっつけでスクリプト組むときは 2列(スペース2つ)を使ってるや。普段はもちろん 4列 14:18:46
  • 3.5「アンダースコアを使って複数の単語からなる識別子の単語を区切る」 今では普通になったけど、昔は Java 屋さんだったから、コレには違和感あったなあ。 14:27:14
  • 3.6「プログラムコンポーネントの種類は大文字と小文字の使い分けで区別する」 同意なのだけど、ファイルハンドルは昔の名残りで、$FH みたいに書いてることがあるな。気をつけよう。 14:31:34
  • 3.7「略記は先頭部で示す」まったくもって同意。というか、悪い例に出てくる母音を省略する略記法にどういったメリットがあるのかさっぱり分からない。 14:35:13
  • 4.1 「文字列展開デリミタは実際に展開する文字列にのみ使用する」 シングルクオート文字列は割と積極的に活用しているけど、q{} とか qq{} はあんまり使ってないな。使ってみよう。 14:42:45
  • 4.2 「空の文字列に"" または '' を使用しない」 えー。これはめんどくさい。$err_msg = q{}; #空の文字列。とかありえんでしょ。普通に $err_msg = "" をつかってるな。 14:45:35
  • コメントもいらないでしょ。空文字列で初期化する場合なら。既存の文字列をクリアする場合は何らかのコメントを書くこともあるけど。 14:46:17
  • 4.3「一文字で構成される文字列を見た目に紛らわしい方法で書かない」。同意だけど、join(q{,}, @list) はめんどい。join(',', @list) でも emacs がハイライトしてくれるから十分読める。 14:50:24
  • 4.4「数値のエスケープではなく、名前つきの文字エスケープを使用する」。同意だけど、「ascii 制御文字(空白とかは除く)を削除したい」、みたいな場合は数値で範囲指定のほうが多分書きやすいはず。s/\N{DELETE}-\N{CANCEL}//g とか書いたら気持ち悪い 14:57:04
  • そもそも順番を覚えてないと死亡確定だし。つーかさっきの正規表現ちゃんと効くかは分からんです。 14:57:42
  • 4.5 「名前付きの定数を使用し、use constant を使用しない」。まあ constant つかうなら Readonly だよね。でも Perl できっちり定数を使いたい、って要望はあんまり無いな。大文字で書かれていれば再代入はしない、でも十分。 15:08:16
  • 4.6「10進数の先頭に0をつけない」。まあつけたらそれは8進数になるから、つけちゃいけないのは確かだけどね。「8進数に必ず oct() を使う」のはちょっと微妙。 chmod なら引数はパーミッションで、8進数なことは自明だから。他の場合は oct() 使った方が明示的かな。 18:02:39
  • ま、今まで chmod 以外で 8進数欲しくなったこと無いけど。 18:02:55
  • 4.16「優先度の高いブールと優先度の低いブールを混在させない」。これは自分の書き方と多分同じなんだけど、人によっては異論がありそうだなぁ。and/or なんかは使いたい人いそうだし。 18:08:04
  • 5.5「あまりよく知られていない句読点変数には、use Englishを使用する」。同意なのだけど、どれを持って「あまり良く知られていない」かは微妙だな。自分は $|, $@, $!, $/ あたりは普通に使ってるな、多分。 18:13:17

2日目

  • 5.7「正規表現のマッチ変数を使用しない」。これは同意だけど、Regexp::MatchContext を使う。ってのは正直微妙だな。 16:07:21
  • 5.12「スライスのキーやインデックスの数が多い場合はファクタリングする」。この部分は一応理解したけど、多分使いこなせてない。今度機会があったら試してみよう。 16:09:25
  • 6.1「ポストフィックス形式の if ではなく、ブロック形式の if を使用する」。嫌です。後置 if がなかったら perl 使ってないかもしれないくらい。もちろん、文が長くなったらブロックに書き換えるけど。 16:11:36
  • 6.2「ポストフィックス形式の if は制御フロー文にのみ使用する」。制御フローだけでは勿体ない。ほかでも使いたい。 16:12:33
  • 6.3「ポストフィックス形式のunless, for, while, until を使用しない」。for はワンライナーとかやっつけスクリプトでたまに使うけど、一応同意。 16:13:24
  • 6.4「unless または until を決して使用しない」。うーん微妙。たしかにどちらもあんまり使わないけど、if not が気持ち悪い場合はつかってるかも。 16:15:09
  • その後のコラムにかいてある、「連鎖否定を使用してはならない」は完全に同意。unless not hogehoge とか unless に and や or が入るのは気持ち悪い。 16:15:35
  • 6.5「C スタイルの for 文を使用しない」。同意だけど、2つの配列を同時に操作したい場合とかは避けられないよね。 16:17:19
  • 6.7「ループないでは添え字を1回以上指定しない」。同意でもないけど、大抵リファクタリングしてそうなってる気がする。Data::Alias はどうなんだろ?と思って調べてみたら、悪くなさそうなので今度使ってみよう。 16:21:32
  • 6.10「古いリストから新しいリストを生成する際には、for ではなくmap を使用する」。同意だけど、map を正しく使えるようになったのは比較的最近な気がするので、きっと for で書いてあるコードがいっぱいあるだろうな。 16:24:25
  • 6.11「リストの値を検索する際には、for ではなく、grep と first を使用する」。grep は忘れてることがおおいなぁ。first も今度使ってみよう。 16:26:29
  • 6.14「リスト関数で $_ を使用しない」。map で一回だけ s///; するのは許してほしいかな。 16:28:55
  • 6.19「できるだけ多くの反復をできるだけ早期に排除する」。言いたいことには同意だけど、ここのコードにはまったく同意できないな。next を多用するくらいなら、for 文の中身をうまくメソッド抽出してあげる方が多分きれいになるはず。 16:33:57
  • 多分 $client をオブジェクトにして、expected() を持たせればいいはず。verify() も欲しいけど、これは client じゃなくて、ループ回してる側が持つのもありかな。 16:38:27
  • 6.20「制御を一元化するためにループ構造をねじ曲げない」。まあそうだけど、この例のコードは、綺麗な方も十分難解な気がする。 16:41:05
  • 6.21, 6.22 あたり。redo はあんまり使わないほうがいいと思う。それ以外に書く方法がなければ仕方ないけど。あと、最後の例は、preferred_phone() を抽出するのが正解だと思う。 16:44:20
  • お、 preferred_phone() はさっき見た grep() + first() の使いどころだ! 16:45:01
  • 7.2「モジュールとアプリケーションのための標準 POD テンプレートを作成する」。同意だけど、DEPENDENCIES とかいらんでしょ。META ファイルが使われて無い頃の話なのかな?perl 以外の外部のライブラリやバイナリに依存するならいるけどね。 16:51:39
  • 7.6「POD はできるだけファイルの最後の方に配置する」。そうしてる人も多いね。最初に書いてる人もいる気がする。オイラは普通に「途中」に書いてるや。javadoc のイメージが強いんだと思う。し、メソッド毎にドキュメントがあるほうがいいと思うんだけどな。 16:54:21
  • 7.8「重要なコメントにはブロックテンプレートを使用する」。うーん。なんかコレ perl っぽくないな。POD に引数もかいて、そのメソッドのドキュメントに Synopsis 的に書くのが今のお気に入り。 16:57:48
  • 7.13「長いテクニカルドキュメントには、『表にでない』POD セクションを使用する」。for は知らなかった。こんど使ってみよう。 17:00:27
  • 7.14「ドキュメントのつづり、構文、正当性をチェックする」。これはあんまりやってないな。CPAN にあげてるやつはちゃんとやっておかないと。 17:03:54