『リーダブルコード』 第8章 巨大な式を分割する

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

鍵となる考え:巨大な式は飲み込みやすい大きさに分割する。

説明変数

if (trim(explode(':', $line)[0]) === "root")

は、

$username = trim(explode(':', $line)[0]);
if ($username === "root")

と分割することができる。

要約変数

if (request.user.id == document.owner_id) { // ユーザはこの文書を編集できる
}
...
if (request.user.id != document.owner_id) { // 文書は読み取り専用
}

は、

final boolean user_owns_document = (request.user.id == document.owner_id);
if (user_owns_document) {
// ユーザはこの文書を編集できる
}
...
if (!user_owns_document) { // 文書は読み取り専用
}

とすれば、より明確に意図を表現できる。

ド・モルガンの法則を使う

  1. not (a or b or c) ⇔ (not a) and (not b) and (not c)
  2. not (a and b and c) ⇔ (not a) or (not b) or (not c)
if (!(file_exists && !is_protected)) Error("Sorry, could not read file.");

は、

if (!file_exists || is_protected) Error("Sorry, could not read file.");

と書き直せる。

短絡評価の悪用

assert((!(bucket = FindBucket(key))) || !bucket->IsOccupied());

は、ひと目では処理の意図がつかめない。

bucket = FindBucket(key);
if (bucket != NULL) assert(!bucket->IsOccupied());

ならすぐに分かる。

どうして 1 行で書こうとしたのだろう? そのときは「オレは頭がいい」と思っていたのだ。ロジックを簡潔なコードに落とし込むことに一種の喜びを感じていた。 この気持ちはみんなにも理解してもらえると思う。まるでパズルを解いているような感じだ。仕事は楽しくやりたいからね。問題は、これがコードのスピードバンプになっていたことだ。

鍵となる考え:「頭がいい」コードに気を付ける。あとで他の人がコードを読むときにわかりにくくなる。

複雑なロジックと格闘する

驚くほど複雑なロジックのコードになってしまった。こういう場合には、もっと簡単な方法があるのだ。

「反対」から問題を解決してみるという手がある。

コメントを残す

コメントを残す