本記事はAsiaQuest Advent Calendarの10日目です。
デジタルエンジニアリング部の佐藤(大)です。
最近レビューする機会が増えてきて、変数の代入のみの処理にif文を使うケースを多く見かけたので、もし参考になればという思いで書いてみました。
そもそも三項演算子はどのようなものなのでしょうか?
PHPを例にすると、こんな感じで書くことができます。
$score > 50 ? "Good" : "Bad";
ソースコードの構成としては、以下のような感じです。
<条件式> ? <式1> : <式2>
<条件式>の内容が真(true)であれば<式1>を、偽(false)であれば<式2>を返します。
Pythonだけ見た目が違いますが、PHP、Java、JavaScript(TypeScript)、Rubyといった大抵の言語で使える書き方になります。
三項演算子と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";
}
ご覧いただいて分かる通り、余分な変数宣言や代入がない三項演算子の方がスッキリしていて読みやすいと思います。
分岐が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文で書くことをおすすめします。
いかがだったでしょうか。
参考書でもあまり優先度高く紹介されているイメージはない三項演算子ですが、実際の業務では意外と汎用性が高く、可読性も良くなるパターンが多いです。
何でもかんでも三項演算子にするのではなく、「この実装の場合は三項演算子の方が良さそうだ」という場面に遭遇しましたら、ぜひ試していただければと思います。