VBLex使ってVB6のソースコードのサイクロマチック数を解析する

サイクロマチック数=実行経路の数
という認識でいいのかな?まあ、プロジェクト内での相対的な複雑度が計測できればいいから、その定義が違ってもあまり問題にはならないだろう。

と、かなり適当だがとりあえず上記の認識でスクリプト書いてみた。

スクリプトは、標準入力の内容を読み込んでその解析結果を出力するようになっている。

以下のように実行する。

cscript analyze.wsf < hogehoge.cls

ためしに、vbUnit3の中の、Assert.cls というソースコードを食わせてみる。

c:\Users\snaka\work\lang\wsh\vblex>cscript analyze.wsf < vbUnit3\vbUnitFramework\Assert.cls
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


LINES   COMLEX  PROCEDURE
=====   ======  =========
1       1       IAssert_SetSeverity
1       1       IAssert_StopTesting
4       2       IAssert_Verify
6       2       IAssert_StringsEqual
5       2       IAssert_LongsEqual
5       2       IAssert_DoublesEqual
5       2       IAssert_CurrenciesEqual
21      8       IAssert_VariantsEqual
15      8       ToString
1       1       CountAssertion
4       2       IAssert_EnablePrintMsg
1       1       IAssert_DisablePrintMsg
3       2       IAssert_PrintMsg
1       1       IAssert_ClearTrace
1       1       IAssert_Trace
3       1       IResultUser_Init
1       1       BeforeSetup
2       1       BeforeTestMethod
3       1       IResultUser_Shutdown

結果から、Assert.clsの中で、特に IAssert_VariantsEqual() と ToString() の複雑度が高いことがわかる。
でも行数からして、20行程度なのでそんなに問題じゃないだろうということもわかる。