著作一覧 |
もちろん、僕は、3項演算子は好きだ。
というよりも、規約的なプライオリティってあるわけで、
・変数は宣言時点で初期化せよ(追記:む、C/C++ならだなぁ。Javaの場合初期化はされないけど、未初期化状態で使おうとするコードはコンパイル時に検出するからな。でも、いずれにしても初期化は必要なわけだし、宣言時点で初期化するのが良いと思う)
ってのは、相当プライオリティが高い。というわけで
int radix; if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) { radix = 16; } else { radix = 10; } // いくら例とは言え、8進数や2進数は無視かよ?なんて書くくらいなら、っていうか、書くな(っていうかこの程度なら構わんけど、やるなら徹底したいじゃん)。
int radix = (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? 16 : 10;
だろう。
あと、無駄な代入って嫌いだから
int radix = 10; if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) { radix = 16; }
ってのはあまり好きじゃない。
ってことは、必然的に3項演算子はばしばし使いまくりですな。
ジェズイットを見習え |
私はこの例では3項演算子版よりif else版のほうが解りやすいと感じます。別に個人的な印象なので他人が使う分にはかまいません。Cだと巨大な関数を書かれてしまうと宣言時に初期化されてから使用されるまでコードが山ほどあって解り難い事から、使用直前初期化主義でした。Javaだと関係ないですね。というかメソッド(関数)の行数を制限しろって事だと思いますが。あと「無駄な代入」のほうがコンパイル後のコードは短くなる傾向があるので結構好きです。これも最適化はコンパイラに任せるべき、というか、そもそも今ではそんなコードサイズの差なんて誰も気にしていないでしょうが…<br>失礼しました。
実は、今読み返したら、この例については僕もif-elseのほうが読みやすいと感じてしまいました(程度に気分的なものだから、どっちでも良いとすべきで、規約で禁止するな、という主張は全然変わらないけど)。