VBScriptを「使い捨て」で終わらせるな:Class構文で構築する堅牢な業務自動化アーキテクチャ
VBScriptは、しばしば「スパゲッティコードの温床」と揶揄されます。数千行のサブルーチンが連なり、グローバル変数がスクリプトの至る所で書き換えられ、一度バグが出れば誰も修正できない――そんな「動くが触れない遺産」を、多くの現場で見かけます。
もしあなたが業務自動化の担当者なら、今すぐそのスタイルを捨てるべきです。VBScriptはレガシーですが、`Class` 構文を正しく使えば、極めて高い保守性と再利用性を持つ堅牢なツールへと昇華させることが可能です。
本記事では、VBScriptにおける「疑似オブジェクト指向」の核心と、現場で生き残るための設計思想を伝授します。
—
1. なぜ「手続型」では限界が来るのか
VBScriptで記述される多くの自動化ツールは、手続きを上から順に並べただけのものになりがちです。しかし、ファイル操作、データベース接続、ログ出力といった「共通的な振る舞い」を関数単位で切り出しても、それらを制御する「状態」をグローバル変数に頼る限り、複雑さは指数関数的に増大します。
クラス(Class)を使う目的は、機能と状態を一つの「箱」に閉じ込め(カプセル化)、外部からの不正な干渉を防ぐことにあります。
—
2. 堅牢なクラス設計の基本ルール
VBScriptの `Class` 構文はシンプルですが、以下の原則を守るだけでコードの質は劇的に変わります。
- Public変数を追放せよ: プロパティ以外の外部からの値変更を許可してはいけません。
- 初期化と解放を制御せよ: `Class_Initialize` と `Class_Terminate` を使い、リソースのオープン・クローズを確実に保証します。
- エラーの責任を明確にせよ: クラス内でエラーを握りつぶさず、呼び出し元へ適切に伝搬させるか、クラス自身の状態を「失敗」に遷移させる設計にします。
—
3. 実践:保守性の高い「FileLogger」クラス
実務で最も多用する「ログ出力」を例に、プロダクションレベルのコードを示します。このクラスは、ファイルハンドルを隠蔽し、利用者には「書き込む」というインターフェースのみを提供します。
‘ — FileLoggerクラス定義 —
Class FileLogger
Private fso, ts
Private m_FilePath
‘ コンストラクタ:初期化時にファイルパスを確定させる
Private Sub Class_Initialize()
Set fso = CreateObject(“Scripting.FileSystemObject”)
End Sub
‘ デストラクタ:スクリプト終了時に確実にファイルを閉じる
Private Sub Class_Terminate()
If IsObject(ts) Then ts.Close
Set ts = Nothing
Set fso = Nothing
End Sub
‘ プロパティ設定:ログパスを指定(Letは代入時に実行される)
Public Property Let FilePath(ByVal strPath)
m_FilePath = strPath
End Property
‘ ログ書き込みメソッド
Public Sub WriteLog(ByVal message)
‘ 状態チェック:パスが未設定ならエラーを投げるべき
If m_FilePath = “” Then Err.Raise 9001, , “ログパスが設定されていません。”
‘ 追記モードで開く
Set ts = fso.OpenTextFile(m_FilePath, 8, True)
ts.WriteLine “[” & Now & “] ” & message
ts.Close
End Sub
End Class
‘ — 利用例 —
Dim logger
Set logger = New FileLogger
logger.FilePath = “C:\Temp\process.log”
logger.WriteLog “業務処理を開始します。”
Set logger = Nothing ‘ ここでClass_Terminateが走る
このコードが「プロ仕様」である理由
1. リソースの自動解放: `Class_Terminate` を活用することで、スクリプトがどこで終了しても `ts.Close` が確実に呼ばれます。これにより「ファイルが使用中です」というエラーを回避できます。
2. カプセル化: `fso` や `ts` といった内部オブジェクトは `Private` であり、外部から直接触ることはできません。設計者が意図しない操作を防げます。
—
4. 業務自動化における注意点:データベース連携
データベース接続(ADODB.Connection)を扱う場合、特にこのクラス化が威力を発揮します。
- 接続情報の隠蔽: 接続文字列をクラス内に隠蔽し、利用者は `Open()` メソッドを呼ぶだけで済むようにします。
- 接続の生存確認: `Class_Terminate` で、スクリプトが異常終了しても必ず `Connection.Close` を呼ぶように実装してください。これにより、DB側のセッション残留を防ぎ、DB負荷を軽減できます。
—
最後に:なぜ今、あえてVBScriptなのか
「今時Pythonではないのか?」という問いに対する答えは明確です。「配布の容易さ」と「環境依存の少なさ」です。VBScriptは、OSに何もインストールせずとも、即座に、かつ確実に動作します。
その強みを最大限に活かすために、クラスという「規律」を導入してください。一度この設計思想をマスターすれば、あなたの書くスクリプトは単なる「使い捨てツール」から、チームの資産となる「業務自動化基盤」へと進化します。
今すぐ、既存のコードから手続き型の断片を拾い上げ、クラスの中に収めてみてください。その瞬間に、あなたのエンジニアとしての視座が一段階引き上げられるはずです。
