エンジニアなりたてくらいに読んだっきりだったので、転職もしたことだし久しぶりにリーダブルコードを読み返しました。自分がまとめておいて繰り返し読み返した方が良いなと思った部分をまとめます。
読みやすさとはなにか
他の人が最短で理解できるようなコードを書かなければいけない
他の人に限らず、自分で書いたコードを数ヶ月後に見る自分に対してもこうでないといけないですよね。
関数名や変数名には適切な情報を含んだ名前をつける
名前を正しく明確に表現しないと他者がコードを読んだ時に素早く理解することが難しい。
明確な単語を使う、汎用的・一時的な名前は避ける、具体的な名前を使って物事を詳細に説明する、変数名に大切な情報を追加する。これを英文法的に正しく命名するのがとても大事。
例えば変数名でそれがBool値を持っているものならisXXX
とか、ユーザーのデータでとある情報を持っているならhasXXX
とか。過去形や受動態なども気をつけて命名することで他者の理解が早まる。
読み手の立場になって考え、質問されそうな箇所にコメントを正確・簡潔に残す
プロジェクトに入りたての人や、機能開発でコードを書いたプルリクエストのレビュアーなど、コードを読んでいて質問やツッコミが入ることは必ずある。そもそもその質問・ツッコミをすることがなければ不必要な時間を使わなくてよくなる。そのために自分が実装し終わったあとに読み手の立場になって考え、これらを書くと良さそう。
- なぜこうやって書いたのかという意図
- コードの欠陥部分に
TOTO:
,FIXME:
,HACK:
などアノテーションを書く - ファイルやクラス名でここは何をやっているかの要約
- 他の人が読むとわかりにくそうな(質問・ツッコミが入りそうな)箇所の詳細な動き
逆にコード読めばわかるでしょうというところにはコメントを書かない。
巨大な式を分割するために説明変数・要約変数を使う
説明変数
式を簡単にするためにはそのまま使うのではなく、式を説明する変数を作成する
こういうコードがあった場合
// php
if (trim(explode($line, ':')[0]) === 'root') {
}
説明変数を使うと
// php
$username = trim(explode($line, ':')[0]);
if ( $username === 'root') {
}
こちらのほうが文字列操作をして代入している$username
がroot
かどうかというのを比較しているのがひと目でわかるので理解しやすくなる。
要約変数
式を説明する変数が必要ない場合でも式を変数に代入しておくと、大きなコードを通作分割でき、管理や把握を簡単にすることができる(要約変数)。
こういうコードがあった場合
// php
if (Auth::user->id === $article->owner->id) {
// このユーザーは編集できる
}
このような要約変数にすれば、概念をもっと明確に表現ができる
// php
$userHasDocument = (Auth::user->id === $article->owner->id);
if ($userHasDocument) {
// このユーザーは編集できる
}
1行で理解するのに時間がかかるコードより、2,3行でサッと理解できるコードの方がみんなハッピーになれる。
でも、かといってなんでもかんでも変数にするのも邪悪になるのでしっかりと意味のある変数になるかを見極めて作る。
関数・メソッドは1つの処理だけにしてシンプルにする
関数やメソッドを実装しているときに気づくと、あの処理も追加しないとってなり複数の処理をしてしまうことがある。
そうならないように、基本的に1つのことを処理するものとして複数の処理が必要になったら切り分けたり、汎用的なコードにしたりして簡素にする。
そして短いコードをこころがける。コードが小さければ小さいほど、ファイルサイズもコードにかける労力も小さくなる。これが大きくなればなるほどメンテナンスにかける時間や労力が大きくなる。
おわりに
久しぶりに読んでみましたが、いつ読んでも気づきがある本だなと思います。さすが名著。
読んでいると当たり前だよなと思う部分もあるけど、それを100%コードに落とし込めているかと言われるかと微妙なところです。それに書き方の癖を矯正してリーダブルなコードを書くには、日頃のコーディングから意識し続ける必要がありますね。なので意識しつつ定期的に読み返していこうと思います。