【リーダブルコード】良いコードを書くための原則【中級編】
前回の記事では、主にコードの表面的なところについて解説しました。
そして、今回はループやロジックなどのもう少し深い内容について書いていきます。
条件分とループ文を正しく書く
1比較引数の並び順に気をつける
これは人によって好みが分かれるかと思いますが、この本では値を比較する時は左が比較対象で変わりやすい値、右が元になる値で変わらないを入れることを推奨しています。
例えば
if(num > 10){}
といった感じ。
これは人によってどっちが良いとかは意見が分かれると思いますが、確かにチームごとで左右にどんな値を入れるか決めておいた方が読みやすくはなりそうです。
2If/elseの並び順を考える
条件文を書くときは次の3つを意識すると良いです。
- 条件は否定形よりも肯定系を使う
人間は、「〜じゃない」という条件よりも「〜である」という条件の方がすぐに判断できるので。
- 単純な条件を先に書く
その方が流れを理解しやすいので。
- 目立つ条件を前に置く
人間は目立つ条件に意識を奪われやすいので、早めに処理すべき。
この3つを意識するだけでも、条件文がかなり見やすくなるかと思います。
3行数よりも理解のしやすさを重視する
たまに「行数が短いコードの方が優れている」という勘違いをしているプログラマーがいます。
実際は短いことよりも、理解しやすいことの方が何倍も価値があります。
例えば、
//短いけど分かりづらい
let val = a && b && c && d.test ? d : e
//多少長いけど分かりやすい
let val = a
if(b){
val = b
}else if(c){
val = c
}else if(d.test){
val = d
}else {
val = e
}
ちょっとこれは例が悪いかもしれませんが、とにかく「短いコード=良いコード」というのは、必ずしも当てはまらないということだけを意識してもらえればと。
4ネストを浅くする
言わなくても分かっているかと思いますが、なるべくネストは浅くするようにしましょう。
ネストが深いとそれだけ変数の状態など意識することが増えるので。
なので、ネストにする必要がないところはネストさせないようにしましょう。
そして、ネストが深くなってきたらネストを浅くする方法は無いか考えてみましょう。
5処理を追いやすいようにする
コード全体の処理を追いやすいようにするのも大事です。
例えば、まとめて同じファイルで再エクスポートするなど。
この点で言うと、ライブラリーを使いすぎると内部でどんな処理が行われいるのかが追いにくくなるので、使い過ぎるのは良くないのかもしれないですね。
巨大な式を分割する
当たり前ですが、関数などは短い方が理解しやすいです。
人間は一度に3,4つのことしか覚えてられれないので、把握するべき値が増えるとそれだけ理解するのが難しくなってしまうからです。
なので、なるべく短いコードを書くように意識すると良いです。
そして、コードを短くする上で役に立つ考え方は以下の通りです。
1変数を活用する
const [ firstDateIsSunday, setFirstDateIsSunday ] = useState(false)
// ダメな例
if (day.day() === 0) {
setFirstDateIsSunday(true)
} else {
setFirstDateIsSunday(false)
}
// 良い例
const isSunday = day.day === 0
setFirstDateIsSunday(isSunday)
このように変数を使って、短く分かりやすくできる場合は積極的に使っていきましょう。
2ド・モルガンの法則
多くの人が高校数学で習っているかと思います。
この法則を使うことでコードをさらに分かりやすく書けるようになれます。
具体的にド・モルガンの法則とは
not(a) and not(b) and not(c) <=> not(a or b or c)
not(a) or not(b) or not(c) <=> not(a and b and c)
という感じです。
要は、notで括ってandとorを入れ替えると覚えればOKです。
どう見ても右側の方が見やすいですよね?
このようにこの法則を使うことで、より分かりやすいコードを書けるようになるのです。
3より短い方法を探す
処理があまりにも長く複雑になってきたら、一旦立ち止まって考えるべきです。
きっともっと上手くやる方法はあります。
もしここで数分立ち止まって考えることをせずに分かりにくい実装を続けると、他の人の時間を奪うことになってしまいます。
なので、「ちょっと分かりづらくなってきたな。。」と思ったら少し立ち止まって考えましょう。
4共通化する
プログラミングの界隈では、DRYという言葉があります。
これは、Don’t Repeat Yourselfの略で、要は「繰り返し同じコードを書くな」ということです。
なので、同じことを何度も書いてあるところがあれば、そこを関数にしたり変数に入れたりするべきです。
そうすることで、同じコードを何度も書かなくて済みますし、改修も楽にすることができます。
5関数化する
これも前と同じような考え方ですが、コードの中で同じような処理をする関数があった場合、それを共通化できないか考えてみるのも大事です。
例えば極端な例ですが、
実際の処理は同じなのに引数の数だけが違う関数があった場合は、言語にもよると思いますが1つの関数にまとめることが可能です。
また、似たような処理をしている関数があった場合は、その処理を抽象化して1つの関数として統合することもできます。
変数を正しく扱う
プログラミングにおいて変数の扱いというのはとても大事です。
というのも、変数というのはコードの中で頻繁に多くの種類が使われています。
なので、変数の扱い方が下手だとかなり読みにくいコードになってしまうのです。
では、実際に変数をどのように扱っていけば良いのかということを具体的に書いていきます。
1変数の数を減らす
変数の数は少なくした方が良いです。
さらに正確に言えば不要な変数は減らすべきです。
例えば、先述した通り変数を使って処理を分かりやすくすることもできます。
けれど、一度しか使わない処理を一々変数に入れる必要ないです。
例えば、以下のようなコードがあったとします。
const now = new Date();
obj.createdDate = now;
この場合、nowを複数回使うのならば、変数に現在の時間を入れるというのは良いアイデアですが、一回しか使わない場合は、わざわざ変数に入れる必要がありません。
そして、変数が無駄に多いとコードが読みにくくなります。
なので、このような無駄な変数は積極的に削除していくべきです。
2変数のスコープを小さくする
「グローバル変数を避けろ」というのは、恐らく多くの人が聞いたことのあるアドバイスかと思います。
これは、意図しない変数の変更を避けるためです。
なので、この意図しない変数の変更を避けるためにも変数のスコープは小さくするべきです。
変数を定義する時は、もっとこの変数のスコープを小さくできないかを常に考えるべきです。
そうすることで、意図しないバグを防ぐことにもつながります。
3変数の変更を減らす
変数の変更はなるべく少なくするべきです。
というのも、変更が多い変数は現時点で何が入っているかが把握しづらいからです。
なので、今度からは変数をなるべく変更しないようなコードを心がけると良いです。
例えば、JavaScriptを書いてるのであれば、letを使っているところをconstに変更できないか考えてみると良いです。
おわりに
前回の記事では、主にコードの表面的なことについて書きました。
今回の記事では、さらに踏み込んでコードのロジック等について書きました。
今回紹介したことを意識すれば、さらに読みやすいコードが書けるようになるかと思います。
次回は、最後にさらにコードを大きく変更するような方法について書いていきます。
最後に宣伝です。
0からエンジニアになるためのノウハウをブログで発信しています。
また、YouTubeでの動画解説も始めました。
YouTubeのvideoIDが不正ですインスタの発信も細々とやっています。
興味がある方は、ぜひリンクをクリックして確認してみてください!
おわり
Discussion