本投稿は TECOTEC Advent Calendar 2020 の11日目の記事です。
はじめまして。こんにちは。ブロックチェーン事業部の近藤と申します。2020年4月に新卒で入社し、フロントエンドエンジニアをしています。
さて、エンジニアなら知らない人はいないとも言われるリーダブルコード。今回はこの本を読む機会がありましたので、この中から印象に残った箇所をまとめて、みなさんに共有していきたいと思います。なお、今回はこの本に書いてあることの中でも、すぐ実践できそうなことを中心に選んでみました。(本書の部で言うとIとII)
読みやすさの基本定理
まず、読みやすいコードとはなにかと言う話です。それは、コードは他人が最短時間で理解できるように書かなければいけないということです。コードが短いからと言って、読みやすいコードとは限らないということです。ここでの「他人」には、自分のコードに見覚えのない将来の自分も含まれます。また、「理解する」とは変更を加えたり、バグを見つけたりできると言う意味合いです。
明確な単語を選ぶ
例えば、「stop()」という名前。これは、もっと明確な名前を付けたほうが良いかもしれません。もし、取り返しができないような操作ならkill()の方が良いですし、後からresume()できるならpause()なんかも選択肢に入ってきます。また、良い名前が見つからないときは類語辞典を活用すると良いと書いてあります。自分も名前を考えるときに迷ってしまうことがあるので、活用していきたいと思います。
ネストを浅くする
ネストは浅くしましょう。ネストの深いコードは、理解しにくいです。シンプルな話です。ネストを浅くするためにはガード節を使い、はやめに返すと良いです。
これだとネストが深くて理解しにくいので。
if (this.SearchInfo.status) { if (this.SearchInfo.status.includes('1')) this.disabled = false } else { this.disabled = true }
このようにして、はやめに返すことで、ネストを一段深くすることができます。
if (!this.SearchInfo.status) { return } if (this.SearchInfo.status.includes('1')) { this.disabled = false } else { this.disabled = true }
※実際に僕の書いたコードがPRレビューで指摘されたものを例として挙げてみました。(本書を読む前の話です。念の為。)
説明変数を活用する
コードが大きくなると、その分理解することが困難になります。巨大な式は飲み込みやすい大きさに分割すると良いです。式を分割する簡単な方法の一つとして、説明変数があります。
これを、
if (line.split(':')[0].strip() == "root"){ ///なんか処理 }
説明変数を挟んで、こう書き換えるとわかりやすいということです。
username = (line.split(':')[0].strip() if (username == "root"){ ///なんか処理 }
※コードは『リーダブルコード』p.100から引用
役に立たない一時変数を削除する
最後になります。先程の説明変数は、式を分割し、説明文のような役割を果たしたため、読みやすくなりました。ただ、コードが読みやすくなるわけでもないのに、使われている変数もあると思います。それを削除することによって式を読みやすくすることが可能です。
now = datetime.datetime.now() root_message.last_view_time = now
※コードは『リーダブルコード』p.112から引用
つまり、ここのnowは使う意味がないという話です。理由としては、 - 複雑な式を分割していない - より明確になっていない。 - 重複コードの削除になっていない などが挙げられます。
つい、一旦変数にいれてしまうというのはやりがちなので、本当に使う必要があるのかどうかをしっかり見極めていきたいですね。
まとめ
以上になります。いかがだったでしょうか?いきなり上記のテクニックをバリバリ活かしていくことは難しいかもしれませんが、少しでも意識することで徐々にきれいなコードがかけるようになり、それが当たり前になっていくのかなと思っています。自分も他人が読みやすいようなコードをかけるように、日々精進していければと思っています。ここまで読んでいただきありがとうございました!
参考文献
- リーダブルコード