📑

三項演算子のネスト耐久

に公開

🎄Merry Christmas🎄 WWWAVE アドベントカレンダー  12/14の記事です

はじめに

初めまして、ウェイブでエンジニアをしているknakaです。
今回はRubyの勉強も兼ねて、コードの可読性について考えてみたいと思います。

三項演算子とは

知っている人はスキップしてください。

score = 50

if score >= 90
  result = "Excellent"
else
  result = "Fail"
end

例えば上記のようなif文があります。この場合、if文のブロックだけで5行あります。
この例だけなら特に言うことは無いですが、コードの可読性を考えたときには処理の縦幅が狭い方が一覧性が高まります。

score = 50

result = score >= 90 ? "Excellent" : "Fail"

前述したif文は上記のように省略した形式で書くことが可能です。
5行あったものが1行になって嬉しいですね!
この時、?:には被演算子が3つあるため、三項演算子と呼ばれます。

以下はこの文の読み方の解説です。
score >= 90で条件の判定をして、?以降の値のどちらかがresultに代入されます。
結果がtrueの場合は左辺が、falseの場合は右辺が該当の値となります。
今回の場合はfalseなので"Fail"resultに代入されるという感じです。
一度読み方が分かれば、視覚的にもかなり分かりやすいです。

ネストLv.1

本題です。
上記で示した三項演算子を用いた省略記法はネストさせることが可能です。
三項演算子による記述で向上した可読性が、どこまでのネストに耐えうるのかというのが本稿の試みとなります。では早速やってみましょう。

score = 50

result = score >= 90 ? "Excellent" : (score >= 70 ? "Good" : "Fail")

この時点で人によっては嫌だなと思う人もいるかも。
falseの場合はさらに条件分岐をさせて代入する値を決定するという感じですね。
私はまだ大丈夫です。

ネストLv.2

score = 50

result = score >= 90 ? "Excellent" : (score >= 70 ? "Good" : (score >= 50 ? "Normal" : "Fail"))

なんか一見して複雑そうで、かなり嫌です。
ただ冷静に見てみると、まだパターン的にfalseの時に同じような条件分岐をしているのだな、ということは分かりました。
私はまだ大丈夫です。

ネストLv.3

score = 50
attendance = 0.2

result = score >= 90 ? "Excellent" : (score >= 70 ? "Good" : (score >= 50 ? (attendance >= 0.8 ? "Safe" : "Out") : "Fail"))

終わった……
ネストを増やした上に、今度はtrueの時に条件分岐を入れたり、変数が追加されていたりとめちゃくちゃ読みづらいです。どうしてこんなコードを書いてしまったのでしょうか……

if文の方が読みやすい?

score = 50
attendance = 0.2

if score >= 90
  result = "Excellent"
elsif score >= 70
  result = "Good"
elsif score >= 50
  if attendance >= 0.8
    result = "Safe"
  else
    result = "Out"
  end
else
  result = "Fail"
end

if文に戻したら読みやすいよね、という構成にしようと思っていたのですが、なんか読みづらいですね。
ただ、前述のLv.3よりかはまだ順を追って理解はできるという意味で少しマシかも?
パッと思いつく改善点は以下でした。

  • if attendance >= 0.8の分岐では三項演算子を使った方が良さそう
  • case文を使えばresultを何回も書かなくて済みそう

リファクタしてみる

score = 50
attendance = 0.2

result = case score
when 90.. then
  "Excellent"
when 70..89 then
  "Good"
when 50..69 then
  attendance >= 0.8 ? "Safe" : "Out"
else
  "Fail"
end

どうでしょうか。少なくともネストLv.3よりかは読みやすくなった気がします。
多分まだ改善点はあると思いますが、そういうことを考えていくことが可読性の向上だったりに繋がっていくのだと思います!

終わりに

今回は三項演算子を使った極端な例を用いながら話をしてきましたが、プログラミングをしていると他にも様々な省略記法に出会うことがあります。
そういった便利なものを適切に使うことが、コードの可読性を良くするために大事なことなのではないかと思いました。

wwwave's Techblog

Discussion