はじめに
最近「リーダブルコード」を読み返したので、振り返りも兼ねてプログラミングを始めたばかりの人に意識してほしい内容をまとめました。
この記事を読むことで、コーディングの基本をざっくり学ぶことができます。
読者ターゲット
こんな方におすすめです。
- プログラミング歴3年以下の人
- 独学でコードを書いている人
- 「リーダブルコード」に興味のある人
「優れた」コードって何?
「優れた」コードっていったい何だろう?
「リーダブルコード」では、コードを書く上でどんな基準よりも大切なものとして「読みやすさの基本定理」を定義している。
読みやすさの基本定理: コードは他の人が最短時間で理解できるように書かなければいけない。
つまり、「優れた」コードとは、他の人にとって理解しやすいコードだと考えられるんだ。
コードというのは、一度書いたら終わりではない。
他の人が自分のコードを読んだり変更を加えたりするかもしれない。
そのとき、コードが読みにくかったら、内容を理解するだけでも、多くの時間がかかってしまうだろう。
また、「リーダブルコード」に書かれているように、理解しやすくするというのは、他の人のためだけでなく、自分のためでもあるんだ。
「他の人」というのは、自分のコードに見覚えのない6か月後の「君自身」かもしれない。
今後、コードを書くときは、ぜひ「このコードは理解しやすいだろうか?」と自問自答してみてほしい。
名前に情報を詰め込む
プログラムに使われるいい名前とは、変数・関数の値や目的を表すものである。
これまでにこのような名前を使ったことはないだろうか。
function func (v) {
var retval = v * v;
return retval;
}
残念ながら、func
や retval
という名前は、役に立つ情報を含んでいない。
そのため、次のコードのように func
が呼び出されているところを見ても、読み手にはこの1行が何をしているのか全くわからないのだ。
var retval = func(5);
それでは、どうすればいいだろうか。
ずばり、明確な単語を使って、物事を詳細に説明するような名前をつければいいのだ。
なお、プログラミングに使うテキストエディタには「単語補完」機能がついているので、長い名前を入力するのは問題じゃない。
短くてもいい名前をつければ、それだけ多くの情報を伝えることができる。
さっそく関数を修正してみよう。
- function func (v) {
- var retval = v * v;
- return retval;
- }
+ function square (num) {
+ var squared_num = num * num;
+ return squared_num;
+ }
見ての通り、名前を変えただけで、とてもわかりやすくなった。
次に関数が呼び出されているところを見てみよう。
- var retval = func(5);
+ var squared_num = square(5);
驚いたことに、先ほどのコードとは違い、関数の中身を見なくても、この1行が何をしているのか一目で理解することができる。
まさに、名前に情報を詰め込むことで、他の人が理解するまでにかかる時間を短縮しているのだ。
コメントすべきことを知る
「リーダブルコード」では、コメントを書く目的について次のように述べている。
コメントの目的は、書き手の意図を読み手に知らせることである。
ここで注意してほしいのは、何でもかんでもコメントを書けばいいわけではないということだ。
次のコードを見てみよう。
function square (num) {
// num を2乗した結果を squared_num に格納する
var squared_num = num * num;
// 2乗した結果を返す
return squared_num;
}
悲しいことに、このようなコメントにはあまり価値がない。
新しい情報を提供するわけでもなく、コードからすぐにわかることをコメントに書いているからだ。
では、どのような内容をコメントすべきだろうか。
ここで「読みやすさの基本定理」を思い出してほしい。
「読みやすさの基本定理」にあるように、何より大切なのは、他の人が理解するまでにかかる時間を短縮することである。
つまり、コードを読んだ人が「えっ?」と思うところを予想してコメントをつければいいのだ。
例えば、次のような画質を表す変数があるとする。
image_quality = 0.72;
おそらく、この1行を初めて見た読み手は「なんで0.72なんだろう?」と思うはずだ。
それでは、以下のようなコメントがあるとしたらどうだろうか。
image_quality = 0.72; // 0.72ならユーザはファイルサイズと品質の面で妥協できる。
このコメントが1つあるだけで、読み手は立ち止まらずに進むことができるだろう。
このように、読み手の立場になって何が必要になるかを考えることが、価値のあるコメントを書くことにつながっているのだ。
ネストを浅くする
ネストとは、入れ子構造を意味していて、プログラミングにおいては、ある構文の中に別の構文を入れることを指す。
ネストの深いコードは理解しにくい。
例えば、次のコードを見てみよう。
for (int i = 0; i < results.size(); i++) {
if (results[i] != NULL) {
non_null_count++;
if (results[i]->name != "") {
cout << "Considering candidate..." << endl;
...
}
}
}
こちらの例では、for
文の中に if
文があり、さらにその if
文の中に if
文があるという、いわゆるネストの深いコードだ。
このように、ネストが深くなればなるほど、読み手にとって読みにくいコードになってしまう。
それでは、どうすれば解決できるだろうか。
よく使われる方法として、関数の上部で単純な条件を先に処理する「ガード節」がある。
じゃあ、先ほどのコードに「ガード節」を適用してみよう。
for (int i = 0; i < results.size(); i++) {
- if (results[i] != NULL) {
- non_null_count++;
- if (results[i]->name != "") {
- cout << "Considering candidate..." << endl;
- ...
- }
- }
+ if (results[i] == NULL) continue;
+ non_null_count++;
+ if (results[i]->name == "") continue;
+ cout << "Considering candidate..." << endl;
...
}
どうだろう?
ネストが浅くなり、かなり読みやすくなったんじゃないだろうか。
このように、コードを書く際には、if (...) return;
や if (...) continue;
を使って、深いネストを避けるように意識すると、読み手にとって優しいコードになるので、ぜひ試してみてほしい。
おわりに
今回は、プログラミングを始めたばかりの人に意識してほしい内容を紹介しました。
コードを書き続けていると、いろいろな規則や原則に出会い、どう書いていいかわからなくなることがあると思います。
そんなときは、一度「読みやすさの基本定理」に立ち返ってみてください。