最初に
みなさんこんにちは!佐々木千奈です。
2年目のメンバーからの声掛けで輪読会がはじまりました。
初回に選ばれた本は「リーダブルコード」です。
リレー形式で参加メンバーが少しずつまとめて発表を行っていきます。せっかくなので、ブログにまとめていきます。また、第1回は当社のベテランエンジニアの方も参加して、参加者に様々な意見をして頂きました。
輪読会のはじめは私からでした。早速、リーダブルコードの1~3章についてまとめていきます!
ところで、リーダブルコードの全体像は以下のようになっています。はじめは、リーダブルコードの哲学について説明したあと、コードの見た目などの単純なところからロジック、その他もろもろどんどんディープなところへ進んでいくようです。
それでは、ここからは1~3章の内容についてのまとめを書いていきます。発表の際に利用したスライドはこちらに上げました。
1章 理解しやすいコード
この本を通して理解していくにあたり、1章で紹介されている概念は特に骨となる概念であり、基本の哲学となっている。他の人が最短時間で理解できるようなコードを書くことが最善である。
鍵となる考えはたったの2つ!
- コードは理解しやすくなければいけない
- 読みにくいコードやダメなコードを作らないためには、コードは理解しやすくしなければならない。
- コードは他の人が最短時間で理解できるように書かなければいけない
- 他の人が最短時間で理解できるコード、これは**「読みやすさの基本定理」**となる。
- たとえ自分だけで使うコードで、「他の人」に見せることはないと思っていても、「他の人」というのは自分のコードに見覚えのない6か月後の**「自分自身」**かもしれないので、コードを書くどんな人にもこの目標に取り組む価値がある。
1章まとめ
- 1章は、「コードは他の人が最短時間で理解できるように書かなければいけない」という原則を念頭にいれて、リーダブルコードの内容を参考にして読みやすいコードを書くエンジニアになっていこうというメッセージ!
第1部 表面上の改善
コードの読みやすさを改善させるためにはじめに取り組むのが「表面上の改善」である。適切に名前を選んだり、優れたコメントを書いたり、コードのフォーマットをキレイにしたりといったことは簡単にできるが、コードのすべての行に影響するため、コード全体に大きな改善をもたらすことができる。
2章 名前に情報を詰め込む
この章で大切なことは、変数や関数などは名前を見ただけで様々な情報が分かるように命名する、ということ。
以下に具体的な例やTipsをあげていく。
明確な単語を選ぶ
- getPageという曖昧な単語より、fetchPage()やDownloadPage() などの明確な単語の方が良い
tmpやretvalなどの汎用的な名前を避ける
- 関数の内部でもtmpやretvalなどの空虚な名前ではなく、その物の値についてや変数の目的を表した名前をつける
- 例: 変数を2乗の足し算の結果の格納に使うなら、retvalよりもsum_squaresのほうが◎
具体的な名前を使って、物事を詳細に説明する
- Googleでは使ってはいけないコンストラクタを使えなくするためのマクロを、DISALLOW_EVIL_CONSTRUCTORS(♰許されざるコンストラクタ♰)と名付けていた。
- これでは、許可しないコンストラクタが具体的に分からないので、コピーとアサインを許可しないのであれば、DISALLOW_COPY_AND_ASSIGNのように許可されないコンストラクタを示すために具体的に書くほうがよい。
変数名に大切な情報を追加する
- ms,mbなどの単位や、セキュリティに気を付ける必要があるplaintext_passwordなど、重要な属性は変数名に記録する
スコープの大きな変数には長い名前をつける
- 名前に必要な情報を追加していく中で、名前が長くなってしまってもタブで補完できるので躊躇しない。
- 短いスコープでは短い名前をつけてもOK
大文字やアンダースコアなどに意味を含める
- クラス名はCamelCase、変数名はlower_separatedなど、名前のフォーマットに意味を持たせる
2章まとめ
- 変数や関数などは名前を見ただけで何に使うものかわかるように命名する!!
3章 誤解されない名前
この章で大切なことは、誤解されないような名前を付けること、「これは他の意味と間違えられることはないだろうか?」と何度も自問自答する、ということである。
以下に具体的な例やTipsをあげていく。
filter
- データベースの問い合わせ結果を処理するコードを書いているとする。
- この場合、filter()という名前の関数名より、選択するならselect()、除外するならexclude()とするなどの工夫をして名付けたほうが良い。
Clip(text,length)
- 上記の関数がテキストを切り取って「…」をつける関数だとする。
- 上記のままだとlengthが最後から切り取る文字数なのか最大文字数なのか分からないので、max_charsなどの名前にする。
- length → charにした方が良いのはlengthだとバイト数、文字数、単語数のどれを表すかわからないから。
minとmax
- 最小値・最大値などの限界値にはminとmaxを使う。
包括的(最初から、最後までを含む)範囲の指定にはfirstとlast
- start,stopだとどこで終了するのかわからないので、包括的範囲(最初から最後までを含む)を表す際はfirstとlastを使う
包括 / 排他的(最初から、最後を含まない)範囲の指定にはbeginとend
- 包含 / 排他的範囲(最初は含むが、最後は含まない場合)はbeginとendを使う
- 時間の時によく用いられる
ブール値の名前はtrueとfalseの意味を明確にする
- read_passwordだと曖昧、need_passwordやuser_is_authenticatedなどの名前にしたほうが良い。
- ×disable_ssl よりも、肯定系の◎use_ssl のほうがいい。
ユーザの期待に合わせる
- 一般的な関数名や変数名の使い方に従う。
- 例えば、get() や size() には軽量なメソッドが期待されている。
- 一般的な書き方や表現というのは言語などによって違いもある。
複数の名前を検討する
- • 自分で名前を決定する前に**「本当に大丈夫か?」**と問う。そして、誤解されない名前かどうかを想像してから、名前を決定する
3章まとめ
- 誤解されないような名前をつける。
- 批判的になって考える。
終わりに
今回の輪読会を行った感想として、いくつかのメリットを感じました。3つ簡単に上げさせて頂きます。
1つ目は、これは輪読会の目的であり当たり前のところではありますが、本を読み進めやすくなること。この輪読会の開催が決まってから2週間ですが、今まで読みたいなぁと思って買ったものの1章しか読めていなかった「リーダブルコード」を読み進めることができました。
2つ目は、自分でまとめて話すことにより、理解度が高まったこと。特に今回の本は一つ一つは単純なTipsが挙げられている本なので、ただサラーっと読んだだけでは頭に入りにくそうな部分もある本だと思いました。しかし、何人かの前でまとめて話すためにかみ砕いて話すので、自分の頭の整理にもなりました。自分なりにあまり具体的な例が分からない部分などは参加者に問いかけて意見を頂いたりして、それによってもまた理解を深めることができました。
3つ目は、同じ本のテーマや意見に対して、様々立場からコメントが出て、議論できるところです。私は、この本を読んでいて実際の開発経験の不足も感じましたが、実際に開発をしているエンジニアからまさにそのような命名をしてわかりにくいと指摘されたことがあるよ、といった意見や、リーダブルコードにはこう書いてあるけれど、経験則的には別の方法にしたがっているよ、といったベテランエンジニアの意見が得られました。輪読会をきっかけに様々な意見や知識を共有し合うといった意味でも、良かったと思います。
第一回の輪読会を行った上でのそれぞれのメンバーの感想やメモなどは、このシリーズの第二弾(リーダブルコード4~6章)と共に投稿予定ですので、投稿され次第是非そちらもご覧ください!