リーダブルコードというのは初歩的な話になります。
だけど、学んだことでちょっと疑問に思いながら書いていたコードを自信をもって書くことができたり、勘違いしていた部分に気づけたので、学習の中で学んだことをいくつかピックアップしてメモ書き程度に共有したいと思います。
コメントについて
コメントは書くべきか、コードをまとめてしまっていいのか
コードは短い方がいいですが、1行増やしたり、コメントをつけたりすることで理解できるまでにかかる時間が短縮できるのであれば、そちらの方が良いという話です。理解のしやすさという点に重きはおくべきなんですね。
コメントに関しては、案件によって書き方が指定されるとは思いますが、上記のことは意識したほうが良さそうです。
曖昧を避け正確を重視しよう
「行数を返す」よりも「改行文字('\n')を数える」の方が伝わる情報は増えるというように、正確に単純に情報密度の高い言葉や表現を使用したほうがよいです。
コードの意図であったり、質問されそうなことはコメントとして残そう
曖昧さとの線引きが難しく感じますが、意図や要約コメントを簡単に正確に記載しましょう。
名前について
ループインテレータを分かりやすく
ループインテレータが複数ある場合は、説明的な名前(club_i, members_i, users_iなど)にすることで明確さを付与し、バグの発見、防止に役に立ちます。
単位をいれよう
時間やバイト数のように計算できるものであれば、変数名に単位を入れた方が良い。(elapsed → elapsed_ms)
制御フローについて
ブロックの並び順を意識しよう
・条件は否定形よりも肯定形を使う。
・単純な条件を先に書く。
・関心を引く条件や目立つ条件を先に書く。
(否定形の条件であっても単純で関心や注意を引く場合もあるので、その場合はそれを先に処理する。)
三項演算子の使い方
基本的にはif/else文を使うようにし、三項演算子はそれによって簡潔になるときにだけ使うようにした方が良いです。コードの短さよりも理解のしやすさの方が重要。
do/whileループは避けよう
コードは上から下へ読まれるので、条件式が下にあるdo/while文はコードを2回読む手間が発生します。
ほとんどの場合while文で書き直せます。
式の分割について
ド・モルガンの法則を使おう
下記のようにした方が論理式が読みやすくなる場合があります。
if(!(A || B || C)) //下記に変更
if(!A && !B && !C)
if(!(A && B && C)) //下記に変更
if(!A || !B || !C)
変数について
一時変数、中間結果、制御フロー変数は削除する
・複雑な式を分割したり、より明確になったり、複数回使われるといった性質を持たないのであれば、その変数を使う理由はないです。
・中間結果を保持するためだけに使用されている変数は、結果をそのまま使うことで削除できます。
・whileループ内で途中から抜けださないように設定される制御フロー変数は、breakを用いて上手くプログラミングすれば削除できます。breakが使えないようなネストの深いループの場合は、コードを新しい関数に移動させます。