【実務・中級編】実務中級者向け:VB.NETにおけるSelect Case文の高度な範囲指定と、複数条件をスマートに記述するパターンマッチング活用術 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

【VB.NET極限活用】Select Case文を極める:保守性を爆上げする高度な範囲指定とパターンマッチング戦略

開発現場で、こんなコードに遭遇して頭を抱えたことはないだろうか。

.net
‘ 【アンチパターン】可読性を殺すネストしたIf文の嵐
If status = 1 Then
ProcessA()
ElseIf status = 2 OrElse status = 3 OrElse status = 5 Then
ProcessB()
Else
If score >= 80 Then
ProcessC()
Else
ProcessD()
End If
End If

業務システムや自動化ツールを開発していると、無数の条件分岐に直面する。これを愚直に `If…ElseIf` で繋いでいくと、コードの意図が希薄化し、いわゆる「魔改造」の温床となる。

VB.NETには、このカオスを美しく調停する強力な武器が存在する。それが `Select Case` 文だ。

今回は、単なる「値の一致」にとどまらない、`Is` キーワードや `To` 演算子を活用した高度な範囲指定、そしてモダンなC#のパターンマッチング思想をVB.NETの `Select Case` で極限まで引き出し、「バグの起きない堅牢な設計」を実現する手法を伝授する。

1. なぜ `If…ElseIf` ではなく `Select Case` なのか?

パフォーマンスの観点から言えば、数個の条件であれば `If` も `Select Case` も大差はない。しかし、「人間の脳内メモリ(認知負荷)」「拡張性」の観点において、両者の差は圧倒的だ。

`Select Case` は、評価対象の式を一度だけ評価(Evaluate)し、その結果に対してジャンプテーブル的な最適化を行う(コンパイラの最適化恩恵を受けやすい)。何よりも、「何を判定しているのか」が視覚的に一目でわかる点が最大のメリットである。

実務において、保守性の高いコードとは「修正時にバグを生まないコード」だ。条件分岐の意図が構造化されている `Select Case` は、チーム開発における強力な防壁となる。

—.

2. `To` と `Is` を使いこなす:高度な範囲指定の極意

基本の `Select Case value` に対し、`To` 演算子と `Is` キーワードを組み合わせることで、数値や日付の「範囲判定」が劇的にスマートになる。

`To` による連続した範囲指定

例えば、スコアに応じた評価ランク分けを考えてみよう。

.net
‘ 悪い例:If文の範囲指定
If score >= 0 AndAlso score <= 50 Then rank = "C" ElseIf score >= 51 AndAlso score <= 80 Then rank = "B" ElseIf score >= 81 AndAlso score <= 100 Then rank = "A" End If これを `Select Case` と `To` で書き換えるとこうなる。 .net ' 良い例:Select Case + To Dim rank As String Select Case score Case 0 To 50 rank = "C" Case 51 To 80 rank = "B" Case 81 To 100 rank = "A" Case Else Throw New ArgumentOutOfRangeException(NameOf(score), "スコアが不正な範囲です。") End Select 境界値のミス(`>=` なのか `>` なのか)が視覚的に排除され、数学的な区間として美しく表現されている点に注目してほしい。

`Is` による比較演算子の活用

「〜以上」「〜未満」といった条件を扱いたい場合は、`Is` キーワードの出番だ。

.net
Dim message As String
Select Case temperature
Case Is < 0 message = "氷点下です。凍結に注意してください。" Case Is >= 35
message = “猛暑日です。熱中症に警戒してください。”
Case Else
message = “平穏な気候です。”
End Select

`Case Is < 0` は、「Caseの値が、0未満である場合」を意味する。`If` 文の条件式をそのまま `Case` の後ろにスライドさせる感覚で記述できるため、直感的なコーディングが可能だ。 ---

3. 複数条件のスマートな列挙と文字列のパターンマッチング

実務では、「この値、またはあの値、あるいは特定の範囲」といった複雑な条件が頻出する。これらをカンマ(`,`)で区切ることで、1つの `Case` ブロックに集約できる。

カンマ区切りによる複数条件の統合

.net
Dim workType As String = GetWorkType()
Dim isHolidayWorking As Boolean = False

Select Case workType
Case “Saturday”, “Sunday”, “NationalHoliday”
‘ 週末または祝日の場合
isHolidayWorking = True
LogMessage(“休日出勤として処理します。”)

Case “Normal”, “Overtime”
‘ 平常勤務または残業の場合
isHolidayWorking = False
LogMessage(“通常勤務として処理します。”)

Case Else
Throw New InvalidOperationException($”未知の勤務区分です: {workType}”)
End Select

ここで重要なのは、「例外(`Case Else`)を必ず用意すること」だ。業務システムにおいて、想定外の値が流入した際に黙殺(サイレント障害)することが最も恐ろしい。厳格な例外スローやログ出力を必ず組み込む設計にしよう。

4. 【プロダクションコード】ファイル拡張子とDBデータを安全に処理する実務サンプル

ここまでの知見を統合し、実務の現場(ファイル処理やデータベース連携を想定した業務自動化バッチ)でそのまま使える堅牢なコードを提示する。

.net
Imports System.IO
Imports System.Data.SqlClient

Public Class DataProcessor

”’

”’ 指定されたファイルの拡張子とサイズに基づき、適切なインポート処理を実行する
”’

Public Sub ProcessFile(filePath As String)
If Not File.Exists(filePath) Then
Throw New FileNotFoundException(“対象ファイルが存在しません。”, filePath)
End If

Dim fileInfo As New FileInfo(filePath)
Dim extension As String = fileInfo.Extension.ToLowerInvariant()
Dim fileSizeMb As Double = fileInfo.Length / (1024.0 1024.0)

‘ 拡張子によるルーティングと、ファイルサイズによるガード条件を組み合わせる
Select Case extension
Case “.csv”, “.txt”
‘ テキスト系ファイルの処理
If fileSizeMb > 50.0 Then
Throw New InvalidOperationException(“テキストファイルのサイズが上限(50MB)を超えています。”)
End If
ImportTextFile(filePath)

Case “.xlsx”, “.xlsm”
‘ Excel系ファイルの処理(大容量チェック)
Select Case fileSizeMb
Case 0 To 10
ImportExcelStandard(filePath)
Case Is > 10
ImportExcelHighPerformance(filePath) ‘ 大容量用ストリームリーダー等を使用
End Select

Case “.zip”, “.tar”, “.gz”
‘ アーカイブファイル
ProcessArchive(filePath)

Case Else
‘ 未知のファイル形式は厳格に弾く
Throw New NotSupportedException($”サポートされていないファイル形式です: {extension}”)
End Select
End Sub

Private Sub ImportTextFile(path As String)
‘ 実装省略: テキストインポート処理
End Sub

Private Sub ImportExcelStandard(path As String)
‘ 実装省略: 標準Excelインポート
End Sub

Private Sub ImportExcelHighPerformance(path As String)
‘ 実装省略: 高性能Excelインポート
End Sub

Private Sub ProcessArchive(path As String)
‘ 実装省略: アーカイブ処理
End Sub

End Class

このコードのアーキテクチャ的解説

1. `ToLowerInvariant()` による文字列正規化: ファイル拡張子の比較ミスを防ぐため、事前に小文字化している(ロケール依存のバグを防ぐベストプラクティス)。
2. ネストされた `Select Case` による関心の分離: 外側で「ファイル形式」による大まかな分岐を行い、特定の形式(Excelなど)の内側でさらに「ファイルサイズ」という別の軸でスマートに分岐させている。
3. フェイルファスト(Fail-Fast)の原則: 想定外の拡張子や異常なファイルサイズは、処理の最上流(`Case Else` や `If` ガード)で即座に例外をスローし、不正なデータが下層のデータベース層や永続化層へ波及するのを完全に防いでいる。

5. チーフアーキテクトからの提言

コードの美しさは、そのままシステムの堅牢性に直結する。
「動けばいい」という妥協が生んだネストの深い `If` 文は、半年後のあなた自身、あるいは後任のエンジニアの時間を奪う呪いと化す。

VB.NETの `Select Case` は、単なる条件分岐の構文ではない。ビジネスロジックの意図をコードの構造そのもので表現するための洗練されたデザインツールだ。

`To` や `Is`、そしてカンマ区切りを自在に操り、読者に「おっ」と言わせる美しく堅牢なコードをあなたのプロジェクトでも実装してほしい。

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