Skip to main content

Visual Studio 2012 自習書

第 2 回
Visual Studio 2012 を使ったコード分析

更新日: 2013 年 5 月 29 日

ダウンロード ( PDF、3.04 MB)


目次

  1. コード分析によるコード品質の向上
  2. コード分析のための準備
  3. ルールに基づく静的コード分析
  4. 複製されたコードの分析
  5. コードの保守容易性の分析
  6. 動的なコード分析 (プロファイリング)

1. コード分析によるコード品質の向上

開発プロジェクトにおける最大の成果物は "動くソフトウェア" であり、またその "ソース コード" でもあります。

一方で全く同じように "動くソフトウェア" であったとしても、「ユーザーからのフィードバックを受け、継続的に価値を提供し続けていく」という視点で考えた際に、メンテナンスが容易な "ソース コード" と、冗長なコードが多く、メソッド名がわかりづらい "ソース コード" では、ソフトウェアのライフサイクルを勘案した時に前者のほうがより価値があるのは明らかです。

開発プロジェクトにおいてはコードの品質向上のためには、コーディング規約を利用し、コード レビューによる相互チェックを行い、コードのメンテナス性を向上させます。
一方で、これらの取り組みは主に手動で行う必要があるため手間がかかるとともに、レビュー品質のばらつきや、チェックの漏れ等が発生してしまいます。

Visual Studio 2012 のソース コードの分析機能を使用すると、あらかじめ定めたルールに基づくコーディングが行われているか (静的コード分析)、似たようなコードが分散していないか (コード クローン分析)、保守性の観点からのコードの確認 (コード メトリックスの計測)、あるいは実行時のパフォーマンスに影響を与える箇所はどの部分か (プロファイリング分析)、といった分析をツールの支援を受けながら実施可能です。

Visual Studio 2012 試用版の入手方法

Visual Studio 2012 の試用版は無償で以下の Web サイトよりダウンロード入手いただけます。

(本自習書の内容をお試しいただくには Premium もしくは Ultimate の環境をご用意ください)

ページのトップへ


2. コード分析のための準備

このハンズオンでは、コード分析の対象として、オープン ソース (Apache ライセンス version 2.0) で公開されている 「Huo Chess (英語)」のプロジェクトを利用します。
コードは CodePlex のサイト (英語) から入手することも可能ですが、今回は Visual Studio 2012 にて、オンライン テンプレートとして公開されているコードを利用したいと思います。

Visual Studio 2012 を立ち上げ、「ファイル」「新規作成」「プロジェクト」を選択し、表示された「新しいプロジェクト」のウィンドウにおいて、"オンライン" の項目の "サンプル" を選択してください。
次に、ウィンドウの右上にある検索用のテキスト ボックスに "chess" と入力して検索を行い、その結果から Huo Chess を選択します (Huo Chess のプロジェクトは、C#、Visual Basic、C++ の 3 つの言語のバージョンが存在しますが、このハンズオンでは C# のプロジェクトを用いて解説を行います)

プロジェクトの名前に "MyChessGame" と入力し、OK ボタンを押してプロジェクトを作成します。

図 2.1 プロジェクトの名前 "MyChessGame" のプロジェクトを作成
図 2.1

この手順により、オンライン上のプロジェクト テンプレートを利用して、次のような構成でプロジェクト (およびソリューション) が作成されます。

図 2.2 作成されたプロジェクトの構成
図 2.2

どのようにコードが動作するかを確認するため、デバッグ実行を行います。
「デバッグ」「デバッグの開始」もしくは、F5 の押下により、デバッグを実行してください。

コンソール画面が立ち上がり、"w" もしくは "b" の入力が促されます (Chess の White と Black の選択です)。
"w" を入力し、その後の入力において "a" を入力してください。また、その後の入力として、"2"、"a"、"3" と入力してみてください。この一連の作業により、「White を選択」し、最初の手として「"a の 2" にあるコマを、"a の 3" に動かす」、といった動作が行われたことになります。

図 2.3 デバッグ実行 (コンソール画面)
図 2.3

今回のデバッグ実行では、この手に対してコンピューター (Black) が、可能な手の中から 「"a の 7" にあるコマを、"a の 5" に動かす」、という手を打ちました。

詳しくは Huo Chess のプロジェクトを作成した際に表示されたプロジェクトの概要 (description.html) に記述されていますが、Huo Chess ではコンピューター側の思考は "ミニマックス法" と呼ばれるアルゴリズムを利用しており、採用可能な手の中で最適な手を選択しつつゲームを進めます。

プログラムの概要を確認したところで、デバッグを終了してください (コンソールを閉じるか、Visual Studio 2012 で「デバッグ」「デバッグの停止」を選択 (もしくは Shift + F5))。

ページのトップへ


3. ルールに基づく静的コード分析

1 つ目のハンズオンとして、あらかじめ定義されているルールを利用し、作成されたコードがそのルールにのっとっているかどうかを判定する「静的コード分析」機能の使用法を確認します。

  1. Visual Studio 2012 のソリューション エクスプローラーにおいて、Huo Chess のプロジェクトを右クリックし、表示されたメニューから「プロパティ」を選択します。

    図 3.1: 「プロパティ」を選択
    図 3.1
  2. プロジェクトのプロパティが表示されるので、「コード分析」の項目をクリックし、「コード分析」に関連するプロパティ設定用のページを表示します。

    図 3.2: 「コード分析」に関連するプロパティ設定用のページ
    図 3.2
  3. ルール セットの選択において、「Microsoft のすべての規則」を選択し、変更したプロパティ情報をセーブします (Visual Studio 上部にある保存ボタンを押下、あるいは、「ファイル」「すべてを保存」を選択してください)。

    図 3.3: ルール セットの選択
    図 3.3
  4. 「分析」「ソリューションでコード分析を実行」を選択し、コードの静的分析を行います。

    図 3.4: 「ソリューションでコード分析を実行」を選択
    図 3.4
  5. コード分析のウィンドウに、分析結果が表示されます。

    図 3.5: コード分析結果
    図 3.5
  6. 2 つ目の警告を選択すると、ルール ベースにおける "CA1505" のルールに合致しないために警告が出たことがわかります。

    図 3.6: 2 つ目の警告
    図 3.6
  7. 警告メッセージの冒頭のルール番号をクリックしてください。

    図 3.7: 警告メッセージの冒頭のルール番号
    図 3.7
  8. ブラウザーが立ち上がり、このルールの詳細が表示されます。

    図 3.8: ルールの詳細が表示
    図 3.8

    Visual Studio 2012 では、マネージ コードの分析ルールとして、以下のカテゴリに基づき様々なツールを提供しています。

    デザイン上の警告.NET Framework デザイン ガイドラインの規定に従った適切なライブラリ デザインをサポートする警告です
    グローバリゼーションの警告国際対応のライブラリとアプリケーションをサポートする警告です。
    相互運用性の警告COM クライアントとの相互作用をサポートする警告です。
    保守性の警告ライブラリとアプリケーションの保守をサポートする警告です。
    モビリティの警告効率的な電力の使用法をサポートする警告です。
    名前付けの警告.NET Framework デザイン ガイドラインの名前付け規則の順守をサポートする警告です
    パフォーマンスの警告高パフォーマンスのライブラリとアプリケーションをサポートする警告です。
    移植性に関する警告異なるプラットフォーム間の移植性をサポートする警告です。
    信頼性の警告メモリやスレッドの適切な使用など、ライブラリとアプリケーションの信頼性をサポートする警告です。
    セキュリティの警告より安全なライブラリとアプリケーションをサポートする警告です。
    使用方法の警告.NET Framework の適切な使用をサポートする警告です。
    コード分析ポリシー エラーチェックインにおいてコード分析ポリシーに適合しない場合に発生するエラーです。

    なお、C++ によるネイティブ コードに関しても、静的コード分析機能を利用いただけます。詳しくは「 コード分析を使用した C/C++ コードの品質の分析」を参照してください。

  9. 適用されているルールの確認を行うため、プロジェクトのプロパティにおける「コード分析」のページにおいて、ルール セットの選択メニューの横にある「開く」ボタンを押下します。

    図 3.9: 「コード分析」のページ
    図 3.9
  10. 現在コード分析のルール セットとして指定している「Microsoft のすべての規則」に含まれるルールが表示されます。「グループ化」の選択において、「<なし>」を選択すると、適用中のルールを一覧にして確認することが可能です。

    図 3.10: 「<なし>」を選択
    図 3.10
  11. Visual Studio 2012 では、あらかじめ用意されているこれらのルールを利用しながら、開発者自身がルールのカスタマイズを行うことが可能です。「グループ化」の選択で、「カテゴリ」を指定し、カテゴリごとにまとめられたルールの中から Design、Globalization、Interoperability の 3 つのチェックを残し、その他のカテゴリのチェックを外してください。

    図 3.11: 「カテゴリ」を指定
    図 3.11
  12. 「保存」ボタンを押し、表示された「名前を付けて保存」のウィンドウにて、ファイル名として "MySubsetRule" と入力し、保存を行います。

    図 3.12: 「名前を付けて保存」のウィンドウ
    図 3.12
  13. 次に表示されているルール一覧の画面において、プロパティ用ボタン (レンチのマーク) を押下し、表示されたプロパティ ウィンドウにおいて、「説明」ならびに「名前」の項目を書き換えます。例えば「説明」として "TailSpin 開発プロジェクト用のルール、「名前」として "カスタマイズしたルール" と入力します。
    入力が終わりましたら、「保存」ボタンを押します。

    図 3.13-1: ルール一覧の画面プロパティ ウィンドウ
    図 3.13-1

    なお、「レンチ」のボタンはウィンドウ サイズによっては隠れている場合もあるので、その場合はルール一覧の画面の右上の端にある下向きの矢印をクリックし、隠れているメニューを展開後、そこから「レンチ」のメニューを選択してください。

    図 3.13-2: ルール一覧の画面の右上の端にある下向きの矢印をクリック
    図 3.13-2
  14. プロジェクトのプロパティの「コード分析」のページに戻り、ルール セットの選択メニューから「<参照>」を選択します。

    図 3.14: 「コード分析」のページ
    図 3.14
  15. 先ほど作成したルール セットを選択し、「開く」を押します。

    図 3.15: ルール セットを選択し、「開く」をクリック
    図 3.15
  16. ルール セットの選択メニューにて、作成した「カスタマイズしたルール」が表示されるので、選択を行います。

    図 3.16: 「カスタマイズしたルール」を選択
    図 3.16
  17. 作成したルールが選択されていることを確認し、「分析」「ソリューションでコード分析を実行」を行い、結果を確認してください。

    図 3.17: 「分析」→「ソリューションでコード分析を実行」を行い、結果を確認する
    図 3.17
  18. Visual Studio 2012 の静的コード分析では、このほかに定義されたルールを個別にカスタマイズ可能です。具体的には、個別のルールに関して、適用を行わない (「なし」) 、違反した場合に警告とする (「警告」) 、違反した場合にエラーとする (「エラー」) 、といった選択を行うことが可能です。

    図 3.18: 定義されたルールを個別にカスタマイズ可能
    図 3.18

以上で、1 つ目のハンズオンは終了です。

1 つ目のハンズオンでは、Visual Studio 2012 を使用した静的コード分析の活用方法として、以下の内容を確認しました。

  1. (1) プロジェクトのプロパティ設定におけるコード分析機能の設定
  2. (2) ソリューションに対する静的コード分析の実施
  3. (3) 静的コード分析における警告、エラー内容の確認
  4. (4) 静的コード分析のルールのカスタマイズ

ページのトップへ


4. 複製されたコードの分析

2 つ目のハンズオンでは、ソース コードの中に散在する "複製されたコード" を発見する、「コード クローン分析 (コード複製の分析)」機能の使用方法を確認します。
"複製されたコード"、は例えば、既存の機能に関連した機能を作成する際に、既存の機能の実装コードに拡張を行いたくない (すでに本番環境で動作しており、テストが終了しているコードに対して拡張を行いたくない) 場合などに、既存機能の実装コードを複製し、拡張機能に関してはそのコードをもとに実装を行う、といった作業を行ってしまうことにより増加することになります。

  1. Visual Studio 2012 の「分析」メニューから、「コード複製のソリューションの分析」を選択します。

    図 4.1: 「コード複製のソリューションの分析」を選択
    図 4.1
  2. 「コード複製分析結果」ウィンドウに、分析の結果が表示されます。分析結果は、「完全一致」、「強い一致」、「中間の一致」、「弱い一致」に分類されて表示されます。

    図 4.2: 「コード複製分析結果」ウィンドウ
    図 4.2
  3. 「強い一致」で表示されている最初の項目を右クリックし、表示されたメニューから「比較」を選択します。

    図 4.3: 「比較」を選択
    図 4.3
  4. 該当するコードが表示され、内容が同じ行は色付けなしで、内容が異なる行は色付けされた状態で表示されます。異なる行において、記述が完全に異なる場合は、強い色付けがされており、記述の一部のみが異なる箇所は薄い色付けで表示されます。

    図 4.4: 該当するコードが表示
    図 4.4
  5. コード複製分析のもう 1 つの実施方法として、任意のコードに対して似たコードがないかどうかを分析する方法があります。606 行目から 618 行目までを選択した状態で右クリックを押し、表示されたメニューにおいて「ソリューション内で一致する複製を検索」を選択します。

    図 4.5: 「ソリューション内で一致する複製を検索」を選択
    図 4.5
  6. 分析結果において「強い一致」の項目を展開し、「CheckForWhiteCheck」メソッドの行の上にマウスを移動すると、「CheckForWhiteCheck」メソッドにおける似たコードを確認することが可能です (画面ショットにおいて、付箋紙のような黄色の背景色をもったエリアで表示されているコード)。

    図 4.6: 画面ショット
    図 4.6

以上で、2 つ目のハンズオンは終了です。
2 つ目のハンズオンでは、Visual Studio 2012 によるコード複製の分析機能として、以下の内容を確認しました。

  1. (1) ソリューションに対するコード複製分析の実施
  2. (2) コードの比較機能を利用した複製分析の結果の確認方法
  3. (3) コードを起点とした複製コードの検索

コード複製分析は以下のようなシナリオにおいて活用できます。

  1. [1] 似たコードを見つけだし、リファクタリングによって共通のロジックをくくりだし、保守性を向上させる
  2. [2] バグの修正を行う際に、修正個所と同様のロジックを持つコードを見つけ出し、該当コードに対しても修正が必要かどうかを検討する。

ページのトップへ


5. コードの保守容易性の分析

3 つ目のハンズオンでは、コードの保守容易性を数値として計測するメトリックス計測の機能を確認します。

  1. Visual Studio 2012 の「分析」メニューから、「ソリューションのコード メトリックスを計算」を選択します。

    図 5.1: 「ソリューションのコード メトリックスを計算」を選択
    図 5.1
  2. 「コード メトリックスの結果」ウィンドウに、分析の結果が表示されます。分析結果は "プロジェクト"、"名前空間"、"クラス"、"メソッド" の階層で表示されます。

    図 5.2: コード メトリックスの結果
    図 5.2
  3. 分析結果の中で、CheckForBlackCheck メソッドの数値を確認します。CheckForBlackCheck メソッドは、計測された指標を右から確認すると、コードの行数が 109 行、クラスの結合 (メソッドにおける他のクラスの使用状況) が 0 であることがわかります。次の継承の深さはクラスに付与される情報であるため、CheckForBlackCheck メソッドでは値は表示されません。次に表示される "サイクロマティック複雑度" はカーネギーメロン大学において研究されたコードの複雑度を示す指標で、簡単に言えば if 文などによって分岐が増えれば増えるほど大きな値となる指標です。最後の "保守容易性インデックス" の値は、100 を最高値とし、保守性が低くなればなるほど小さな数値となるように計算された値です。

    図 5.3: CheckForBlackCheck メソッドの数値
    図 5.3

    これら数値の詳しい内容は、以下の MSDN ライブラリにてご確認ください。

  4. 次に、コードの保守性を改善するために、CheckForBlackCheck メソッドのリファクタリングを行います。CheckForBlackCheck メソッドの冒頭にある 606 行目から 618 行目までのメソッド (黒の King の位置を確認するためのメソッド) を選択し、右クリックで表示されるメニューから「リファクター」「メソッドの抽出」を選択します。

    図 5.4-1: CheckForBlackCheck メソッドのリファクタリング
    図 5.4-1

    ※ Visual Studio 2012 においては、Visual Basic 用のリファクタリング機能が適用されていません。Visual Basic においてリファクタリングを行う際はサードパーティが提供するリファクタリング ツールをご使用ください。例えば、Visual Studio の「ツール」メニューにある「拡張機能と更新プログラム」を選択し、"resharper" というキーワードで検索すると、Visual Basic に対してリファクタリング機能を提供する ReSharper というツールをダウンロードできます。

    図 5.4-2: "resharper" というキーワードで検索
    図 5.4-2
  5. 「メソッドの抽出」ウィンドウで、CheckBlackKingPosition と入力し、OK を押します。

    図 5.5: 「メソッドの抽出」ウィンドウ
    図 5.5
  6. 再度、「分析」メニューから、「コード複製のソリューションの分析」を実行すると、若干ではありますが保守容易性が改善された ("7" から "8" になった) ことが確認できます。

    図 5.6: 再度の「コード複製のソリューションの分析」実行結果
    図 5.6

以上で、3 つ目のハンズオンは終了です。
3 つ目のハンズオンでは、Visual Studio 2012 によるコード メトリックスの計測機能の利用として、以下の内容を確認しました。

  1. (1) コード メトリックスの計測の実施
  2. (2) メトリックス数値の確認方法
  3. (3) リファクタリングによるメソッドの抽出と、保守容易性数値向上の確認

ページのトップへ


6. 動的なコード分析 (プロファイリング)

4 つ目のハンズオンでは、プログラムを実行しながらコードの分析を行うプロファイリング機能を確認します。

  1. Visual Studio 2012 の「分析」メニューから、「パフォーマンス ウィザードの起動」を選択します。

    図 6.1: パフォーマンス ウィザードの起動
    図 6.1
  2. パフォーマンス ウィザードが立ち上がり、プロファイリングの方法の選択画面が表示されます。ここでは、「インストルメンテーション」を選択し、「次へ」を押します。

    図 6.2: パフォーマンス ウィザード ページ 1/3
    図 6.2

    なお、プロファイリング方法の詳細に関しては、以下の MSDN ライブラリをご確認ください。

  3. 次にプロファイリングを行う対象の選択画面が出てきますので、Huo Chess が表示、選択されていることを確認し、「次へ」を押します。

    図 6.3: パフォーマンス ウィザード ページ 2/3 (プロファイリングを行う対象の選択画面)
    図 6.3
  4. 最後に、「ウィザードの完了後にプロファイルを起動する」にチェックが入っていることを確認し、「完了」を押します。

    図 6.4: パフォーマンス ウィザード ページ 3/3
    図 6.4
  5. プロファイラがバックグラウンドで起動され、Huo Chess のコンソールが立ち上がります。

    図 6.5: Huo Chess のコンソール
    図 6.5
  6. 色の選択として "w" を、その次の手を "a"、"2"、"a"、"4" と入力します。

  7. コンピューターの思考が終わり手が確定したら、"b"、"2"、"b"、"3" と入力します。

  8. コンピューターの次の思考が終了したら、コンソールを閉じ、プロファイリング計測を終了します。

  9. Visual Studio 2012 がアプリケーション実行時に収集したプロファイリング データをまとめ、以下のような情報が表示されます (グラフの形や CPU 使用率の数値等は実行環境により異なります)。

    図 6.9: プロファイル レポート
    図 6.9

    グラフは、実行時間におけるリソース (CPU) の使用量グラフです。今回の Huo Chess の場合、人間が次の手を考えている時間はコンピューター側のリソース消費は多くありませんが、人間が手を入力したあとにコンピューター側の手を考えている際に、リソース消費が増大していることがわかります。

    また、グラフ下の表 ("ホット パス") では、プログラムを実行した際に呼び出されたメソッドの呼び出しの連鎖の中で、もっともコストがかかった (リソースを消費した) 呼び出しを表示しています。

  10. 出力結果の上部において、ビューの切り替えが可能です。「コール ツリー」のビューに切り替えを行います。

    図 6.10: 「コール ツリー」のビューに切り替え
    図 6.10
  11. 「コール ツリー」のビューでは、メソッドの呼び出し関係や、各メソッドの呼び出し回数、呼び出しにより消費された時間などが表示されます。また、メニュー上部にある、炎のアイコンを利用して、ホット パスの表示を行うことが可能です。

    図 6.11: 炎のアイコン
    図 6.11

以上で、4 つ目のハンズオンは終了です。
4 つ目のハンズオンでは、Visual Studio 2012 による動的なコード分析機能としてプロファイリング機能の利用方法を確認しました。

  1. (1) パフォーマンス ウィザードの起動
  2. (2) パフォーマンス ウィザードにおける設定項目の確認
  3. (3) パフォーマンス計測の実施
  4. (4) パフォーマンスの測定結果の確認 (概要ビュー)
  5. (5) 関数呼び出し関係の詳細表示 (コール ツリー ビュー)


Visual Studio 2012 自習書
シリーズ

  1. Visual Studio 2012 による単体テスト
  2. Visual Stusio 2012 を使ったコード分析
  3. Team Foundation Server のインストールと最初の一歩
  4. Web アプリケーションのテスト (前編)
  5. Web アプリケーションのテスト (後編)

一覧を見る >>

自習書 (Do-It-Yourself シリーズ)

一覧を見る >>

ページのトップへ