プログラマーの入門書!リーダブルコード
本記事は、筆者が学習していく中で、
「この考え、大事だな」と思ったものを記事にしたものです。
皆さんの学習の助けになれば幸いです。
本日のトピック
名前に情報を詰め込む
例えば、僕が皆さんに植物を紹介する際に、
「この植物はキケンです」と言われるのと、
「この植物は人食い植物という異名があり、キケンです」と言われるのだったらどっちのほうが、キケンだと伝わりますか
後者のほうが、危険度が高いと思いますよね。こんな変数名にも抽象的な名前を与えるのではなく、より具体的な名前をつけましょう。
その単語は明瞭か?
上記では「具体的な名前をつけましょう」と言いましたが、具体的な名前をつける上での注意点についてリーダブルコードでは下記のように言及されている。
「名前に情報を詰め込む」には、明確な単語を選ばなければいけない。「空虚な」単語は避けるべきだ。(p10参照)
例えば、「get」はあまり明瞭な単語ではない。
GetPage(url) という関数が作られた際、「get」という単語からは何も伝わってこない。
この関数は、ページをどこから持ってくるのだろう?ローカルキャッシュから?それともデータベースから?インターネットから?
インターネットから取ってくるのであれば、DownloadやFetchなどの方が適切である。 (p10参照)
この様に、getという名称は、一見わかりやすいように見えて、本質的には理解しづらい。なので、変数に用いる動詞は、特により具体的な内容する必要がある。
汎用的な名前を避ける
皆さん、寿命が短い変数にとりあえずtmpとかつけがちじゃないですか?
例えば、
与えられた数列に1を足してその合計値を表示する場合
number_list = [1,2,3,4,5,6,7,8,9]
table = []
for i in number_list:
tmp = i + 1
table.append(tmp)
print(sum(table))
#54
こんな感じでコードを書くことができます。これくらいなら問題がないのですが、コードが長くなると tmp が何のための変数でtableが何のテーブルかわからなくなることがよくあります。なので、今回の場合だったら、
tmp → plusOne
table → plusOne_List
などして、より明瞭な名前をつけるようにしましょう。
(どうしてもtmpを使いたい場合は、短いコード内で役割を終える場合のみに使いましょう!)
その名称に誤解は生まれないか?
例えば、片方の値が正しい値で、もう一方が文字化けした値を持つ、2列からなるcsvファイルがあったとする。
このcsvファイルのうち、正しい値を持つデータだけを取得する関数を作る。
その際、こんな関数が実行されていたら、読み手はなんて思うだろうか?
getRightData()
多くの人が、
get → 取得する
right → 正しい
data → データ
と考え、「この関数は、文字化けしていない数字のデータを取得するんだな」と思っただろう。
しかし、初めてこの関数を見た人は、
right → 右
と考え、「csvファイルの右の列のデータを取得しているのかな?」と思うかもしれない。
上記のように、同じ英単語でも、全く違う意味を持つ英単語がある。そのような英単語を使う場合は、もっと名前に情報を付加するか、コメントを残すなどをして、誤解を生まないようにしなければならない。
その他誤解を生みやすい英単語
run
①走る、駆ける、逃げる ②経営する ③立候補する
left
①出発した、去った ②左
などなど
変数や関数に名前をつけるときは、今一度立ち止まって名前を考える必要がある。
最後に
本日は、リーダブルコードの前半部分で重要だと思ったところを中心に解説させていただきました。Atcoderをやっていると、変数の名称が適当になりがちですが、チーム開発では、共同開発者にいかに読みやすいコードを書くかが重要です。自分もまだまだ未熟者ですが、これからもPythonやプログラミングについて記事を書いていくので、【いいね!】を何卒よろしくおねがいします!!