こんにちは、後輩諸君。ようこそプロフェッショナルの入り口へ。
世界中の基幹システムを支え、数多の自動化を成し遂げてきたチーフアーキテクトだ。
君たちが「マクロの記録」を卒業し、自分の意志でコードを書き始めたことは非常に喜ばしい。だが、一つだけ忠告しておこう。
「動けばいい」だけのコードは、数ヶ月後の自分への「呪い」に変わる。
今日は、その呪いを解くための最も基本的で、かつ最も強力な武器である「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, 現場の火消し)
