読みやすいコードのための暗黙の了解がつまってる「リーダブルコード」

そういえばidがkdmsnrの児玉サヌールという人から「本を訳したよ!」と献本いただいたのだけど、届いた本を見てみると訳者は角 征典という人だったのでとまどっていたところ。
出版したときにいただいてたので、もう半年近くになるけど、時間がかかったのは、ちまちまと一日1ページとか2ページとか読んでたから。普通に読めば、たぶん土日で読めます。

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

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

関係ないけど、一時期、角さん、角田さん、角谷さん、という一文字ずつ成長する東のほうの人と一気に知り合いになって「かっくん」と言われてるのがどの人かわからないことがあった。懐かしい話。


それはそれとして、ぼくは「きれいなコードをかきましょう」系の話はあまり好きではないのだけど、この本はよいです。


まず、薄いのがよい。
こういう分野の本は、まあ一冊は読んでおいたほうがいいのだけど、そこまで時間をかけるものではないと思っていて、必要なことが書いてあって薄いのが一番いいと思ってる。
この本は、必要なことは十分すぎるほど書いてあるのに、薄い。とてもよい。


訳もいい。読みやすい。読みやすいコードのための本が読みにくい日本語で書いてあったら説得力ない。この本は、ちゃんと読みやすい。
あと、気に入ったのがこの訳。

関数で複数のreturn文を使ってはいけないと思っている人がいる。アホくさ。

「アホくさ」ですよ。この訳で、一気にこの本を気に入ってしまった。


もちろん、内容もいい。


たとえば定数のコメントについて、適切な変数名をつければコメントは不要という話もあるけども

image_quality = 0.72; //0.72ならユーザはファイルサイズと品質の面で妥協できる。

という例をあげて、コメントとして『なぜその値を持っているのかという「背景」』が必要になることをあらわしてる。
このコメントの内容を変数名で表すのは難しい。変数名は「画像品質である」ということしかあらわしていない。じゃあ「image_quality_that_sutisfy_both_filesize_and_quality」のような変数名をつけるかというと、実際はそのような値であるとは限らないし、ファイルサイズだけを満足する値にすればいいという決断になったときに変数名をつけかえるというのもナンセンスだ。

定数の値を決めたときに頭のなかで考えていたことを記録することが大切なのだ。

というのがまさにその通り。さらにいえば、これは定数のコメントについて書いてあるけど、条件分岐の判定式などでも「条件分岐の判定式を決めたときに頭のなかで考えていたことを記録することが大切」ということがなりたつ。つまりコメントには「頭のなかで考えていたことを記録することが大切」だと言える。


ただ、コメントに関しては

コードを理解するのに役立つものなら何でもいいから書こう

というひとことが一番気に入っている。
単なるコードの日本語訳だろうが、改変履歴だろうが、コードを読む役に立つなら、ウソ以外はなんでも書いていいと思う。あとでジャマになったら消せばいいと思う。


それはそうと、やはりこの本のいいところは、変数名とかコメントとか、ソースコードの構造をかえずに表面上で読みやすくする話だけではなくて、制御構造や処理の順番、エラーメッセージやテストなど、読みやすい処理の書き方についても書いてあるところだ。
変数・関数に適切な名前をつけて長い関数は分割してインデントを整えてコメントを書きましょう、というだけの本だったら、「いい本だけど、ブログでいいよね」ということになる。
「きれいなコードをかきましょう」系の話が好きではないのは、単にコードを表面上きれいにしましょうという話が多いからだ。
体裁を整えて修飾すれば読みやすくなるわけじゃなくて、どのように処理を実装するかという時点から読みやすさを考えておく必要があることを意識させてくれるという点で、「リーダブルコード」はいい本だと思った。


それから、ぼくは「創るJava」とかAPIの説明を書くときに、たとえば

req.getRequestDispatcher("/hoge.jsp").forward(req, res);

ではなくて、getRequestDispatcherがRequestDispatcherオブジェクトを返す、forwardメソッドはRequestDispatcherクラスのメソッドであるっていうことを明示するために、一旦変数に割り当てている。

RequestDispatcher rd = req.getRequestDispatcher("/hoge.jsp");
rd.forward(req, res);

このような変数の使い方について「リーダブルコード」では「説明変数」という名前がつけられていたのが、ありがたかった。


ちなみに、角さんは「かくさん」じゃなくて「かどさん」です念のため。