なぜそのバリデーションは「ザル」なのか?:`String.IsNullOrWhiteSpace` が現場を救う理由
業務自動化の現場で最も遭遇する「見えないバグ」の筆頭が、入力値の検証不備だ。
「入力されたはずのデータがない」「データベースに空文字ではなくスペースだけが登録されて整合性が取れなくなった」……。もし君がこうしたトラブルに頭を抱えたことがあるなら、それは `String.IsNullOrEmpty` の使い方を誤解している可能性が高い。
今日は、VB.NETにおける「文字列検証」の極限解を伝授する。明日からバグ報告を一つ減らすための、プロの設計思想だ。
—
1. 致命的な落とし穴:IsNullOrEmpty の限界
多くの初心者は、文字列が空かどうかを判断する際に、反射的に以下のコードを書く。
.net
‘ 悪い例:これだけでは「スペース」をすり抜けてしまう
If String.IsNullOrEmpty(userInput) Then
‘ ここに入力エラー処理
End If
`String.IsNullOrEmpty` は、その名の通り「Null」か「空文字(””)」を判定するだけだ。だが、現実はどうか? ユーザーは悪気なく、あるいはシステムの仕様をかいくぐって「半角スペース」や「タブ文字」を入力してくる。
結果、システムは「データが入っている」と誤認し、空白だらけのレコードがデータベースを汚染する。 これが業務システムの信頼性を損なう元凶だ。
—
2. 救世主:String.IsNullOrWhiteSpace の真価
.NET Framework 4.0以降、我々には最強の武器が与えられている。それが `String.IsNullOrWhiteSpace` だ。
このメソッドは、以下の3つを一括で弾いてくれる。
1. Null(オブジェクトが生成されていない)
2. “”(文字数0の空文字)
3. ” ” や vbTab(空白文字のみで構成される文字列)
実践的な実装パターン
実務では、単にチェックするだけでなく、Trim(余分な空白の削除)と組み合わせるのが定石だ。
.net
Public Function IsValidInput(ByVal input As String) As Boolean
‘ 1. まずは空白文字のみを強力に排除
If String.IsNullOrWhiteSpace(input) Then
Return False
End If
‘ 2. さらに先頭・末尾の不要なスペースを除去して正規化する
Dim cleanedValue As String = input.Trim()
‘ 3. 必要に応じて文字数制限などの追加バリデーション
If cleanedValue.Length > 50 Then
Return False
End If
Return True
End Function
—
3. 現場で使える「堅牢なバリデーション」テンプレート
ファイルインポートやCSV処理、あるいはDB登録前のバリデーションで、私が現場で必ず使う「型安全で保守性の高い」構造を紹介する。
.net
”’
”’
Public Module Validator
”’
”’
Public Function IsRequired(ByVal value As String) As Boolean
‘ 空白文字のみの文字列を許容しないことが鉄則
Return Not String.IsNullOrWhiteSpace(value)
End Function
”’
”’
Public Function SafeTrim(ByVal value As String) As String
‘ Nullの場合は空文字を返し、NullReferenceExceptionを防ぐ
If value Is Nothing Then Return String.Empty
Return value.Trim()
End Function
End Module
—
4. チーフアーキテクトからの助言:なぜこれが重要なのか
なぜ、たかが「空白」のチェックにここまでこだわるのか? それは、「不整合が発覚するタイミングを、システムの上流で止めるため」だ。
データベースに「スペース」が入ってしまうと、後続のプログラムで以下のような地獄が待っている。
- 集計処理で値が計算されず、原因特定に数時間を要する。
- 画面表示時に「空白」がズレを引き起こし、レイアウトが崩れる。
- 外部システムとの連携で、バリデーションエラーを吐く。
「入力された瞬間」にガードを固めること。 これが、保守コストを劇的に下げる唯一の方法だ。
まとめ:今日から変えるべき3つの習慣
1. IsNullOrEmpty は卒業せよ: 今後は `String.IsNullOrWhiteSpace` をデフォルト基準とする。
2. 正規化はセットで行う: `Trim()` で余分な空白を除去してからデータを利用する。
3. Nullを恐れない: `Nothing` が入ってくることを前提に、常に防御的なコードを書く。
君の書くコードが、次のシステム改修時に「読みやすく、壊れにくい」と言われることを願っている。技術は細部へのこだわりによってのみ、プロフェッショナルの領域へと昇華されるのだ。
