次の方法で共有


Code Advisor for Visual Basic 6 にコード検証ルールを追加する

Microsoft Corporation

February 2003

適用対象:
   Visual Basic 6.0
   Visual Basic .NET

要約: この記事では、Code Advisor for Visual Basic 6.0 にコード検証ルールを追加する方法を説明します。Code Advisor には、標準的なコーディングおよびコーディングのアップグレード時によく発生する多くの問題を検証できるように、一連のルール が用意されています。Code Advisor Rule Development アプリケーションを使用すると、必要に応じて他の問題点に関するルールを追加できます。

こちらから Code Advisor for Visual Basic 6.0 をダウンロードできます。

目次

はじめに
新しいルールを作成する
作成したルールをテストする
ルールを配布する
付録 A : テキスト検索 ハンドラ

はじめに

Code Advisor for Visual Basic 6 は、Visual Basic 6 プロジェクト内のコードを検証し、Visual Basic .NET へのアップグレードを行う際に問題となる点にフラグを付けるアドインプログラムです。このアドインプログラムは、拡張可能な一連のルールを使用してプロジェクト内またはモジュール内のコードを評価し、次に、コードの中に "FIXIT" コメントを挿入します。Code Advisor Rule Development アプリケーションを使って新しいルールを定義できます。

Code Advisor は、ルールとハンドラという 2 つの重要な概念に基づく拡張可能なアーキテクチャを採用しています。

「ルール」とは、永続化されたパラメータ値と、ハンドラへの参照からなるセットです。ハンドラは、 Visual Basic 6 プロジェクトの中で、ルールで定義された条件を満たす問題点を検索します。たとえば、 " 下限が 0 でない配列はサポートされていません。 " というルールがあります。このルールは、ゼロ以外の下限の値を持つ配列のインスタンスを検索します。この条件を満たすコード行が見つかった場合は、その行の直前にコメントが挿入され、その問題点がレポートに記録されます。開発者はそのリストで各プロジェクトをチェックすることができます。ルールの中には、コード上には表れない問題に関係するものもあります。このようなルールは、レポートにコメントを挿入するだけです。

「ハンドラ」 は、ルールが実装できるインタフェースを提供する COM DLL です。Code Advisor のすべてのハンドラは、 Visual Basic の .dll ファイルとして実装されています。これらの .dll ファイルは、 Visual Basic 6 機能拡張オブジェクト モデル、および Code Advisor で提供されるユーティリティ プロシージャのライブラリにアクセスできます。汎用ハンドラである Code Advisor のテキスト検索ハンドラは汎用ハンドラであり、開発者は Visual Basic Scripting Edition (VBScript) の正規表現を使用して、コードの検索とコメントの挿入を行うルールを定義できます。

新しいルールを作成する

以下の例では、GoSub キーワードを使用しているあらゆるコードを見つけてフラグを付ける、という新しいルールを追加して、ルール セットを拡張する方法を説明します。

ルールを追加するには

1. Code Advisor Rule Development アプリケーションを起動します。既定では、[スタート] メニューの [Code Advisor for Visual Basic 6] グループにアプリケーションのショートカットが表示されます。

このアプリケーションでは、定義済みのカスタム ルールが表示されます。カスタム ルールが1つもない場合、[ルール] リスト ボックスには何も表示されません。

メモ Code Advisor Rule Development アプリケーションは、セットアップ時に [完全] インストール オプションを選択すると自動的にインストールされます。このアプリケーションがインストールされていない場合は、Code Advisor アドイン プログラムをいったんアンインストールし、[完全] オプションを選択して再インストールする必要があります。

2. [追加] ボタンをクリックします。

3. [ルールの追加] ダイアログ ボックスで、[新しいルール名] フィールドを選択し、「GoSub は推奨されません」と入力します。

4. [新しいルールの説明] フィールドを選択し、「GoSub は推奨される構造ではありません。代わりに If/Then 構造または Case 構造を使用してください。」と入力します。

5. [OK] ボタンをクリックし、ダイアログ ボックスを閉じます。

新しいルールを保存したら、次はルールの動作を指定します。

ルールの動作を指定するには

1. [全般] タブを選択します。

2. [ルールの重要度] フィールドで、「2」を入力します。

重要度 2 は問題が軽微であることを示します。重要度 1 は、問題が重要であるか、アーキテクチャ上の問題であることを示します。Code Advisor のレポートでは、重要度の高い順に問題がリストされます。

3. [ルールが有効になっています] チェック ボックスをオンにします。

この指定によって、ルールが既定で有効になります。Code Advisor の [FixIt フィルタ] ダイアログ ボックスを使用して、ルールの有効/無効を実行時に変更できます。

4. [使用できるプロファイル] リストから [Best Practices] を選択し、他のプロファイルの選択をすべて解除します。

このように指定すると、ユーザーが [Best Practices] を選択したときのみルールが有効になります。

5. [ハンドラ] タブを選択して、[ルールパラメータの編集] ボタンをクリックします。[テキスト検索ハンドラ パラメータ] ダイアログ ボックスが表示されます。

6. [正規表現パターンのターゲット] フィールドで、「¥bGoSub¥b」と入力します。

"¥bGoSub¥b" は VBScript の正規表現です。この "¥b" は、それで囲んだ単語と完全に一致する単語の検索を指定します。正規表現の詳細については、MSDN Library (msdn.microsoft.com/library/) で「Microsoft Beefs Up VBScript with Regular Expressions」(英語) の記事を参照してください。

7. [注釈] フィールドで、「GoSub は推奨される方法ではありません。別の言語構造を使用してください」と入力します。

8. [ターゲットが見つかったときに注釈を挿入] チェック ボックスをオンにします。

このチェック ボックスをオンにすると、[正規表現パターンのターゲット] フィールドに入力した表現と一致したときに"FIXIT" のコメントが挿入されます。このチェック ボックスをオフにした場合は、正規表現のパターンと一致するものが検出されなかったときのみコード モジュールの一番上にコメントが挿入されます。たとえば、"Option Explicit" が検出されなかったときにコメントを挿入するといった場合に使用します。

9. [‘¥M’ターゲットを単語単位でのみ挿入] チェック ボックスをオフにします。

¥M トークンを使用すると、一致した文字列をコメントに挿入することができます。このチェック ボックスは、一致した文字列の中で最初の単語だけを置き換えるのか、それとも一致した文字列全体を置き換えるかを決定します。たとえば、見つかった検索対象が " GoSub SaveFile" (正規表現は ¥bGoSub¥b¥s¥w) の場合、このオプションで置き換わるのは "GoSub" だけです。このオプションがオフの場合は、"GoSub SaveFile" 全体が置き換わります。この例では、1 つの文字列だけを検索するルールにしているため、単純にコメント全体がハードコーディングされます。

10. [OK] ボタンをクリックしてダイアログ ボックスを閉じてから、[保存] ボタンをクリックして変更を保存します。

作成したルールをテストする

"GoSub" というルールを作成したら、次はそのルールのテストを行います。

作成したルールをテストするには

1. Visual Basic 6 を起動します。

メモ Visual Basic 6 が既に起動している場合は、それを再起動するか、アドイン プログラムをいったんアンロードして再ロードしないと、作成したルールは有効になりません。

2. [Code Advisor] ツールバーの[FixIt ルールのフィルタ] ボタンをクリックします。

3. [FixIt フィルタ] ダイアログ ボックスで、「Best Practices」プラットフォームが選択され、作成したルール ( GoSub は推奨されません) が選択されていることを確認します。

4. [OK] ボタンをクリックし、ダイアログ ボックスを閉じます。

5. 次のように、GoSub 構成を含むプロシージャを新しく作成します。

Public Sub TestGoSub()
    If Hour(Now) = 12 Then
        GoSub Noon
    End If
    Exit Sub
Noon:
    MsgBox "Time to eat!"
End Sub

6. [Code Advisor] ツールバーの [FixIt の追加] ボタンをクリックします。

"GoSub は推奨される方法ではありません。別の言語構造を使用してください" という GoSub に関するコメントが、コードの中の GoSub を含む行の上に挿入されます。

7. [Code Advisor] ツールバーの [FixIt レポートの表示] ボタンをクリックします。

GoSub に関する問題点は、重要度レベル 2 を示しています。

ルールを配布する

作成したルールをテストしたら、そのルールを他の開発者と共有することができます。ルールの共有は、.bag ファイルを配布して行います。Code Advisor は、Visual Basic のビルトイン プロパティ バッグ永続性モデルを利用して、各ルールに関連するデータを .bag 拡張子の付いたファイルに保存します。

Code Advisor アドイン プログラムがロードされると、インストール ディレクトリ内の .bag ファイルが検索されます。すべての .bag ファイルが処理され、各 .bag ファイル に含まれているルールがロードされます。

Code Advisor に同梱されている標準ルールは、LocalRules.bag というファイルで定義されています。Code Advisor Rule Development を使って作成したカスタム ルールは、CustomRules.bag という名前のファイルに格納されます。

ルールを配布するには

1. [エクスプローラ]で、Code Advisor for Visual Basic 6 ディレクトリに移動します。既定の場所は、C:\Program Files\Code Advisor for Visual Basic 6 です。

2. CustomRules.bag ファイルをフロッピー ディスクなどの記録メディアにコピーして配布するか、ネットワークで共有します。

3. 配布先のマシンにある既存の CustomRules.bag ファイルが上書きされないように、ファイルを別の名前で保存します (例 : Myrules01.bag)。

4. 別名で保存したファイルを、配布先マシンの Code Advisor for Visual Basic 6 ディレクトリにコピーします。

次に Code Advisor をロードした時点で、名前変更後の .bag ファイルに含まれるすべてのルールが有効になります。

付録 A : テキスト検索ハンドラ

Code Advisor Rule Development ツールで作成したルールは、テキスト検索ハンドラを使用します。テキスト検索ハンドラは、VBScript RegExp オブジェクトを使用して正規表現検索を行います。したがって、新しいルールを作成する上で、VBScript の正規表現の構文と使用方法に関する実際的な知識を持っていることが必要条件になります。VBScript の正規表現の詳細については、MSDN Library (msdn.microsoft.com/library/) で「Microsoft Beefs Up VBScript with Regular Expressions」(英語) の記事を参照してください。

メモ 各国対応の変数名をサポートするため、単語全体に一致する "¥w" を含む式の利用を避けてください。この表現パターンは、特定の Unicode 文字でコーディングしている場合には期待どおりに動作しません。

ヒント 既定では、VBScript の正規表現は英字の大文字と小文字を区別します。大文字と小文字を区別させないようにするには、VBScript の RegExpIgnoreCase プロパティを "True" に設定します。

テキスト検索ハンドラは、出荷時に組み込まれている Code Advisor の標準ルールでも使用されています。以下の例は、それらの標準ルールのパラメータです。これらは、Code Advisor Rule Development ツールでカスタム ルールを作成するときに [パラメータ概要] フィールドに表示されるものと同じです。Target パラメータはルールの正規表現を表します。

Option Explicit がありません。

Target="Option Explicit"
Remark="Variant 型の変数の暗黙的な作成を避けるには、Option Explicit を使用します。"
RemOnMatch="False"
TargetWholeWord="False"

下限が 0 でない配列はサポートされていません。

Target="(?:(Dim|Private|Public|Dim WithEvents|Private WithEvents|Public WithEvents|ReDim|ReDim Preserve|Static) \S+\(([^0].*|.*[^0]) To .*)"
Remark="下限が 0 でない配列は Visual Basic .NET でサポートされていません。"
RemOnMatch="True"
TargetWholeWord="False"

As Any はサポートされていません。

Target="\(.*As Any.*\)"
Remark="As Any は Visual Basic .NET ではサポートされていません。特定の型を使用してください。"
RemOnMatch="True"
TargetWholeWord="False"

キーワードがサポートされていません。

Target="(\ bRightB\$?\()|(\bLeftB\$?\()|(\ bMidB\$?\()|(\bChrB\$?\()|(\ bChrW\$?\()|(\bDefBool \S+)|(\ bDefByte \S+)|(\bDefInt \S+)|(\ bDefLng \S+)|(\bDefCur \S+)|(\ bDefSng \S+)|(\bDefDbl \S+)|(\ bDefDec \S+)|(\bDefDate \S+)|(\ bDefStr \S+)|(\bDefObj \S+)|(\ bDefVar \S+)|(\bDefBool \S+)|(\ bDefByte \S+)|(\bDefInt \S+)|(\ bDefLng \S+)|(\bDefCur \S+)|(\ bDefSng \S+)|(\bDefDbl \S+)|(\ bDefDec \S+)|(\bDefDate \S+)|(\ bDefStr \S+)|(\bDefObj \S+)|(\ bDefVar \S+)|(?:\bObjPtr\()|(?:\ bVarPtr\()|(?:\bStrPtr\()|(?:\ bGoSub \S+)"
Remark="キーワード '\M' は Visual Basic .NET ではサポートされていません。"
RemOnMatch="True"
TargetWholeWord="True"

Return は新しい意味を含んでいます。

Target="\ bReturn(\s.*|$)"
Remark="Return は Visual Basic .NET では新しい意味を含んでいます。"
RemOnMatch="True"
TargetWholeWord="True"

Option Base 1 はサポートされていません。

Target="(?:\ bOption Base 1)"
Remark="Option Base 1 は Visual Basic .NET ではサポートされていません。"
RemOnMatch="True"
TargetWholeWord="False"

On ... GoTo はサポートされていません。

Target="(?:\bOn\s[^E]+[^r]*[^r]*[^o]*[^r]*\ sGoTo\s)"
Remark="On ... GoTo は Visual Basic .NET ではサポートされていません。"
RemOnMatch="True"
TargetWholeWord="False"

'#If' ブロックは正しくアップグレードされません。

Target="#If|#End If|#ElseIf|#Else"
Remark="'\M' は正しく Visual Basic .NET にアップグレードされません。"
RemOnMatch="True"
TargetWholeWord="False"

プリンタ オブジェクトおよびプリンタ コレクションはアップグレードされません。

Target="\bPrinters\b|\bAs Printer\b|\bSet Printer\b| = Printer\b|\bPrinter\b.\w+"
Remark="プリンタ オブジェクトおよびプリンタ コレクションは、アップグレード ウィザードで Visual Basic .NET にアップグレードされません。"
RemOnMatch="True"
TargetWholeWord="False"

フォーム コレクションはアップグレードされません。

Target="\bForms\b "
Remark="フォーム コレクションは、アップグレード ウィザードで Visual Basic .NET にアップグレードされません。"
RemOnMatch="True"
TargetWholeWord="False"

クリップボードはアップグレードされません。

Target="(\bClipboard\b[.])|(\S+\sAs\s\bClipboard\b)"
Remark="クリップボード オブジェクトは、アップグレード ウィザードで Visual Basic .NET にアップグレードされません。"
RemOnMatch="True"
TargetWholeWord="False"