トップ «前の日記(2012-06-30) 最新 次の日記(2012-07-02)» 編集

日々の破片

著作一覧

2012-07-01

_ 単純な教えは悪

角さんからリーダブルコードをいただいたので(なぜもらえたかは、P.ⅵ参照)、再読した。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)(Dustin Boswell)

もう、そこら中で評価されまくっているし、がんがん売れているようなので今更感はあるけれど、いくつか。

まず正誤表(もらった理由と考え合わせれば忸怩たるものなきにしもあらずということになるけど)。

(P.112にPythonのコードでdatetime.datetime.now()という何かの間違いのようなコードが出てくるので繰り返しの間違いかと思ったら、Pythonはそういうものみたいだ。でも、

datetime.datetime.now()のままでも十分に明確だ。
は、「のままでも十二分に冗長だ。」の間違いだよな)

で、この本には、ひねこびた青年の主張みたいなものはまったく出てこないので実に気持ち良くすいすい読める。

ということは何ら新しい知見が無いのか? と言えばそんなことはなく、P.32に出てくる範囲変数の命名にfirst/lastとbegin/endのペアを使い分けろ(前者は以上/以下、後者は以上/未満)というのは、なるほどそれは知らなかったから、今日からそうしようと従うことにする。

とは言え、do/whileについては微妙にそれは違う感を持つがそれは後述する。

また、これはすごく重要なのだが、本場英語の国のプログラマ(元)のコメントの正しい書き方講座みたいな章が2つ、さらに折に触れてどうコメントするかについて説明されている。もっともコメントは翻訳されているけど(それは当然なのだが、ただ英語でコメント書く機会ってそれなりにあるはずなので、原文も欲しいところだ(という点からは原書も持っていて損はまったくないね)。ここまでページを使ってコメントの書き方をきっちりと説明している本は見た覚えがない(Javadocの書き方のような特定ツールのDSLの説明は別として)ので、ここらだけでも価値ある本だ。特に情報密度の濃い言葉を使えというのは目からうろこ。コードをまともに読めない連中用にコメントを書くという意識があるから(一方、5.3と5.4は既にして実践しているので矛盾していないこともない)、コメントも小学生向けに書くことが多いのだが、確かにそれはおかしいかも知れない。

で、上で元プログラマと書いたが、本書の美点は、実際にまともなソフトウェアを開発している企業でコードを書きまくっていた(元グーグルと元マイクロソフトで、片方は引退しているように見えるけど、もう片方はまだコードに触れている雰囲気がある)人間が書いていることだ。

そこで次のような当然ふつうの感覚が書かれている。

mという変数名にはあまり情報が含まれていない。でも、大丈夫。コードを理解するのに必要な情報がすぐそばにあるからだ。

この言葉は3行のブロック内で宣言、情報取得、情報出力にだけ利用する変数の例を示した個所に出現し、このような利用方法であれば1文字のm(mapの頭文字だな)で十分だということを示している。

つまり、もちろん、変数名であれば最初に「明確な単語を選ぶ」に始まる6ヶ条が示されていて、それが原則として説明された後のことだ。

というように、各章はだいたい、~という原則を示し、実際のコード片で読みにくい例、読みやすく書き直した例が続き、付加的な情報が続く。

で、変数名についてはそれは原則であって、たかだか3行のブロック内に出てくる使い捨て変数であれば1文字で十分だ、としているので、それを読んだこちらはほっと胸を撫で下ろす。

というのは、最初にひねこびた青年の主張という書き方をしたが、犬は紐につないで引っ張って来なさいと教えると、バターをひきずって(溶けて流れてしまう)帰ってくるし、バターは頭の上に載せて運ぶと教えると、牡牛を頭の上に載せて首の骨を折って死んでしまう、教訓話の主人公のような連中がいて、この連中は牡牛を前にして頭の上に載せろと主張するので非常に迷惑なのだった。それに対して本書は、ちゃんと例外まで書いてある。実に良い。

で、その伝でいけば、少し上に書いたdo/whileの微妙に違うは、ブロックが数行でcontinueを使わず(というか、do/while内ではcontinueを使わないことにすれば良いと思うわけだが)、かつ最低1回は実行する必要があるコードであれば、利用はまったく問題ない(それどころか、場合によっては条件を読み飛ばすことすら可能なので読みやすいこと甚だしい)のだが、そこに触れていないので、リーダブルコード厨みたいなのが湧いてきて、do-whileを見つけるとかたっぱしからミソクソ一緒に焚書坑儒するんじゃないかという気になるからだ。

で、他にもgotoの毒消し(使うべき場合は使え)とか、ガードを関数の先頭に入れろ(つまり最初にreturnすべきものはさっさとreturnさせろ。returnを1カ所に拘泥するのは悪)とか、ループ内のくだらない制御変数(その場でbreakしろ、条件式での退出に拘泥するのは悪)とか、原則がすべてというか、最初に教わったことで世の中のすべてがわかったつもりになっているような人たちに向けた説明が散りばめられていて、このあたりも暗澹たる気分になる。(というか、1つ覚えのハンスはドイツだし、エパミナンダスは南米なので、どこの言語圏かを問わず、原則主義者みたいなやつはいるということなんだろうね)

暗澹たる気分になるのは、教育が原則を教えるのは当然で、かつそこで例外を教えるのは混乱の元(相反する2つの教えが同時に出てきて、かつその使い分け基準はヒューリスティック(3行ならOKで4行ならNGとかありえなのは、使い分けするためにはコンテキストの解釈が必要だからだ))なのだが(で、それは当然そういうものなのだから、教えを受けた側は例外について考慮すべきなのだが)、不思議なことにハンスは牛をバターのように扱って首の骨を折るようなことが昔話の時代から現代にいたるまで繰り返されているからだよ。というわけでマニフェストを守れなくてもしょうがないでしょ(いや、それは違うんじゃないか)。

それはそれとして、須藤さんの解説は不思議な味わいがあっておいしい。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え