Ch.3~4(誤解されない名前&美しさ)|『リーダブルコード』読解メモ #2

f:id:lib-arts:20191013194556p:plain

コーディングにあたっての指針を示しておければということで、『リーダブルコード』を課題本に設定しまとめています。(基本的に本を片手にご確認いただく前提なので、細かいところの記述は省略すると思います。勝手に解釈した上での要約なので、万が一解釈違いは生じていたとしたらご容赦ください。)

O'Reilly Japan - リーダブルコード

#1ではCh.1の『理解しやすいコード』とCh.2の『名前に情報を詰め込む』についてまとめました。

#2では引き続いて、Ch.3の『誤解されない名前』とCh.4の『美しさ』についてまとめていきます。
以下目次になります。
1. Ch.3_誤解されない名前
2. Ch.4_美しさ
3. まとめ

 

1. Ch.3_誤解されない名前(簡単な要約)
Ch.2では名前に情報を詰め込むことについて触れたが、Ch.3では「誤解される名前に気をつける」というまた違った話題について触れる。変数や関数の名付けについては常に「名前が他の意味と間違えられることはないだろうか?」と何度も自問自答すると良い。この際に積極的に「誤解」を探していくことで、変更が必要な曖昧な名前が見つかる。
下記にいくつかの具体的な例についてまとめる。

・filter()
-> データベースの問い合わせ結果を処理するコードを書いていたとして、filter("条件式")としてしまっては、「条件式が成り立つオブジェクト」と、「条件式が成り立たないオブジェクト」の二通りが考えられてしまう。そのため、「選択する」というのであればselect()を、「除外するというのであればexclude()にする方が良い。

・Clip(text,length)
-> 段落の内容を切り抜く関数があったとして、Clip(text,length)を実装していたとする。この際にClipの動作としては「最後からlength文字を削除する(remove)」と「最大length文字まで切り詰める(truncate)」の二つが考えられる。この際にremoveやtruncateを用いたりlengthではなくmax_lengthもっというならmax_charsにする方が文字数を表すにあたって誤解を減らすことができる。

・限界値を含めるときはminとmaxを使う
-> 限界値を考える際にlimitを使うと「未満(限界値を含まない)」なのか「以下(限界値を含む)」なのかがわからない。そのため、限界値を含める以上や以下について考えるならそれぞれmaxとminを用いるようにすると良い。

・範囲を指定するときはfirstとlastを使う
-> 「未満」と「以下」の例はstartとstopにも考えられる。startはstartから始まるので適切な名前であるが、stopは複数の意味に解釈できる。stopの数字を含むか含まないかが曖昧である。これを防ぐにはfirstとlastを用いることで、包含していることを明確にすることができる。

・包含/排他的範囲にはbeginとendを用いる
-> 10月16日に開催されたイベントを全て印字するなどのケースではbegin=10月16日、end=10月17日という表現を使うと良い。とはいえ、endは包含と排他的がややこしいこともあるが、英語においてはより適切な表現がないため、この場合はendを用いると良さそうである。

・ブール値の名前
-> ブール値の変数やブール値を返す関数の名前を選ぶときにはtrueとfalseの意味を明確にしなければならない。例えばread_passwordなどは「パスワードをこれから読み取る必要がある」のか「パスワードをすでに読み取っている」のかが明確でないので「read」は避けるべきである。代わりにneed_passwordやuser_is_authenticatedを用いることが多い。このようにtrueかfalseかの二値で値を表すブール値の変数名については、is、has、can、shouldなどをつけてわかりやすくすることが多い。

・ユーザの期待に合わせる
-> getMean()の実装が、過去のデータを全てイテレートしてその場で計算する実装であったら名前をcomputeMean()に変える方が良い。裏の処理を知らなければ気軽にgetMean()を呼び出してしまうからだ。get()やsize()には軽量なメソッドを期待されていることには注意しておくと良い。

上記などのケースにおいて名前を決める際には複数の候補を検討し、最終的に決める前にそれぞれ長所について話し合うと良い。最善の名前とは誤解されない名前であり、コードを読んでいる人が実装者の意図を正しく理解できるということである。

 

2. Ch.4_美しさ(簡単な要約)
段落の長さ、横幅、記事の順番、表紙など雑誌のレイアウトには多くの考えが詰め込まれている。優れた雑誌というのはページを飛ばして読めるようになっているし、順番に読めるようにもなっている。
同様に優れたソースコードは「目に優しい」ものでなければいけない。Ch.4ではコードを読みやすくするための余白・配置・順序について説明する。具体的にするにあたって普段使っている3つの原則について下記に紹介する。

・読み手が慣れているパターンと一貫性のあるレイアウトを使う
・似ているコードは似ているように見せる
・関連するコードをまとめてブロックにする

まず、美しさが大切な理由としては、見た目が美しいコードの方が明らかに使いやすいからである。プログラミングの時間のほとんどはコードを読む時間なので、ざっと流し読みすることができるなら誰にとっても使いやすいコードと言える。以下、コードを読みやすくするための工夫についてまとめていく。

・一貫性のある簡潔な改行位置
-> 横幅80文字などに合わせるために改行することで、コードの「シルエット」が変になると一貫性が読み取りづらくなり混乱が生じやすい。したがって、改行位置についてはある程度一貫性のある形にすると良い。

・メソッドを使った整列
-> 本文中の例ではテストコードなどを記述するにあたって、assertやerrorが何度も登場するが、減りパーメソッドを用いることで重複を防ぎコードを簡潔にしている。また、この際にコードの「見た目を良くする」ことがコードの構造の改善になっていることに注意しておくと良い。

・縦の線をまっすぐにする
-> Pythonなどではifやfor文の中は統一してインデントを行うが、変数の定義やメソッドの利用などにおいてもこちらは同様である。縦の線が「視覚的な手すり」に慣れば読み流しが楽にできるようになる。「似ているコードは似ているように見せる」と良い。

・一貫性と意味のある並び
-> どんな順番で並べても問題ないものについてはランダムに並べるのではなく意味のある順番に並べると良い。例えば「重要度順に並べる」やアルファベット順に並べるなどである。

・宣言をブロックにまとめる
-> 人間の脳はグループや階層を1つの単位として考える。コードの概要を素早く把握してもらうには、このような「単位」を作れば良い。ある程度コード行が増えるとしてもグループに分けることで、読みやすさを意識すると良いケースが多い。

・コードを「段落」に分割する
-> 文章は複数の段落に分割されている。これにより、「似ている考えをグループにまとめて他の考えとわけ」、「視覚的な踏み石を提供し」、「段落単位で移動する」ことができるようになる。これと同じようにコードも「段落」に分けるべきである。

・個人的な好みと一貫性
-> この辺はどちらが正しいかというよりもある程度はプロジェクトの規約に従うと良い。もちろん言語もコーディング規約はある程度参考にした方が良い。


3. まとめ
#2ではCh.3の『誤解されない名前』とCh.4の『美しさ』について取り扱いました。Ch.3の誤解されない名前を使うというのは名付けの際に意識しておくと良さそうでした。またCh.4の読みやすさを意識するというのは普段意識しているものの違った視点もしれて面白い内容でした。
#3ではCh.5の『コメントすべきことを知る』とCh.6の『コメントは正確で簡潔に』についてまとめていきます。