【Ruby】三項演算子の書き方とif文との使い分け | 可読性を高める実務の正解

【Ruby】三項演算子の書き方とif文との使い分け | 可読性を高める実務の正解 Ruby

結論から言います。

Rubyの三項演算子は、「単純な二択の値を返す(代入する)」ためだけに使用し、少しでもロジックが複雑になるなら、迷わず if 文を使うのが実務の正解です。

ネットの解説記事では、ただ「短く書ける便利な方法」として紹介されることが多いですが、それは大きな間違いです。

効率的な開発とは、単に行数を削ることではなく、「誰が読んでもすぐに意図が理解できるコード」を積み重ねることです。

Webエンジニアを目指すなら、可読性と保守性を両立させるための「正しい使い分け」を身につけてください。

【執筆者の簡易プロフィール】
kazu 執筆者:kazu
  • 38歳男性、既婚
  • Webエンジニア
  • 新卒でSESに入社し、Web系企業に常駐、その後Web系スタートアップに転職
  • 主な使用言語はRuby、PHP、JavaScript、HTML/CSS
  • モットーは「人に厳しく、自分にはもっと厳しく」

三項演算子の基本:戻り値を直接利用する最短ルート

Rubyにおける三項演算子(条件演算子)の構文は 条件式 ? 真の時の値 : 偽の時の値 です。
ここで重要なのは、三項演算子が「式」であり、必ず「値(戻り値)」を返すという点です。

条件分岐と代入を1行に集約し、重複(DRY)を排除する

単純な条件分岐で変数に値をセットしたい場合、if 文を使うと冗長になり、変数名を2回書く手間が発生します。

三項演算子を使えば、これを1行で、かつスマートに表現できます。

ダメな例:単純な代入を if でダラダラと書く非効率

# 動きますが、正直言って時間の無駄です
user_status = "active"

if user_status == "active"
label = "有効"
else
label = "無効"
end

puts label

このコード、4〜5行も使っていますが、やっていることは単なる「ラベルの決定」です。
label という変数が何度も登場し、視覚的なノイズが多すぎます。
効率厨の私から見れば、1ミリも美しくありません。

良い例:三項演算子で戻り値をスマートに受け取る

# これが実務における「最短ルート」です
user_status = "active"

label = user_status == "active" ? "有効" : "無効"

puts label

これなら1行で完結し、意図も明確です。

「user_statusがactiveなら有効、そうでなければ無効を変数に代入する」という流れが、視線の移動を最小限に抑えて理解できます。

ネスト(入れ子)や複数条件に三項演算子を使わない

初心者がやりがちな最悪のパターンが、三項演算子の中にさらに三項演算子を詰め込む「ネスト」です。

これは「技術負債を自ら生み出している」と言っても過言ではありません。

記号だらけのコードは人間の脳にとって「読解のノイズ」でしかない

三項演算子の強みは、そのシンプルさにあります。

条件が3つ以上(elsifが必要なケース)になった瞬間、?: の境界線が曖昧になり、バグの温床になります。

短く書くことに固執して、チームメンバーの読解時間を奪うのは、プロとして最も恥ずべき行為です。

ダメな例:判読不能な「入れ子」コード

# レビューで見つけたら即リジェクト対象です
score = 85
rank = score >= 90 ? "A" : (score >= 70 ? "B" : "C")

これをパッと見て、条件の優先順位を確信を持って答えられますか?

括弧があっても読みにくい。
脳に余計な負荷をかけるコードは、実務では「悪」です。

良い例:素直に if や case 文を活用する

# 読みやすさこそが、真の効率です
rank = if score >= 90
"A"
elsif score >= 70
"B"
else
"C"
end

Rubyの if は値を返すため、このように代入式を左辺に置くことができます。

行数は増えますが、条件の追加や変更にも強く、デバッグも容易です。
結局、これが一番早いんです。

使い分けの判断基準:kazuが提唱する「3つの規律」

三項演算子を使うか、if を使うか。
迷った時は以下の基準に自分を照らし合わせてください。

分岐の複雑さ 推奨する書き方
単純な二択(真か偽か) 三項演算子
3つ以上の条件分岐(elsif) if / case
条件式が長すぎて1行に収まらない if
内部でメソッド呼び出しを行う if

特に注意すべきは「三項演算子で複数のメソッドを動かす」ことです。

condition ? method_a : method_b のような書き方は、単なる値の返却ではないため、意図が伝わりにくくなります。

あくまで「値を一つ選んで返す」という目的に限定してください。

まとめ:三項演算子は「短縮」ではなく「整理」のためにある

Rubyの三項演算子は、適切に使えばコードを美しく整理してくれます。

  • 単純な値の代入には積極的に使い、冗長な if を排除する。
  • ネストは例外なく禁止。それはエンジニアとしての怠慢。
  • 1ミリでも「読みにくい」と感じたら、行数を惜しまず if に戻す。

「書ける」ことと「保守できる」ことは別次元の話です。
実務で評価されるのは、常に後者であることを忘れないでください。

以上です。

コメント

タイトルとURLをコピーしました