Edited at

三項演算子は悪か?

More than 3 years have passed since last update.

プログラマーとして社会人デビューした新人さんのプログラムをレビューしていた時、三項演算子の話がちらっと出たのでまとめます。

先にまとめておくと、三項演算子はif文の短縮形ではないよ、という話です。


追記 2015/10/15

ここでは"条件演算子"のことを"三項演算子"として書いています。

三項演算子は名前の通り3つの項目がある演算子の総称で、直接"?:"演算を指すものではないため、ここでは"条件演算子"と記述するほうがより正確でした。

bsdhackさんありがとうございました。



三項演算子とは

条件により返却する値を切り替えることができる演算です。


書式

[条件] ? [TRUEの場合の返却値] : [FALSEの場合の返却値] ;



サンプル

final int MAX = 100;

int ans = 120;

int result = MAX < ans? MAX : ans;
//resultは100


例はansが100以上なら100を、100以下ならそのままansを返すという処理です。


事の発端

上記の例でいうと、こういう感じのソースコードがありました。


if文サンプル

int ans = 120;

int result;

if(MAX < ans){
result = MAX;
}else{
result = ans;
}


ふむ。処理としては同じような気がします。

というか三項演算子の説明としてよくこういうソースコードが出される気がします。

ということで、三項演算子は使わないの?ということを聞いて見ると「三項演算子はわかりにくいから使わないように、と教わった」そうです。

確かに会社やプロジェクトによっては三項演算子を禁止する規約を設けているところがあるのも事実です。

いやいや、なんでもかんでもifで分岐させてしまうのは違うだろうということで使い分けを考えてみます。


if"文"と三項"演算子"

if文と三項演算子を考えるとき、まず注目しなくてはいけないのが"文"と"演算子"の違いです。

if文は制御構文なので、処理を分岐させるというものです。

それに対して三項演算子は"演算子"と名前が付いているように処理分岐を行うためのものではないのです。

そこを意識すると使い分けも明確になるかなと思います。


演算子

演算子というと"+"や"<="などがあります。

改めて意味を考えてみると



ans = [項目1] + [項目2]



という場合の"+"演算子は項目1と項目2の数値を足したものを返却する、という機能になります。

では三項演算子はというと



ans = (条件) ? [項目1] : [項目2]



項目1か項目2のどちらかを返却する、どちらを返すかは条件による。という機能になります。


使い分け

if文は処理の分岐を行う場合に使います。

三項演算子は2つ(もしくはそれ以上)の中から一つを選択するという処理を行う場合に使います。

上記のような例だと"MAX"or"そのまま"を選ぶ処理なので、三項演算子が適しており、結果としてif文で書くよりもシンプルで短くなります。

逆に短く書きたいから三項演算子を使う、というのは本末転倒なわけです。


混乱の原因

「三項演算子は可読性が悪い」と言われ、嫌われる原因は結局のところif文の代わりに三項演算子を使ってしまっている悪いパターンが蔓延しているからだと思います。

三項演算子の中に"処理"を書いてしまうとif文でいいじゃんという話になってしまいます。


まとめ

if文と三項演算子はそもそも役割が別だよ、ということを言いたいがための記事でした。

役割を明確にして使い分ければ、読み手にもコードの意図が伝わるので可読性は良くなるはずです。

しかしどこまでを"演算"にしてどこからが"分岐処理"なのかという線引は作るプログラムの目的だったりプログラマーのセンスだったりも大いに関わってくるため難しい問題だとは思います。