リーダブルコード
「リーダブルコード」を読了した。いい本だった。こんなにいい本はひさしぶりかも。薄くて、訳がわかりやすく、さらっと読める。でも大切なことがぎゅーっと詰まってる。
リーダブルコードはリーダブルブックだった。
よいコードを書きましょうって書いてある本はたくさんあるし、何冊かは読んだ。なにが違うのか考えてみた。
- 原理、原則だけを書いているわけではない
- 理想論的ではなく、現実的な内容が書いてある
- 実践的なプラクティスが書いてある
たぶんこんな感じ。もうちょっと詳しく書く。
原理、原則だけを書いているわけではない
たとえば、コーディングルールを徹底するというのは、原理主義的なアプローチだと思う。コーディングルールを徹底するのは効果的で必要なことだけど、それだけではリーダブルコードにならない。
「3.7 ユーザの期待に合わせる」ではこんな例があった。
プログラマは get で始まるメソッドは、値を返すだけの軽量アクセサであるという規約になれている。そのため、コストの高い処理が get で始まると、コストの高さに気付かずに使ってしまうかもしれない。
サンプルのコードはこんな感じで
public double getMean(){ // すべてのサンプルをイテレートして、total/num_samples を返す。 }
それなら computeMean() などの名前に変えるべきだ、とある。
なるほど。
理想論的ではなく、現実的な内容が書いてある
読みやすいコードを書くためには、コーディングルールではカバーできない、もっと別のアプローチが必要になる。その別のアプローチが本書には載っている。
「7.3 三項演算子」ではこんな例がある。
三項演算子がわかりやすい例としてこのコード。
time_str += (hour >= 12) ? "pm" : "am"
これはシンプル。で、わかりにくいコードはこれ。
return exponent >=0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
if文を使うと、コードが自然になる。
if(exponent >=0){ return mentissa * (1 << exponent); }else{ return mantissa / (1 << -exponent); }
これならわかる。
実践的なプラクティスが書いてある
具体的で短いコードが提示されていて、改善するための考え方や、改善されたコードが記載されているのでわかりやすい。
この「具体的で短いコード」が、ほんとうに具体的で短いのでわかりやすい。こういうこと、これまでやっちゃったことあるなーと思うようなものが載っている。だから理解しやすい。
「2.2 tmpやretvalなどの汎用的な名前を避ける」では、こんな感じの2乗した値の合計値を返却するなら、retval ではなく sum_squares にしましょうって書いてある。
retval += v[i] * v[i]
例えば、sum_squares がこんな感じになってたら、名前からバグっぽいとわかる。
sum_squares += v[i]
確かに。
いくつかのプラクティスは、これまで無意識にやっているものだった。
このあたりのコードはごちゃごちゃしてるなー、なんかバグだしちゃいそうだなー、あとで読みにくそうだなーっていう、臭うコードはなんとなくわかる。それで、変数名を変えたり、メソッドを抽出したり、処理を分割したりする。
そのひとつひとつが、名前の付いたプラクティスとして紹介されている。これなら意識的に取り組んでいける。
いまは毎日コードを書いているので、読んでいていろいろ想像できた。人が読むことを考えると、丁寧に書くよね。仕事で書くコードは全部コードレビューされるし、読みやすいコード書きたい。
本書の解説にこんな一文があった。
「忘れても見たら簡単にわかるように書いておくんですよ。」
「情けは人のためならず」と一緒で、人のためではなく自分のためにリーダブルコードを書きたい。
関係ないけど、ここで書いている文章はリーダブルじゃないことが多いと思う。それでいいと思っていて。もっと一文を短くしたり、主語を明確にすることで読みやすくなるだろうけど、あえてしていないこともある。
でも外部媒体で記事を書くときは、わかりやすくて伝わる、そして楽しい文章を心掛けている。