コード マップを使用して依存関係をマップする

この記事では、コード マップを使用してコード全体の依存関係を視覚化する方法について学習します。

コード マップとは何か

Visual Studio では、コード マップを利用すると、ファイルやコード行を読まなくても、プログラム コードの適性を簡単に確認できます。 こうしたマップを利用することで、構造、依存関係、更新方法など、コード内の編成と関係を確認し、提案された変更のコストを見積もることができます。

View dependencies with code maps in Visual Studio

次の言語でコードの依存関係をマップできます。

  • ソリューションまたはアセンブリ ( .dll または .exe) の Visual C# または Visual Basic

  • Visual C++ プロジェクト、ヘッダー ファイル ( .h または #include)、またはバイナリのネイティブまたはマネージド C コードまたは C++ コード

  • Microsoft Dynamics AX の .NET モジュールから作られた X++ プロジェクトおよびアセンブリ

注意

C# または Visual Basic 以外のプロジェクトの場合、コード マップを開始したり、既存のコード マップに項目を追加したりするためのオプションは少なくなります。 たとえば、C++ プロジェクトのテキスト エディター内のオブジェクトを右クリックすることも、コード マップにそのオブジェクト追加することもできません。 ただし、ソリューション エクスプローラークラス ビュー、およびオブジェクト ブラウザーから、個々のコード要素またはファイルをドラッグ アンド ドロップできます。

前提条件

Visual Studio でコード マップを作成するには、最初にコード マップライブ依存関係検証の各コンポーネントをインストールします

コード マップの作成および編集には、Visual Studio Enterprise エディションが必要です。 ただし、Visual Studio Community および Professional エディションでは、Enterprise エディションで生成されたダイアグラムを開くことはできますが、編集することはできません。

注意

Visual Studio Enterprise で生成されたマップを、Visual Studio Professional を使用する他のユーザーと 共有する前に、マップ上のすべての項目 (非表示の項目、展開されたグループ、グループ間リンクなど) が表示されていることを確認してください。

コード マップを追加する

空のコード マップを作成し、それにアセンブリ参照、ファイル、フォルダーなどの項目をドラッグすることも、ソリューションの全体または一部のコード マップを生成することもできます。

空のコード マップを追加するには:

  1. ソリューション エクスプローラーで、最上位のソリューション ノードのショートカット メニューを表示します。 [追加]>[新しい項目] の順に選択します。

  2. [新しい項目の追加] ダイアログで、 [インストール済み] の下の [全般] カテゴリを選択します。

  3. [有向グラフのドキュメント (.dgml)] テンプレートを選択してから、 [追加] を選択します。

    ヒント

    このテンプレートはアルファベット順に表示されないことがあるため、確認できない場合はテンプレート一覧の最後まで下にスクロールします。

    空のマップが、現在のソリューションの [ソリューション項目] フォルダーに表示されます。

同様に、ソリューションに追加せずに新しいコード マップ ファイルを作成するには、 [アーキテクチャ]>[新しいコード マップ] または [ファイル]>[新規作成]>[ファイル] の順に選択します。

詳細情報:

ソリューションのコード マップを生成する

ソリューション内のすべての依存関係を表示するには:

  1. メニュー バーで、 [アーキテクチャ]>[ソリューションのコード マップを生成] の順に選択します。 前回のビルド以降にコードを変更していない場合は、 [アーキテクチャ]>[ビルドなしでソリューションのコード マップを生成] を選択できます。

    Generate a code map command

    最上位レベル アセンブリとそれらの間の集約されたリンクを示すマップが生成されます。 集約リンクを広げると、表される依存関係が多くなります。

  2. コード マップ ツールバーの [凡例] ボタンを使用して、プロジェクトの種類のアイコン (テスト プロジェクト、Web プロジェクト、Phone プロジェクトなど)、コード項目 (クラス、メソッド、プロパティなど)、および関係の種類 (継承元、実装、呼び出しなど) のリストを表示または非表示にします。

    Top-level dependency graph of assemblies

    このソリューション例には、ソリューション フォルダー ([テスト][コンポーネント])、テスト プロジェクト、Web プロジェクト、およびアセンブリが含まれています。 既定では、コンテインメイト リレーションシップはすべて、展開および折りたたみができる グループとして表示されます。 [外部] グループには、プラットフォームの依存関係など、ソリューションの外部のものがすべて含まれます。 外部アセンブリには、使用中の項目のみが表示されます。 既定では、視認性を高めるため、システムの基本型はマップに表示されません。

  3. マップをドリル ダウンするには、プロジェクトおよびアセンブリを表すグループを展開します。 CTRL キーを押しながら A キー を押してすべてのノードを選択し、ショートカット メニューから [グループ][展開] の順に選択すると、すべてを展開できます。

    Expanding all groups in a code map

  4. ただし、これは大規模なソリューションには不向きな場合があります。 実際、複雑なソリューションでは、メモリ制限のためにすべてのグループを展開できない場合があります。 代わりに、個々のノードを展開して内部を表示します。 マウス ポインターをノード上に移動し、シェブロン (下矢印) が表示されたらクリックします。

    Expanding a node in a code map

    または、キーボードを使用して項目を選択し、プラス キー ( + ) を押します。 さらに深いレベルのコードを確認するには、名前空間、型、およびメンバーに対して同じ操作を行います。

    ヒント

    マウス、キーボード、およびタッチを使用したコード マップ操作の詳細については、「コード マップの参照および再配置」を参照してください。

  5. マップを簡略化し個々の部分に注目するには、コード マップ ツールバーで [フィルター] を選択し、必要なノードおよびリンクの種類だけを選択します。 たとえば、すべてのソリューション フォルダーとアセンブリのコンテナーを非表示にできます。

    Simplify the map by filtering containers

    個々のグループおよび項目をマップで非表示にしたりマップから削除したりして、マップを簡略化できます。この操作は、基のソリューション コードには影響を与えません。

  6. 項目間のリレーションシップを表示するには、マップでそれらを選択します。 リンクの色は、 [凡例] ウィンドウの表示に対応しており、リレーションシップの種類を表しています。

    View dependencies across your solutions

    この例で、紫色のリンクは呼び出し、点線のリンクは参照、および薄青色のリンクはフィールド アクセスを表しています。 緑色のリンクは継承を表す場合もありますが、複数のリレーションシップ (または カテゴリ ) の種類を表す 集約リンクの可能性もあります。

    ヒント

    緑色のリンクが表示されている場合、単に継承関係の存在のみを示しているわけではない可能性があります。 メソッドの呼び出しも存在する場合がありますが、これらは継承関係によって非表示になっています。 特定の種類のリンクを表示するには、 [フィルター] ウィンドウ内のチェック ボックスを使用して、必要のない種類を非表示にします。

  7. 項目またはリンクに関する詳細情報を確認するには、ポインターをその項目の上に移動してツールヒントを表示します。 これにより、コード要素またはリンクが表すカテゴリの詳細が表示されます。

    Show the categories of a relationship

  8. 集約リンクによって表される項目と依存関係を調べるには、最初にリンクを選択して、そのショートカット メニューを開きます。 [寄与するリンクの表示] または [新しいコード マップ上の寄与するリンクの表示]をクリックします。 これにより、リンクの両端のグループが展開され、リンクに関係する項目と依存関係のみが表示されます。

  9. マップの特定の部分に注目するために、必要のない項目を継続的に削除することができます。 たとえば、クラス ビューとメンバー ビューを詳細表示するには、 [フィルター] ウィンドウですべての名前空間ノードをフィルター処理するだけです。

    Drilling down to class and member level

  10. 複雑なソリューション マップで必要な項目に注目するもう 1 つの方法は、既存のマップから、選択した項目を含む新しいマップを生成することです。 Ctrl キーを押しながら注目する項目を選択し、ショートカット メニューを開き、 [選択項目から新しいグラフを作成] をクリックします。

    Show selected items on a new code map

  11. 含んでいるコンテキストは、新しいマップに引き継がれます。 [フィルター] ウィンドウを使用して、ソリューション フォルダーや表示する必要のない他のすべてのコンテナーを非表示にします。

    Filter the containers to simplify the view

  12. グループを展開し、リレーションシップを表示するマップ内の項目を選択します。

    Select items to view the relationships

こちらもご覧ください。

依存関係の表示

保留中の変更が含まれるいくつかのファイルでコード レビューを行うとします。 これらの変更の依存関係を表示するため、これらのファイルからコード マップを作成できます。

Show specific dependencies on a code map

  1. ソリューション エクスプローラーで、マップするプロジェクト、アセンブリ参照、フォルダー、ファイル、型、またはメンバーを選択します。

    Select the items you want to map

  2. ソリューション エクスプローラーのツールバーで、[コード マップに表示]Create New Graph From Selected Nodes Button ボタン をクリックします。 または、1 つまたは 1 グループの項目のショートカット メニューを開き、 [コード マップに表示] をクリックします。

    ソリューション エクスプローラークラス ビュー、またはオブジェクト ブラウザーから新規または既存のコード マップに項目をドラッグすることもできます。 項目の親階層を含めるには、Ctrl キーを押したまま項目をドラッグするか、コード マップ ツールバーで [親を含める] ボタンを使用して既定のアクションを指定します。 また、Visual Studio の外部 (Windows エクスプローラーなど) からアセンブリ ファイルをドラッグすることもできます。

    注意

    Windows Phone または Microsoft ストアなどの複数のアプリで共有されるプロジェクトから項目を追加すると、その項目は、現在アクティブなアプリ プロジェクトと共にマップに表示されます。 コンテキストを別のアプリ プロジェクトに変更し、共有プロジェクトからさらに項目を追加した場合、その項目は、新しくアクティブになったアプリ プロジェクトと共に表示されます。 マップ上の項目に実行する操作は、同じコンテキストを共有する項目にのみ適用されます。

  3. アセンブリ内の選択した項目がマップに表示されます。

    Selected items shown as groups on the map

  4. 項目を確認するには、その項目を展開します。 マウス ポインターを項目の上に移動し、シェブロン (下矢印) アイコンが表示されたらクリックします。

    Expand a node in a code map

    すべての項目を展開するには、Ctrl+A キーを使用してそれらを選択してから、マップのショートカット メニューを開いて、 [グループ]>[展開] の順にクリックします。 ただし、すべてのグループを展開すると使用に適さないマップになったりメモリの問題が発生したりする場合、このオプションは使用できません。

  5. 確認したい項目を、必要に応じてクラスやメンバーのレベルまで展開します。

    Expand groups to class and member level

    コードに含まれているのにマップに表示されていないメンバーを表示するには、グループの左上にある [子の再フェッチ] アイコン Refetch Children Icon アイコン をクリックします。

  6. マップ上の項目に関連する項目をさらに表示するには、1 つを選択し、コード マップ ツールバーで [関連表示] を選択して、マップに追加する関連項目の種類を選択します。 あるいは、1 つまたは複数の項目を選択し、ショートカット メニューを開いてから、マップに追加する関連項目の種類の [表示] オプションを選択します。 次に例を示します。

    アセンブリの場合、次のように選択します。

    オプション 説明
    参照されるアセンブリの表示 このアセンブリの参照先のアセンブリを追加します。 外部アセンブリは [外部] グループに表示されます。
    参照元のアセンブリの表示 このアセンブリを参照するソリューション内のアセンブリを追加します。

    名前空間の場合、表示されていなければ、 [含んでいるアセンブリの表示]をクリックします。

    クラス または インターフェイスの場合は、次から選択します。

    オプション 説明
    基本型の表示 クラスの場合、基底クラスおよび実装されたインターフェイスを追加します。

    インターフェイスの場合、基本インターフェイスを追加します。
    派生型の表示 クラスの場合、派生クラスを追加します。

    インターフェイスの場合、派生インターフェイスと、実装するクラスまたは構造体を追加します。
    参照される型の表示 すべてのクラスと、このクラスが使用するメンバーを追加します。
    参照元の型の表示 すべてのクラスと、このクラスを使用するメンバーを追加します。
    含んでいる名前空間の表示 親の名前空間を追加します。
    含んでいる名前空間とアセンブリの表示 親コンテナーの階層を追加します。
    すべての基本型の表示 基底クラスまたはインターフェイス階層を再帰的に追加します。
    すべての派生型の表示 クラスの場合、すべての派生クラスを再帰的に追加します。

    インターフェイスの場合、すべての派生インターフェイスと、実装するクラスまたは構造体を再帰的に追加します。

    メソッドの場合、次から選択します。

    オプション 説明
    呼び出されるメソッドの表示 このメソッドが呼び出すメソッドを追加します。
    参照されるフィールドの表示 このメソッドが参照するフィールドを追加します。
    含んでいる型の表示 親の型を追加します。
    含んでいる型、名前空間、およびアセンブリの表示 親コンテナーの階層を追加します。
    オーバーライドされたメソッドの表示 他のメソッドをオーバーライドするか、インターフェイスのメソッドを実装するメソッドの場合、オーバーライドされた基底クラスのすべての抽象メソッドまたは仮想メソッド、および実装されたインターフェイスのメソッドがある場合はそのメソッドを追加します。

    フィールド または プロパティの場合、次から選択します。

    オプション 説明
    含んでいる型の表示 親の型を追加します。
    含んでいる型、名前空間、およびアセンブリの表示 親コンテナーの階層を追加します。

    Show methods called by this member

  7. マップには、リレーションシップが表示されます。 この例では、Find メソッドによって呼び出されるメソッド、およびそれらのメソッドの場所 (ソリューション内あるいは外部) がマップに表示されます。

    Show specific dependencies on a code map

  8. マップを簡略化し個々の部分に注目するには、コード マップ ツールバーで [フィルター] を選択し、必要なノードおよびリンクの種類だけを選択します。 たとえば、ソリューション フォルダー、アセンブリ、および名前空間の表示をオフにします。

    Use the Filter pane to simplify the display