🦔

『リーダブルコード』を読んで、三項演算子について考える

2023/03/10に公開

https://www.oreilly.co.jp/books/9784873115658/

名著『リーダブルコード』では、「アドバイス」として次の文言が出てくる。

基本的にはif/elseを使おう。三項演算子はそれによって簡潔になるときにだけ使おう。

これは、if文に比べて三項演算子が読み辛いことを示した後に登場するため、説得力を感じてしまう。
一方で、「簡潔になるとき」がいまいち分からないのと、書籍内で示されているコードがそもそも読みづらいのでは?という疑問から、すこし考えてみる。

三項演算子の記法

Javaでおさらい。

// if文
String str;
if (a==b){
  str = "hoge";
} else {
  str = "fuga";
}

// 三項演算子で書き換える
// <条件式>?<true>:<false>;
String str = (a==b)?"hoge":"fuga";

簡潔にするために

記法の工夫

リーダブルコードでは、三項演算子が簡潔でない場合の例として、以下のコードを挙げている。

return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);

確かに読みづらいが、これは書き方次第である程度緩和できそうだ。
関数型プログラミングが『銀の弾丸』であるという非常識な常識2022の記法で書いてみる。

return (exponent >= 0)
    ? mantissa * (1 << exponent)
    : mantissa / (1 << -exponent);

TrueとFalseが縦に並んでいるため、ひと目で比較しやすい形になった。
読み手が三項演算子を知っていることを前提にすれば、多少は読みやすい記法になったのではないだろうか。

使用するタイミング

リーダブルコードの例示コードでは、一般的なif文を三項演算子に置き換えているだけだが、もっと適切な使用タイミングがあるのではないだろうか。

三項演算子の適切な使い方(条件演算子) - Qiitaでは以下のような例で、三項演算子の威力を示している(JavaScript, コードは一部改変)

// ifを使うとこうなるが
const DISPLAY_PATTERN = (v => {
  if (v < 500) {
    return 0
  } else {
    return 1
  }
})(displaySize)

// 三項演算子で書き換えられる
const DISPLAY_PATTERN = (displaySize < 500) ? 0 : 1

つまり、constに値を入れる際に、if文だと例示の上のような複雑な記述をするか、諦めてletを使うしか無いが、三項演算子を使えば簡潔に値を分岐させつつ定数にできるということ。
これを考えればJSだけでなくJavaでも、finalをつけても良くなるというメリットが見えてくる。

まとめ

  • 三項演算子は記法を工夫することで見やすくしよう
  • 定数作るときに使うと簡潔になるよ

Discussion