構造による条件分岐にはswitch文を使う
(if文でも良いです)
View層やUseCase層といった上位の層では、登場する条件分岐が構造によるものが殆どになる
ここで、「構造による条件分岐」と言っているのは、
type Item = { type: 'single'; ...} | { type: 'double'; ...}のような構造に対して、if (item.type === 'single')のように条件分岐させること
代数的に作られた構造に対する条件分岐
逆に、構造的でない条件分岐というのは、
if (count > 0)みたいなやつ
if(isHoge)もこっちぽいがどうだろう
そこを厳密に議論する意味もなさそうだが
構造による条件分岐をする際はif文よりもswitch文の方が優れていそう
code:1.ts
if (type === 'single') {
return ..;
}
return ..;
こうすると、doubleとsingleが同列であることが伝わりづらい
single側が例外的な扱いに見える
else節を使わない
code:2.ts
if (type === 'single') {
return ..;
} else {
return ..;
}
elseを使うと、構造に変化があったときに気づけない
将来的にtype === 'none'のようなものが追加されたときに、'double'と同じ扱いになる
こうする
code:3.ts
if (type === 'single') {
return ...;
}
if (type === 'double') {
return ...;
}
return exhaustiveCheck(type);
code:4.ts
switch (type) {
case "single":
return ...
case "double":
return ...
default:
return exhaustiveCheck(type);
}
同列に書ける
明示的に書ける
構造が増えても減ってもエラーになる
別に3.tsでも4.tsでもどっちでも良さそうだが、4.tsのほうが好きmrsekut.icon
条件が同じ物があったときの書き方が簡潔になる
code:ts
case 'type1':
case 'type2':
return ...
ネストが同じ階層になるので、同列っぽさが出る
他言語でのパターンマッチの書き方に近い
ただ、switchは文なので、再代入をしない運用と併用すると、そのためだけに関数を作る必要が出てくる