リーダブルコード第3章「誤解されない名前」の輪読会をした備忘録と感想

毎週月曜日に「リーダブルコード」の輪読会を行っています。 今回は3章を終えた感想や備備忘録を書きます。 3章は、名前が「他の意味と間違えられることはないだろうか?」というテーマです。

誤解されない名前

英語がネイティブでない自分にとって、英語のニュアンスを掴むことは難しいです。 たとえばfilterという単語。 辞書をひくと

〈水・ガスなど〉をろ過する, こしてきれいにする; …をろ過して取り除く; 〈光・音など〉の一部を除去[カット]する, 遮断する; 〈不要・有害なもの〉を除去する; 〈人・物〉を取捨選択する

とありますが、この説明を見ると「除外する」という意味がありそうです。 しかし、phparray_filterTRUEのものを配列で返します。 つまり、「選択をする」という意味をもっています。

このように英語の単語は曖昧なニュアンスを含んでいるので、「選択をする」という意味で名前をつけるならばselect()とすることで、誤解のない名前になります。

lengthという単語も、どういう使われ方をしているかで名前を付けます。 最大の長さという意味で使うのであればmax_lengthとします。 さらにlengthという単語自体も曖昧で、「バイト数」なのか「文字数」なのか、はたまた「単語数」なのか? 文字数という意味で使うのであればmax_charとするのが良さそうです。

正直、ここまでは考えていなかったです・・。 いろんな解釈ができる名前は避け、明確な名前をつけましょう。

限界値と範囲と包含/排他的範囲

「以上」か「より大きい」か?「以下」か「未満」か? この違いで起こるエラーを「off_by_oneエラー」というようです。

off_by_oneエラーを避けるには「>=」と「>」に注意するというのもありますが、誤解されない名前をつけることでも避けることができます。 商品カートの上限値であればCART_TOO_BIG_LIMITという名前ではなく、限界値を含むMAX_ITEMS_IN_CARTとつけるべきです。

範囲を指定するときはfirstとlastを使うというのは馴染みが深いです。

print integer_range(start=2, stop=4)

「2, 3」ではなく「2, 3, 4」を表示したいのであれば、(start, stop)ではなく(first, last)を使うというものです。

包含/排他的範囲にはbeginとendを使う。

PrintEventsInRange(“OTC 16 12:00am”, “OTC 17 12:00am”)
PrintEventsInRange(“OTC 16 12:00am”, “OTC 16 11:59.9999pm”)

うーん。。こちらは馴染みがないですが、意識しておかないとついstartとかlastとかを使ってしまいそうですね。

ブール値の名前

ブール値の頭にisやhasをつけるのもすでにできていることで、とくに議論はなかったです。 ブール値では否定形は避けるというのも納得です。というか書いててわかりにくいですよね。

× bool disable_ssl = false;
○ bool use_ssl = true;

この項目は共感しやすかったです。

ユーザの期待に合わせる

getsizeは「軽量アクセサ」が期待されるというのは、今までまったく意識してこなかったです。 ふつうにDBから取得するときはgetくらいの意識しかなかったですね。 全件取得のときとかは気をつけないとですね。

まだまだ、馴染みがないことも多く、経験の無さを実感します。 とくにユーザが期待することとかは、周りの同僚も意識していなく、結局はチーム内で共通の認識があれば良いねという結論に達しました。 ただ、このような認識の違いがあるということはしっかり覚えておかないと、別のプロジェクトに行ったとき苦労しそうだなと思いました。