【入門編】初心者向け:VB.NETのEnum(列挙体)入門:マジックナンバーを排除しコードの可読性と保守性を飛躍的に高める定数管理の基本 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは、後輩諸君。ようこそプロフェッショナルの入り口へ。
世界中の基幹システムを支え、数多の自動化を成し遂げてきたチーフアーキテクトだ。

君たちが「マクロの記録」を卒業し、自分の意志でコードを書き始めたことは非常に喜ばしい。だが、一つだけ忠告しておこう。
「動けばいい」だけのコードは、数ヶ月後の自分への「呪い」に変わる。

今日は、その呪いを解くための最も基本的で、かつ最も強力な武器である「Enum(列挙体)」について教えよう。これが使いこなせれば、君のコードは「素人のメモ書き」から「プロの設計図」へと進化する。

準備はいいか? それでは始めよう。

1. 牙を剥く「マジックナンバー」の恐怖

まず、このコードを見てほしい。ある受注管理システムの判定処理だ。

‘ 良くない例:マジックナンバーが散乱しているコード
If status = 1 Then
‘ 発送準備をする
ElseIf status = 3 Then
‘ キャンセル処理をする
End If

この「1」や「3」という数字。書いた直後の君なら覚えているだろう。だが、3ヶ月後の君、あるいは君のコードを引き継ぐ同僚はどう思うだろうか?
「1って何だ? 注文済みか? 発送済みか? 3は返品か? 欠品か?」

このように、ソースコードの中に直接書かれた「意味の分からない数値」を、我々プロは「マジックナンバー(魔法の数字)」と呼ぶ。 マジックナンバーは解読に時間を食いつぶし、バグを招き、保守コストを増大させる諸悪の根源だ。

2. 救世主「Enum(列挙体)」とは何か?

マジックナンバーに名前をつけ、グループ化したもの。それがEnum(列挙体:エナム)だ。
Enumを使うと、先ほどのコードはこう変わる。

‘ 良い例:Enumを使った可読性の高いコード
If currentStatus = OrderStatus.Preparing Then
‘ 発送準備をする
ElseIf currentStatus = OrderStatus.Cancelled Then
‘ キャンセル処理をする
End If

どうだ? 誰が見ても一目で処理の内容が理解できるはずだ。
プログラミングとは、コンピュータに命令を与えるだけでなく、「人間に意図を伝える」作業でもある。Enumはその中核を担う機能なんだ。

3. Enumの基本構文:定義して使ってみよう

VB.NETでの定義方法は非常にシンプルだ。クラスやモジュールの冒頭(宣言セクション)に記述する。

Enumの定義

”’

”’ 注文ステータスを管理する列挙体
”’

Public Enum OrderStatus
”’

新規注文

NewOrder = 0
”’

入金待ち

WaitingPayment = 1
”’

発送準備中

Preparing = 2
”’

発送済み

Shipped = 3
”’

キャンセル

Cancelled = 9
End Enum

ここがアーキテクトの視点:

  • 明示的な数値割り当て: 数値を省略すると0から順に割り振られるが、実務ではDBの定義値と合わせるために、上記のように明示的に数値を指定するのが定石だ。
  • XMLコメント: `”’` でコメントを入れる癖をつけよう。これでIntelliSense(入力候補)に説明が表示されるようになる。

Enumの使用

定義したEnumは、変数のように型として使える。

Sub ProcessOrder(ByVal status As OrderStatus)
‘ Select Caseとの相性は抜群だ
Select Case status
Case OrderStatus.NewOrder
Console.WriteLine(“新しい注文が入りました。”)
Case OrderStatus.Shipped
Console.WriteLine(“商品は発送済みです。”)
Case Else
Console.WriteLine(“その他の状態です。”)
End Select
End Sub

4. なぜEnumを使うのか? 3つの劇的なメリット

「定数(Const)をたくさん作ればいいのでは?」と思うかもしれない。だが、EnumにはEnumにしかできない芸当がある。

① 強力な入力補完(IntelliSense)

Enum型の変数を書いた瞬間、Visual Studioが選択肢をリストアップしてくれる。
「綴りを間違える」「存在しない値を設定する」といったミスが物理的に不可能になる。これは開発効率に直結する。

② 型安全性

ただの整数(Integer)ではなく「OrderStatus型」として扱うため、無関係な数字が紛れ込むのを防げる。関数の引数にEnumを指定すれば、呼び出し側は何を渡すべきか迷うことがなくなる。

③ 文字列への変換が容易

Enumは、名前(Preparingなど)をそのまま文字列として取得できる。デバッグ時に「ステータスは2です」と言われるより「ステータスはPreparingです」と言われたほうが、原因究明は10倍早い。

Dim myStatus As OrderStatus = OrderStatus.Preparing
‘ “Preparing” という文字列が取得できる!
Console.WriteLine(myStatus.ToString())

5. 初心者が陥りやすい「罠」と解決策

罠:Enumの値を画面(UI)に表示したい

Enumの内部名(Preparing)ではなく、「発送準備中」という日本語を画面に出したい時があるだろう。

解決策:
一番シンプルなのは、Select Caseで変換する関数を作ることだ。
※上級者になれば「Description属性」を使う方法もあるが、まずは「値を名前に変える専用の場所を作る」という設計思考を身につけてほしい。

罠:範囲外の数値が入ってくる

実は、VB.NETのEnumは「ただの数字」なので、キャスト(型変換)すれば定義外の数字も入れられてしまう。
対策: `[Enum].IsDefined` メソッドを使うと、その値が定義済みかどうかチェックできる。外部システムやDBから値を受け取る際は、このチェックを忘れないことだ。

6. チーフアーキテクトからのメッセージ

Enumを使いこなすことは、単なるテクニックではない。それは「マジックナンバーという混沌」を「名前付きの秩序」へと変える儀式だ。

  • 1 という数字に NewOrder という魂を吹き込む。
  • 2 という数字に Shipped という役割を与える。

この積み重ねが、堅牢で美しいシステムを作り上げる。
もし君が、過去に作ったコードを開いて「この1って何だっけ?」と首を傾げたことがあるなら、今すぐその数字をEnumに置き換えてみたまえ。その瞬間、君のコードはプロの輝きを放ち始めるはずだ。

「ここをクリアすれば、Visual Basicの基本はバッチリですよ。次は、このEnumを使ってロジックを整理する『設計の楽しさ』を味わってください。応援しているよ。」


執筆者:伝説のチーフアーキテクト
(得意言語:VB.NET, C#, C++, SQL, 現場の火消し)

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