jtk

【読書メモ】リーダブルコード その1

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック を読んでいます。
忘れそうなので、何回かに分けて書き留めていこうと思います。

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

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

1章 理解しやすいコード

コードは理解しやすくなければいけない。
これがコードを書く上でいちばん大切な原則だ。

1.2 読みやすさの基本定理

コードは他の人が最短時間で理解できるように書かなければならない。
これってどういう意味だと思う? そのまんまの意味だ。 例えば、同僚にコードを読んでもらって、彼が理解するまでにかかる時間を計測するとしよう。この「理解するまでにかかる時間」という数値を最短にするってことだ。

「他の人」というのは、自分のコードに見覚えのない6ヶ月後の「君自身」かもしれない。

1.3 小さなことは絶対にいいこと?

コードは短くしたほうがいい。だけど、「理解するまでにかかる時間」を短くするほうが大切だ。

2章 名前に情報を詰め込む

名前に情報を詰め込む

sizeget みたいに一見すると問題がなさそうな名前であっても、情報が含まれていないことがある。

情報を詰め込んだ名前のつけ方のテーマ

  • 明確な単語を選ぶ
  • 汎用的な名前を避ける(あるいは、使う状況を選ぶ)
  • 抽象的な名前よりも具体的な名前を使う
  • 接尾辞や接頭辞を使って情報を追加する
  • 名前の長さを決める
  • 名前のフォーマットで情報を伝える

2.1 明確な単語を選ぶ

getPage(url);

この "get" という単語はあまり明確ではない。もし、インターネットから "get" するのであれば、

fetchPage(url);
// もしくは
downloadPage(url);

のほうが明確である。

2.2 tmpretval などの汎用的な名前を避ける

エンティティの値や目的を表した名前を選ぼう。

いい名前というのは、変数の目的や値を表すものだ。

ただ情報の一時的な保管や、生存期間が少ない行数の変数名には、tmp という名前で全く問題ない。

2.3 抽象的な名前よりも具体的な名前を使う

ServerCanStart()

というメソッドよりも

CanListenOnPort()

のほうが具体的でメソッドの動作をそのまま表している。

2.4 名前に情報を追加する

時間やバイト数のように計測できるものであれば、変数名に単語を入れるといいだろう。

delay => delay_secs
size  => size_mb
limit => max_kbps
angle => degrees_cw

2.5 名前の長さを決める

長期休暇よりも短期でどこかへ行くときのほうが荷物は少ないはずだ。それと同じで識別子の「スコープ」(その名前が「見える」コードの行数)が小さければ、多くの情報を詰め込む必要はない。すべての情報(変数の型・初期値・破棄方法など)が見えるので、変数の名前は短くていい。

頭文字と省略形

プロジェクト固有の省略形はダメだ。

新しいチームメイトはその名前の意味を理解できるだろうか? 理解できるなら問題ない。

evaluation => eval
document   => doc
string     => str

プログラマは普段から使うから、新しいチームメイトも formatStr() の意味は理解できる。

不要な単語を投げ捨てる

convertToString() => toString()
doServeLoop()     => serveLoop()

に変えても明確さは同じ。


結構カジュアルというか、口語的に内容が展開されているのですがそれが読みやすいです。
また次回覚えておきたいことをメモしていきたいと思います。