「リーダブルコード」を読んでみた
こんにちは。今回は読書感想文を書こうの回です。
6月末頃からちまちまと読み進めていた「リーダブルコード」を大体読み終えたので、アウトプットしてみようと思います。
本書は有名な書籍で、プログラマーなら必読とさえ各方面で言われている程です。学部2年の頃に本書の存在を知ることになったのですが、当初は表紙を見て音楽の書籍か何かかと驚いたのを覚えています。いつか読みたいなと思っていたら、いつの間にか2年経過していました...。
それだけ放置しておきながら、なぜ今更読むことにしたかと言うと、今年の春から晴れて開発アルバイトに採用されたことがきっかけになります。自分以外の人のためにコードを書き、他の開発者の方にもいずれはコードを共有することを考えると、自己流の勝手気ままな書き方のままでは良くないと感じたためです。
前置きが長くなりましたが、本題に入っていきます。
結論
とても勉強になりました。コーディングにおける可読性の向上やロジックの単純化などのためのノウハウがぎゅっと詰まった一冊だと思います。
特に、私はこれまでチーム開発を行った経験がほとんどないため、コーディングの際に「コードは他人にも読んでもらうもの」という意識が欠如していたことを本書を通して痛感しました。
本書は、大きく分けて3部で構成されています。各部ごとに簡単な感想を以下で述べたいと思います。
第Ⅰ部 - 表面上の改善
第Ⅰ部は大きく分けて3つあり、「一つ目が変数の命名」、二つ目が「コードの整然さ」、3つ目が「コメントアウトの役割」lについて解説されています。おそらく3つある部の中で、第Ⅰ部が最もとっつきやすくかつ効果がすぐに出やすいと思います。変数が読み手に誤解を与えないか、抽象的すぎる表現になっていないか、コードが雑然となってしまい読みにくくなっていないかなどを考えてコードを書き直すことが読む前よりも増えました。ソースコードの解説や扱いの注意点などを記したコメントアウトも前より増えたと思います。意識次第で変えていけるはずですから、すぐに取り組みました。ただ、変数命名のセンスは他人の指摘や他人のソースコードの真似などで徐々に養われていくものだと思いますから、焦らずに良い名前がないか模索する姿勢を引き続き保ちたいです。(でも、もっと早い時期に読みたかった...)
第Ⅱ部 - ループとロジックの単純化
第Ⅱ部は大きく分けて3つあり、一つ目が「ifやforなどといった制御フローの改善」、二つ目が「複雑なロジックの単純化」、3つ目が「適切な変数スコープ」となっています。この部では、「ガード節」や「説明変数」、「要約変数」といった概念を初めて知れて目から鱗でした(これも1年か2年の頃に知っておきたかったな...)。if/elseにおけるブロックの並び順や条件に否定文を使わないことも面白かったです。これらを意識していない場合、自分だけがコードを読む場合には問題になることは少なそうですが、他人も読むとなるとロジックの整理に時間を要してしまう恐れがあります。また、一見複雑に思えるロジックでも逆を考えてみればシンプルな条件を用いて書き換えることが可能だという話も良かったです。条件が複数個あり、ifの条件式が大きくなることがたまにありますが、そういった際も所望の条件に対する逆を考えてみて、条件式を単純化できないか考えてみるクセをつけたいですね。
第Ⅲ部 - コードの再構成
第Ⅰ部、第Ⅱ部と比べて、第Ⅲ部はより一層リファクタリングっぽい内容になっています。内容は大きく分けて3つあり、一つ目が「無関係の下位問題の抽出」、「二つ目が複数問題の同時対処を避けたコードの再構成」、「三つ目がロジックの言語化による解決方法の単純化」です。特に役に立ったと実感している無関係の下位問題について触れたいと思います。無関係の下位問題の抽出とは、コードの高レベルの目的を意識することで、下位のレベルのコードはまた別の問題として扱い、新しい別の関数で対処しようといったものです。ここで言うレベルとは難易度を指しているのではなく、問題の階層を指しています。一番大元のタスクを処理する際には、それを構成する中小規模のタスクが関係していると思います。例えば、母親からおつかいを頼まれたことを想定しましょう。このタスクのトップの目的は「スーパーにある所望の食材を母親に届ける」です。ここで、このタスクをもう少し細分化すると、「準備をする」「移動する」、「購入する」、「帰宅する」、「母親に食材を渡す」といった小さいタスクがあげられるかもしれません。こういった風に分けると整理がしやすいですが、大元のタスクである「スーパーにある所望の食材を母親に届ける」のソースコード内に整理をせずズラズラと「買い物袋と財布と自転車の鍵を取る, 靴を履く, 自転車に乗る, ..., 靴を脱ぐ, 買い物袋から出す, 母に声をかける」を記述していては可読性が悪く、大元のタスクに集中できません。こうした問題を切り分ける視点と各種コードを独立させる視点が必要という訳です。この下位問題の抽出には、可読性の向上以外にも恩恵があり、汎用コードとしての再利用、機能の追加やエッジケースの処理などといった面でも役に立つと述べられています。
おわりに
総じて「理解しやすいコード」を意識して書くことに尽きるわけです。
本書は、そのノウハウをケースごとにコード例を用いて解説されており、理解しやすく大変良かったです。充実した内容ですが、全てを念頭に置いてコーディングをしていくのはまだまだ難しそうなので、今後も本書を読み返していきながら徐々に習慣へと変えていきたいです。
本当に良書なので、プログラミングに慣れてきて、より質の高いコードを目指したい方はぜひ購入してみて下さい。
今後も読んだ書籍に関してアウトプットをしていきたいです。それではまた。