【VBAリファレンス】VBAオブジェクト指向プログラミングの実践:Excel将棋における駒クラスの単体テスト設計術

スポンサーリンク

概要

Excel VBAを用いた本格的な将棋プログラムの開発において、最も重要な基盤となるのが「駒クラス(clsPiece)」の設計です。オブジェクト指向プログラミング(OOP)を採用する場合、個々の駒が持つプロパティや移動ロジックが正しく機能することを保証しなければなりません。本稿では、複雑化しやすい将棋のルールを堅牢に保つための「単体テスト(Unit Testing)」の手法を解説します。VBAには標準でテストフレームワークが存在しませんが、イミディエイトウィンドウを活用したアサーション(表明)技術を駆使することで、開発効率とコードの信頼性を飛躍的に向上させることが可能です。

詳細解説:なぜ駒クラスにテストが必要なのか

将棋プログラムにおいて、駒の挙動は「移動可能か否か」という判定がすべてです。例えば、「歩」であれば前方に一歩、「飛車」であれば直線上に障害物がない限りどこまでも移動可能といったルールがあります。これらのロジックを直書きすると、後の仕様変更やバグ修正でコード全体が破綻します。

テストの目的は、以下の3点に集約されます。
1. 境界値の確認:盤面の端(1筋や9筋)で異常動作しないか。
2. 駒の干渉:味方の駒が既にいる場所に移動しようとしていないか。
3. 成り判定:敵陣に入った際に正しく成るロジックが働いているか。

VBAでこれを行うには、「テスト用プロシージャ」を別途作成し、期待値と実行結果が一致するかを判定する関数を用意するのが定石です。これにより、コードを改修するたびに「他の機能が壊れていないか」を瞬時に確認できる「回帰テスト」の環境が整います。

サンプルコード:駒クラスのテストスイート

以下は、駒の移動判定を検証するためのシンプルなテストフレームワークの雛形です。


' テスト用モジュール: modTestPiece
Option Explicit

' 単体テスト実行用プロシージャ
Public Sub RunPieceTests()
    Debug.Print "--- テスト開始: 駒クラス ---"
    
    ' 歩の移動テスト
    Call Test_Pawn_Movement
    
    ' 飛車の移動テスト
    Call Test_Rook_Movement
    
    Debug.Print "--- テスト終了 ---"
End Sub

' 歩の移動判定テスト
Private Sub Test_Pawn_Movement()
    Dim p As New clsPiece
    p.PieceType = "歩"
    p.Owner = 1 ' 先手
    
    ' 期待値: (5, 4)への移動はTrueであるべき
    Dim result As Boolean
    result = p.CanMove(5, 5, 5, 4)
    
    Call AssertTrue(result, "歩の通常移動テスト")
End Sub

' アサーション関数
Private Sub AssertTrue(condition As Boolean, testName As String)
    If condition Then
        Debug.Print "[PASS] " & testName
    Else
        Debug.Print "[FAIL] " & testName
    End If
End Sub

このコードでは、`clsPiece`クラスに`CanMove`メソッドが実装されていることを前提としています。`AssertTrue`のような判定用メソッドを用意することで、テスト結果をイミディエイトウィンドウに可視化し、デバッグの時間を最小化します。

実務アドバイス:VBAにおけるテストの極意

ベテランの視点からアドバイスを贈るならば、テストコードは「製品コードと同じくらい丁寧に書く」ことを強く推奨します。

1. **モックオブジェクトの活用**:盤面クラス(clsBoard)全体をテストに巻き込むと依存関係が複雑になります。駒クラスのテストでは、盤面の一部を切り出したデータ構造だけを引数に渡すように設計しましょう。
2. **テストデータはExcelシートに持たせる**:移動パターンのテストデータ(始点、終点、期待結果)をExcelシートに書き出し、それをVBAから読み込んでループ処理でテストを実行するようにしてください。こうすることで、コードを書き換えることなく、新しいテストケースを追加できます。
3. **カバレッジを意識する**:すべての移動パターン(特に斜め移動や飛び越え判定)を網羅するテストケースを作成してください。将棋のような論理パズルでは、99%のテスト通過は意味をなしません。100%のロジック網羅を目指すのがプロの仕事です。

まとめ

VBAで将棋プログラムを作るという試みは、言語の限界に挑戦する非常に知的なプロジェクトです。駒クラスの単体テストを導入することは、単なるバグ除けではありません。それは、自分の書いたアルゴリズムに対して「論理的な証明」を与えるプロセスに他なりません。

今回紹介したアサーションの手法をベースに、さらに複雑な「成り」や「持ち駒」のテストへと発展させてください。VBAは決して古い言語ではありません。クラスモジュールとテストの概念を正しく組み合わせれば、Excel上で動作する最高レベルの将棋エンジンを構築することも十分に可能です。まずは、今書いている駒の移動ロジックに一つ、テストケースを追加することから始めてみてください。その一歩が、堅牢なプログラムへの分かれ道となります。

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