リーダブルコードを改めて読み直している。
最初に読んだ時より、身に染みるというか理解の質が高い気がする。
コードはプログラマが何をさせたいか思いを伝える唯一の媒体になるんだな。
はじめに
ループとロジックの単純化
制御フローを読みやすくする
比較の条件
if (score <= 10) { } if (10 > = score) { }
このコードでどちらの方が読みやすいか考えてみると、おそらく上の方が読みやすいと思います。コードをそれぞれ自然言語で説明すると、
// もしscoreが10以下だったら... if (score <= 10) { } // もし10がscore以上だったら... if (10 > = score) { }
となります。文章にしてみればより直感的にわかります。なるべく頭の中のメモリを無駄に消費しないように効率よく理解できるコードを意識するポイントとして条件文は順序を意識すること。
ネストを浅くする
二段、三段と深くまでネストされたコードは当たり前ですが、理解しにくいコードになります。それは、最深部のコードに達するまでにプログラマが頭のメモリ上に積み上げていく情報が増えてしまうからです。 早期リターンを使って、ネストをなるべく浅くなるように心がけましょう。
巨大な式を分割する
変数を使ったり、条件の判定方法を見直し早期リターンなどで巨大に膨れ上がった式を分割することでリーダブルなコードに質を高めます。
下記のように、説明変数となる変数を用意することで、ただのコードから文脈を読み取ることができます。
var authenticatedUser = SecurityManager.CheckUserAuth(user.auth); if (authenticatedUser) { // 認証済みのユーザ }
また、一見複雑になってしまう条件でも、視点を変えることで簡潔になることがあります。例えば、ある範囲内に含まれるかを検査することは、ある範囲内に含まれないかを検査することができればそれ以外を取る、早期リターンを使ってきれいに実装できるかもしれません。
変数と読みやすさ
変数に対して以下の規則を意識する - 邪魔な変数を削除する - 変数のスコープをなるべく小さくする - 一度だけ書きこむ変数を使う
まず、邪魔な変数とは中間結果のみを保持するような変数などが挙げられます。
bool isFound = false; for (var i = 0; i < players.Count; i++) { if (player.IsMaster) { isFound = true; } } if (isFound) { // マスタユーザに対する処理 }
この場合isFound変数はマスタフラグを持っているユーザが見つかったかを保持するだけの変数となっています。これはいわゆる邪魔な変数で下記のように書き直すことで簡潔にできます
for (var i = 0; i < players.Count; i++) { if (player.isMaster) { // マスタユーザに対する処理 break; } }
変数を宣言することで、プログラマはその変数がスコープにあるかぎり頭のメモリ上に配置しておかなければいけません。なるべく頭のメモリの消費量を削減することを意識しましょう。