この記事について
「リーダブルコード」を読んだ際に、個人的に印象に残ったことを整理してまとめたものです。本書に関しては、多くのまとめ記事があることでしょうし、n番煎じもいいところですが、そういった記事と本記事を読み比べることで何か得られることもあると思い、作成しました。
コードは理解しやすくなければならない
これが本書を通した「大原則」であり、それを達成するための具体的な手法を本書では解説しています。
以下要点
- 明確な単語を選ぶ。その変数や関数などの処理や値などに基づいて、それを正確に表現するような名前をつける。(場合によっては接尾辞や接頭辞をつける)
- 汎用的な名前には、それ相応の理由を用意する。いつも使いがちな「temp」は、その用途が本当に一時的なら構わない。
- 値の範囲指定は、単語で意味を変える。min、max、start、first、begin、endなどをよく理解して使用すること。
- ブール値を持つ変数や関数にはis、can、hasなどの名前を使うとわかりやすい。
- 似たような処理を行うコードは改行などで別々に纏めておく。あるいは一連の処理を一区切りとして、そこまでを改行なしでまとめ、他の一連の処理とは別ブロックにするなど。
- コードからすぐに読み取れる意図はコメントしなくて良い。ただし、その手法を選択した理由があったり、抽象的な操作すぎて何をしているかが明らかでないならコメントをするべき。
- コードは人間の曖昧な思考を、数学的・アルゴリズミックに表現したものである。そのため、プログラムの実際の動きは、一連を通すことで、そのコードの処理したい目的が見えてくる。よって、コメントは時にコードの意図も説明するべきである。
- 制御フローを読みやすくするためには、do/whileを避け、関数から早期に(できるなら)リターンし、if/elseをわかりやすく記述し、ネストを浅くすることなどが有効である。わかりやすくなるなら三項演算子を使っても構わない。
- ロジックが複雑で巨大になってしまったら、それはもっと簡潔に表せるはずだ。
- プログラムの実行を制御する変数、中間結果だけを保持する変数、コードの読みやすさに関係しない変数などは削除する
- 目的を達成するためのコードの中には、目的が複雑であるほど、目的とは無関係なコードが増えてくる。そういったコードは目的の達成には必要だが、そのコードが目的を解決するわけではないので、別な関数などに汎用的に使用できる形で切り分けてしまおう。
- 前述したような無関係なコード(下位問題)は他のプロジェクトでも使えることが多い、そのためにも下位問題は完全に独立した機能として書くことで、多くのプロジェクトの役に立つだろう。
- 誰もが引数が少なくて、事前設定などの面倒なことをする必要のないライブラリが好きだ。だから、キレイじゃないなら自分でラップ関数を作ろう。(ライブラリ使用の際の雑務をこなしてくれる関数など)
- 簡潔で小さなコードを書きたいなら、ライブラリに親しむこと。解決したい問題はライブラリによって提供されているかもしれない。
最後に
本書にはここに書いたこと以上にも様々なテクニックが記述されていました。
また、「コードを小さく保つ」や「コーディングよりもUnixツールボックスを使う」などは、以前に読んだ「Unixという考え方」とも似ており、どこでも似たような考えに行き着くのだなと思いました。