三項演算子とは「?:」のことです。ネストすると読みにくいので、なるべく使わないほうがいいと思います。
三項演算子の例
x = (a < 10) ? c : d;
if文の例
if (a < 10) {
x = c;
} else {
x = d;
}
Code language: HTML, XML (xml)
三項演算子のネスト
最大の理由は、選択肢が3つ以上になったとき、三項演算子のネストで対処してしまうと、難解なコードに育ってしまうからです。
// 三項演算子のネスト
x = (a < b) ? ((a < 10) ? c + m : d + m) : ((b < 30) ? e + n : f + n);
Code language: JavaScript (javascript)
三項演算子のネストは読みにくいので、if文にリファクタしたほうがいいです。それなら最初からif文で書いたほうがいいと思います。
単純な式なら三項演算子で書いておき、複雑になりそうになったらif文にリファクタすればいい、という考えもあります。しかし次のような心理的圧力で、if文にリファクタするより、三項演算子をネストするほうを選びがちです。
- 初心者は、三項演算子を使っていることに何か意味があると考えてしまうかもしれません。
- 時間がないとき、if文にリファクタするよりも、三項演算子の式をそーっといじってしまうかもしれません。
- プロジェクトに参加したばかりの人が、if文にリファクタして動かなくなることを心配して、三項演算子のまま修正してしまうかもしれません。
デバッガで追いにくい
2つ目の理由は、デバッガでステップ実行したとき、if文のほうが処理の流れを追いやすいからです。
三項演算子の文をデバッガでステップ実行すると、単に次の行に移動します。三項演算子の条件が、true/falseだったのかわかりません。
if文をステップ実行すると、x = c; または x =d; の行に移動します。どちらの選択肢に移動したのか、ひと目でわかります。
※この記事を書いた後、自分のソースを検索したら、予想より多く見つかりました。まあそんなもんですね。
※この記事のタグは「コーディングスタイル」より「デバッガブル」だなと思い、「デバッガブル」で検索したら、いい記事が見つかりました。
デバッグしにくい、解析しにくいコード
※世間的には、三項演算子のネストは読みにくい、でも三項演算子の使いドコロはあるよ、という風潮のようです。
三項演算子?:は悪である。
三項演算子は可読性を落とすか
条件演算子(三項演算子)を可読性低いとか言わせない