今回はエンジニアにとってバイブル的存在(らしい)リーダブルコードを読了しましたので、学んだことをメモっていきたいと思います。
はじめに
事前情報として、当書籍を読んだ当時の僕のスペックを。
学生時代含めて、C言語5年、python2年触ってきましたが、プログラム業務経験はほとんどありません
未経験業界へ転職し、新しい言語を研修で学んだ直後
また、当記事はあくまで僕個人の感想ですので、
内容と全然違う…
本当はこういう意味なのに…
といったこともあるかもしれませんが、その時はコメント等で暖かく教えて下さい。
学んだこと
短いコードが正しいわけではない
僕の大きな間違いの一つが、短いコードで書けることが賢いわけではないという事実でした。
個人で開発をしていると、 少ないコードで表現できるめっちゃ良いロジックを思いつくと、嬉々として書いて満足することが多くありました。
しかしこれは大きな間違いでした。 それが読みやすければよいですが、条件文が煩雑になっていたり、ぱっと見何をしているのか分からなくなってしまっていることが多く、 後から読んだときや引き継ぐとき、共同で開発するときに、読み解くための無駄な 工数 が発生してしまいます。
多少行数が増えても処理速度は変わりません。 人が見ても、何をしているのかひと目でわかるようなコードにする方が、コードを短くするよりも、優秀なロジックを考えるよりも格段に大事です。
恥ずかしながら、「見た目(だけ)がスッキリしている方が良い。ロジックが分からないなんてことはないだろう」というスタンスでコードを書いてしまっていたので、 目から鱗 でした。
早く関数から返すこと
「returnは流れがわからなくなるから、ループ内や関数の途中で使用してはならない」 学生時代、僕の場合はこう習ってきましたが、これも大きな間違いでした。
条件分岐やループが多くなってくると、読む際に頭で考え操作なければならない変数が増えていきます。 そうなるとコードを読み解く速度が遅くなっていき、不具合や無駄な 工数 を発生させる原因となります。
特に、仕様変更や追加でネストが深くなる傾向にあると筆者は述べています。 そうならないように、一歩下がって全体をみて、必要であれば浅くなるよう作り替える方が、コードを残して追加変更していくよりもずっと良いと筆者は述べています。
良いコードとは、はやく関数やループからreturnで返してあげて、頭で考える変数の量を減らしてあげる工夫がされているそうです。
例えば
1
2
3
4
5
6
7
8
9
10
11
12
13
$flag = true;
foreach ($array as $value) {
if ($value >= 5) {
$flag = false;
} elseif (is_null($value)) {
$flag = false;
} elseif ...
}
if ($flag === true) {
return true;
} else {
return false;
}
といったコードは、
1
2
3
4
5
6
7
8
foreach ($array as $value) {
if ($value >= 5) {
return false;
} elseif (is_null($value)) {
return false;
} elseif ...
}
return true;
とします $flag
という余分な変数を減らすことができるだけでなく、foreach
文で本当にしたい処理がわかりやすくなります。
これを覚えてからは、実際の業務でも意識して取り入れるようにしています。
説明変数、要約変数という考え方
説明変数と要約変数という考え方も、なるほどと思いました。 知る前からなんとなく説明変数っぽいものを使えてはいましたが、概念を知っているのと知らないのとでは変数名の付け方や読みやすさが全然違うなと感じています。
説明変数;長い式を意味ごとに分割して、意味や説明を表現するための変数
要約変数;長い条件文の判定を表現するための変数
例を挙げてみます。
1
if split(split(data, ',')[0], ':')[1] == "hoge":
これだと、左辺が何を意味するのか、パッと分からないですよね。 次のように、columnとusernameという説明変数を用意することで、ifの条件文がわかりやすくなりました。
1
2
3
column = split(data, ',');
username = split(split(column[0], ':')[1];
if username == "hoge":
実際に開発業務に取り掛かって思ったのが、 「改修する際は意外と対象のコードピンポイントでしか見ない」ということです。 上の方に定義が書いてあったりしますが、そこまで戻らなくてもわかるよう、説明変数を用意してあげるのが親切かつわかりやすいということを学びました。
また、要約変数を用いた例を挙げると、
1
2
3
4
if ($request->oauth_token == $token[oauth_token]) {
}
if ($request->oauth_token != $token[oauth_token]) {
}
裏返しただけの条件文ですが、長いため毎回読み込まないといけません(これくらいだったら問題ないかもしれませんが)。 要約変数を先頭に用意することで、if文の条件式をパッと見でわかるようになります。
1
2
3
4
5
$is_oauth_token = ($request->oauth_token == $token[oauth_token]);
if ($is_oauth_token) {
}
if (!$is_oauth_token) {
}
$is_oauth_token
を用意することで、条件式で何をしたいのかが分かりやすくなります。
変数名の付け方
まとめ
筆者は一貫して、
人が見てわかりやすいコード
頭で考える変数量を最小にするコード
がリーダブルコード(読みやすい優れたコード)として、そのようなコードが書けるよういろんなテクニックを教えてくれました。 個人開発しているとどうしても独りよがりなコードになりがちですし、 共同開発できるように、コードの癖を矯正するのに非常に良い一冊と感じました。
あとは脱初心者目指して実践あるのみ。