単純な変数代入の場合、if文ではなく三項演算子を使ってみよう

    単純な変数代入の場合、if文ではなく三項演算子を使ってみよう

    本記事はAsiaQuest Advent Calendarの10日目です。

    目次

       

      はじめに

      デジタルエンジニアリング部の佐藤(大)です。
      最近レビューする機会が増えてきて、変数の代入のみの処理にif文を使うケースを多く見かけたので、もし参考になればという思いで書いてみました。

      対象読者

      • 三項演算子について知りたい方。
      • より良いコードの書き方を探求している方。

      注意点

      • 全てのif文を三項演算子で書き換えられるわけではないです。
      • 無理に三項演算子を使って、逆に読みづらくなるパターンもあるので、注意が必要です。

      三項演算子とは?

      そもそも三項演算子はどのようなものなのでしょうか?
      PHPを例にすると、こんな感じで書くことができます。

      $score > 50 ? "Good" : "Bad";

      ソースコードの構成としては、以下のような感じです。

      <条件式> ? <式1> : <式2>

      <条件式>の内容が真(true)であれば<式1>を、偽(false)であれば<式2>を返します。

      Pythonだけ見た目が違いますが、PHP、Java、JavaScript(TypeScript)、Rubyといった大抵の言語で使える書き方になります。

      三項演算子とifの違い

      三項演算子とifの最大の違いは、

      • 三項演算子は式
      • ifは文

      ということです。

      式と文の違いは、式は変数に代入できる、文は代入できない、とざっくり覚えると良いです。

        特徴
      変数に代入できる 値、変数、演算子、関数
      変数に代入できない if, for, while
      // 式
      $result = 1;
      $result = 1 + 1;
      $result = $number === 1;
      $result = $score > 50;

      e.t.c.


      // 文
      $result = "";
      if ($score > 50) {
      $result = "Good";
      } else {
      $result = "Bad";
      }

      for ($i = 0; $i < 100; $i++){
      print "$i";
      }

      e.t.c.

      よって、以下のようには書くことができますが、

      $result = $score > 50 ? "Good" : "Bad";

      以下のようには書けません。

      $result = if ($score > 50) {
      $result = "Good";
      } else {
      $result = "Bad";
      }

      いつ三項演算子を使うといいの?

      簡潔にいうと、分岐が2つで変数代入の処理が1つのみの場合は非常に便利です。
      以下のようなパターンです。

      // 三項演算子の場合 
      $result = $score > 50 ? "Good" : "Bad";


      // if文の場合
      $result = "";
      if ($score > 50) {
      $result = "Good";
      } else {
      $result = "Bad";
      }

      ご覧いただいて分かる通り、余分な変数宣言や代入がない三項演算子の方がスッキリしていて読みやすいと思います。

      逆に三項演算子を推奨しないパターン(if文の方が良いパターン)

      分岐が3つ以上になると、三項演算子の中に三項演算子が入り、読みづらくなる可能性が高いです。
      以下のようなパターンです。

      // 三項演算子の場合 
      $result = $score > 80 ? "Great" : ($score > 50 ? "Good" : "Bad");

      // if文の場合
      $result = "";
      if ($score > 80) {
      $result = "Great";
      } else if($score > 50) {
      $result = "Good";
      } else {
      $result = "Bad";
      }

      この程度であれば読めなくはないですが、実務ではもっと文字数が長くなったりするのでおすすめしません。

      そもそも出来ないパターン

      if文の中で複数の処理をしている場合はそもそも三項演算子で代替はできません。

      // 三項演算子の場合 
      // スマートに書けない

      // if文の場合
      $result = "";
      if ($score > 80) {
      $result = "Great";
      } else if($score > 50) {
      $result = "Good";
      } else {
      $result = "Bad";
      throw new Exception();
      }

      この場合は"スコアが低いとエラーになる"というかなり極端な例ですが、実務では特定の条件下のみ別の処理もするという場合は数多く存在するので、その際はif文で書くことをおすすめします。

      まとめ

      いかがだったでしょうか。
      参考書でもあまり優先度高く紹介されているイメージはない三項演算子ですが、実際の業務では意外と汎用性が高く、可読性も良くなるパターンが多いです。
      何でもかんでも三項演算子にするのではなく、「この実装の場合は三項演算子の方が良さそうだ」という場面に遭遇しましたら、ぜひ試していただければと思います。