きっかけ
現場でああだこうだ言っていたので、自分の考えをまとめる。
思うんだけど、現場の人間と挨拶以外に話さない日が多い気がするんだが、これは普通のことだよね?
前提
Java10
三項演算子
class Test { public static void main(String args[]) { int a = 0; int answer = a == 0 ? 10 : 11; System.out.println(answer); } }
当然、出力は 10
。
if文で書くとどうなるか?
class Test { public static void main(String args[]) { int a = 0; int answer; if (a == 0) { answer = 10; } else { answer = 11; } System.out.println(answer); } }
冗長記述になる。
answerがまどろっこしいくらいに出てくる。
三項演算子のメリット
- 冗長性を回避できる
- 記述量を削減できる
三項演算子のデメリット
メリットあれば、当然デメリットもある。
複数項
三項で済めばいいけど、四項・五項になってくると、意味がわからなくなる。
class Test { public static void main(String args[]) { int a = 0; int answer = a == 1 ? 10 : a == 0 ? 11 : 12; System.out.println(answer); } }
answerには 11
が設定されるのだが、 条件が複数になった時点で、人間の処理能力を越えると思う。
演算子の優先順位
class Test { public static void main(String args[]) { int a = 0; int answer = a++ == 1 ? 10 : a == 0 ? 11 : 12; System.out.println(answer); } }
これは、 12
が正解だが、パット見、10と答えたくもなる。
三項演算子は、演算子が連続して記述される可能性が高くなるため、なるべく演算子を途中で利用するのは避けるべき
三項演算子でやっちゃいけないこと
- 項が複数に成らないようにする
- 演算子を混ぜない
上記のどれかに合致してしまう場合、使わない方がいい。
あと、下記の理由で使うのも辞めるべき
- ワンライナーで書きたい。
- 俺、頭いいでしょって見せびらかしたい。
- 記述量を減らしたい
本来は、簡素な記述で分かりやすくあるべきもの。
本来の意図を見失って、自己陶酔に走ったりするのは、ナンセンス。
たまにワンライナー至上主義みたいなエンジニアがいるが、個人的な見解を言うと、頭おかしい人だから、あんまり真に受けないほうがいい。
ワンライナーで書いても問題ないところは、書くこと推奨だが、他者の理解を著しく妨げるものは、辞めたほうがいい。
三項演算子を使うべきパターン
class Test { public static void main(String args[]) { System.out.println(Test.isNegativeNumber(-1)); } static String isNegativeNumber(int target) { return target < 0 ? "yes. it's negative!" : "no!"; } }
2パターンにしか成らない返り値の場合とかが最有力だと思う。
それ以外は、使用を控えるべき。
目的に沿って使うことが重要。
複数個を返す可能性があったりするものは、if文でやるほうが無難だと思う。
ちなみに、negativeってワードを選んだのには、他意はない。
整数だとintegerで紛らわしいから。だったらpositiveでいいじゃんってのは、作ったあとに思った。
気をつけること
ワンライナー教は、マジで厄介。
レビューで指摘すると反発してくることがよくある。
だけど、可読性を著しく下げるものは、許容できないので、根気強く説得するしかない。