ifにまつわるエトセトラ
作成日時:2024-09-22
更新日時:2024-09-22
if文に関する個人的な考え。
if文は消せ
「ある」のがいけない!!!
「ある」のがいけない!!!!
「ドカ食いダイスキ!もちづきさん」の第4話より
「ある」のがいけない。if文は消せ。
if文があると、その条件を脳内メモリに保存して処理を読んでいかなければならない。
ネストが発生するせいで可読性が下がり、認知負荷が発生する。
多態性を使用することで、if文を消すことができる。(GitHubにアップした参考ソース)
かつ上記ソースのコメントにあるように、変更容易性/可読性を上げることができる。
「ある」のがいけない。if文は消せ。
if文はシンプルであるべき
if文は消せとは言っても、基本的には消せない。
if文を書くことを避けることはできない。
なので、if文は可能な限りシンプルでなければならない。
- ガード節を使え
- 条件文は分かりやすく
- ネストは浅く
- 判断の為に使え。振る舞いの分岐に使うな。
ガード節を使え
String bad(int kbn) {
String rtn = null;
if (kbn == 1) {
rtn = "1です";
} else if (kbn == 2) {
rtn = "2です";
} else {
rtn = "それ以外です";
}
return rtn;
}
String good(int kbn) {
if (kbn == 1) return "1です";
if (kbn == 2) return "2です";
return "それ以外です";
}
早期にreturnをすることで、後の処理は考えないで済む。
かつ簡潔で可読性が上がる。
条件文は分かりやすく
// 1.なんで括弧で囲んだ?
if (!(value1 == null)) {}
// 2.二重否定はやめろ
if (!isInvalid) {}
// 3.括弧の中にどれだけ書く気だ?
if (cond1 && cond2 && cond3 || cond4) {}
ふざけんな。シンプルであれ。
1は「!=」を使えばいい。わざわざ反転するのは罠かよ。
2は二重否定をやめろ。
3は別途説明変数を作るか、メソッド抽出してそれを呼べ。
// 1
if (value1 != null) {}
// 2
if (isValid) {}
// 3
if (canExecute()) {}
ド・モルガンの法則
否定が絡む条件文は、ド・モルガンの法則を使えば単純化できる可能性がある。
¬(P∨Q)=¬P∧¬Q
¬(P∧Q)=¬P∨¬Q
コードにするとこう。
!(P || Q) = !P && !Q
!(P && Q) = !P || !Q
三項演算子
KISS原則とPIE原則を順守しているなら使ってもよい。
守れないならば使うな。
// パターン1
// good:シンプルでよろしい
var value = condition ? "A" : "B";
// パターン2
// bad:条件文が長くて見づらい
var value = condition1 && condition2 && condition3 && condition4... ? "A" : "B";
// improvement:あえて条件を変数に格納し、変数名で内容を説明する(説明変数)
// もしくは判定する関数を作成して呼ぶ。
boolean isXXX = condition1 && condition2 && condition3 && condition4...;
var value = isXXX ? "A" : "B";
// パターン3
// bad:なめてんのか
var value = condition1 && condition2 && condition3 && condition4... ? なんかメソッドチェインで横に滅茶苦茶長い奴1() : なんかメソッドチェインで横に滅茶苦茶長い奴2();
// improvement:関数作って呼べ。
var value = isXXX ? funcTrue() : funcFalse();
// もしくは、改行しとけ
var value = isXXX
? なんかメソッドチェインで横に滅茶苦茶長い奴1()
: なんかメソッドチェインで横に滅茶苦茶長い奴2()