C# の 3項演算子ですが、難しいという人がいます。
でも、僕は難しいというよりは、ややこしいという表現の方が正しい気がします。
今日の仕事
で、気がつくと以下のようなコードを書いていました。
valueオブジェクトの Flag プロパティ が false か、キャストできなければ 0 を、それ以外なら sourceCode の値を返すという単純なものです。
パターン1
int GetDestinationCode(object value, int sourceCode) {
return ((value as MyClass) == null ? false : (value as MyClass).Flag) ? sourceCode : 0;
}
しかし、value as MyClass が 2回処理されるのが嫌だったので次の書き方に変更しました。
パターン2
int GetDestinationCode(object value, int sourceCode) {
MyClass x = value as MyClass;
return (x == null ? false : x.Flag) ? sourceCode : 0;
}
このコードを眺めていて、ふと「ひょっとして、これは読みにくいコードなんだろうか?」と不安になりました。
そこで上記を展開して、2つの 3項演算子にしてみました。
パターン3
int GetDestinationCode(object value, int sourceCode) {
MyClass x = value as MyClass;
bool f = x == null ? false : x.Flag;
return f ? sourceCode : 0;
}
それとも、3項演算子を使わずに書いた方がいいんだろうか?
パターン4
int GetDestinationCode(object value, int sourceCode) {
MyClass x = value as MyClass;
if (x == null) return 0;
if !(x.Flag) return 0;
return sourceCode;
}
論理条件演算子を使うと2行で書くこともできますね。
パターン5
int GetDestinationCode(object value, int sourceCode) {
if (value as MyClass == null || !(value as MyClass).Flag) return 0;
return sourceCode;
}
皆さんは、どんな風に書きますか?
僕は悩んだ末に、結局はパターン2の記述にしました。