【入門編】switch文が式に変わる:Dart 3のswitch式でボイラープレートを削減する – Dart コア文法・オブジェクト指向・Null安全解析バイブル

ようこそ、Dartの世界へ。

今日は、Dart 3という大きなアップデートで導入された、プログラミングの書き方を劇的に変える「魔法」についてお話ししましょう。

かつて、私たちは条件分岐を書く際、コンピュータに「こうして、ああして」と命令を並べる必要がありました。しかし、現代のDartは違います。私たちは「これは、これである」と、定義(式)としてコードを書くことができるようになったのです。

その主役が、今回解説する「switch式(Switch Expressions)」です。

この技術をマスターすれば、あなたのコードから不自然な一時変数が消え、バグが入り込む隙のない、美しく堅牢なプログラムが書けるようになりますよ。「ここをクリアすれば、Dartの基本はバッチリマスターできます」と言い切れるほど重要なポイントです。

さあ、一緒に深淵を覗いてみましょう。

—

1. なぜ「式」であることが重要なのか?

これまでのDart(〜2.19まで)の `switch` は「文(Statement)」でした。
「文」とは、コンピュータに「実行」を命じるものですが、それ自体は値を持ちません。

そのため、結果を受け取るためにわざわざ「空の変数」を用意する必要がありました。

以前の書き方(ボイラープレートが多い例)

String describeColor(Color color) {
late String result; // 1. まず変数を用意する(これが面倒!)

switch (color) {
case Color.red:
result = ‘情熱の赤’; // 2. 代入する
break; // 3. breakを忘れるとバグる
case Color.blue:
result = ‘冷静の青’;
break;
default:
result = ‘未知の色’;
}

return result; // 4. 最後に返す
}

この書き方には、「変数が書き換え可能(Mutable)である」「`break`を書き忘れるリスクがある」「すべてのケースを網羅しているかコンパイラが教えてくれない」という弱点がありました。

Dart 3の「switch式」は、これらをすべて解決します。

—

2. switch式の基本:値を直接「返す」美学

switch式を使うと、`switch` そのものが値を持ちます。
まずは、先ほどのコードがどれだけスッキリするか見てみましょう。

Dart 3の書き方(switch式)

String describeColor(Color color) => switch (color) {
Color.red => ‘情熱の赤’,
Color.blue => ‘冷静の青’,
_ => ‘未知の色’, // _ は「それ以外すべて」を意味するワイルドカード
};

どうですか? 驚くほど短くなりましたよね。

ここがポイント!

  • `=>`(アロー)を使う: `case` や `break` はもう不要です。
  • セミコロン `;` ではなくカンマ `,` で区切る: `switch` 全体が一つの式だからです。
  • 結果を直接返せる: `return` と組み合わせて、関数を一行(Expression-bodied member)で書けます。

—

3. 型安全の極致:網羅性チェック(Exhaustiveness Checking)

私がDartのアーキテクトとして最も誇りに思っているのが、この網羅性チェックです。

通常、`switch` を書くときは「`default` ケース(その他)」を書くのが一般的ですが、実は `default` を書かない方が安全な場面があります。それが、列挙型(enum)や `sealed` クラス を使うときです。

コンパイラが「漏れ」を指摘してくれる

sealed class Shape {}
class Circle extends Shape { final double radius; Circle(this.radius); }
class Square extends Shape { final double side; Square(this.side); }

double calculateArea(Shape shape) {
return switch (shape) {
Circle(radius: var r) => 3.14 r r,
Square(side: var s) => s s,
// ここで Shape の新しい派生クラスが増えた場合、
// コンパイラが「ケースが足りないよ!」とエラーを出してくれます。
};
}

DartのAOT(Ahead-of-Time)コンパイラは、コンパイル時に「すべてのパターンが考慮されているか」を厳密に計算します。

もしあなたが新しい図形 `Triangle` を追加したのに、`switch` 式の更新を忘れたら、プログラムは実行される前にエラーを吐きます。これは、「実行時のクラッシュを、コードを書いている最中に防ぐ」という究極の安全策なのです。

—

4. 初学者が陥りやすい「文法エラー」の処方箋

switch式は強力ですが、これまでの `switch` 文と混同しやすいポイントがいくつかあります。

① `_`(ワイルドカード)の使いすぎに注意

`_ => …` を書くと、どんな値でも受け入れてしまいます。
しかし、前述の `sealed` クラスなどを使う場合は、あえて `_` を書かないのがプロの技です。そうすることで、将来クラスが増えた時にコンパイラに頼ることができるからです。

② 文と式の区別

  • switch文: `switch (x) { case …: break; }` (何か処理を実行したい時)
  • switch式: `var y = switch (x) { … };` (結果の値が欲しい時)

最後が `;`(セミコロン)で終わるのが「式」としての代入文であることを忘れないでくださいね。

—

5. まとめ:Dartを掌握するために

Dart 3のswitch式は、単なる「短縮記法」ではありません。
それは、「副作用を減らし、データの流れを直線的にする」という、現代的なプログラミング思想の現れです。

1. ボイラープレートを捨てましょう: `break` や一時変数はもう卒業です。
2. コンパイラを味方にしましょう: `sealed` クラスと組み合わせて、網羅性チェックの恩恵を最大限に受けましょう。
3. 意図を明確にしましょう: 「何を計算しているのか」がひと目で分かるコードは、チームの財産になります。

Dart VMの中では、これらの式は非常に効率的なジャンプテーブルや型判定に最適化されます。あなたが美しく書けば書くほど、Dartはそれに応えて高速に動作します。

「ここをマスターすれば、Dartの基本はバッチリです」。
自信を持って、あなたのコードにこの「式」を取り入れてみてください。次は、さらに高度なパターンマッチングの世界でお会いしましょう!

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