コード マップ上の特定の依存関係の対応付け
コード内の具体的な依存関係を理解するには、コード マップを作成して視覚化します (Visual Studio Ultimate のみ)。 コードの横に表示されるマップを使用して、これらの関係をナビゲートできます。 この結果、作業中に、コード内のどこにいるかを追跡できます。
緑色の矢印は、エディターでカーソルが表示される場所を示します。 紙の場合と同じようにマップにメモを記載できます。
コード マップを使用すると、大規模なコード ベース、よく知らないコード、またはレガシ コードでの見失いを回避できます。 たとえば、デバッグの際は、多数のファイルとプロジェクトにわたってコードに注意を払うことが必要になる場合があります。 コード マップを使用すると、これらのコード内を移動して、コード間の関係を確認できます。 このコードをすべて記憶したり、ファイルを追跡したり、紙の図を個別に描画したりする必要はありません。 作業を中断する必要がある場合、コード マップは、作業中のコードに関するメモリを最新の状態に更新するのに役立ちます。
コード マップを作成するか、開きます
コード マップを作成するには、 Visual Studio Ultimate 2013 および Visual c# .NET、Visual Basic .NET、x++ for Microsoft Dynamics AX、または C++ コード (限定サポート) を持つソリューションが必要です。 関係を色分け表示するには、Visual Studio 2013 Update 3 が必要です。 X++ コードおよび複数のアプリの間で共有するコードをマップするには、Visual Studio 2013 Update 2 以降が必要です。
コード マップは以下を実行して作成できます。
ソリューション エクスプ ローラー内のソース ファイルやバイナリ ファイルなどの項目を右クリックして、[コード マップに表示] をクリックします。 こうすることで、選択した項目にコード マップが作成されます。
開いているコード マップにソリューション エクスプ ローラーからソース ファイルやバイナリ ファイルなどの項目をドラッグして、マップに項目を含めたりマップで強調表示します。
エディター ウィンドウの空の領域を右クリックしてから、[コード マップに表示] をクリックします。 こうすることで、新しい空のコード マップが作成されます。
エディター ウィンドウでオブジェクトやクラスを右クリックしてから、[コード マップに表示] をクリックします。 こうすることで、選択した項目にコード マップが作成されます。 また、このメニューを使用して、コード マップですべての参照を検索したり関連する項目を表示することもできます。
アプリケーションが一時停止した場合は、[デバッグ] メニューで [コード マップ] ボタンをクリックする。
開いている IntelliTrace ファイルから、または [アーキテクチャ] メニューの依存関係グラフとして。
Visual Studio Premium 2013 または Visual Studio Professional 2013 を使用すると、コード マップの表示、制限付きの編集、および移動を行えます。
Premium または Professional を使用する他のユーザーとマップを共有する前に、非表示の項目、展開されたグループ、グループ間リンクなど、マップのすべての項目が表示されるようにしておく必要があります。
コード マップの使用法を視聴する: コード マップを使用する複雑なコードについて (チャネル 9)
問題を把握する
作業中の描画プログラムにバグがあるとします。 バグを再現するために、Visual Studio Ultimate でソリューションを開き、F5 キーを押してデバッグを開始します。
直線を描画し、[Undo my last stroke] (直前のストロークを元に戻す) を選択しても、次の直線を描画するまで何も起こりません。
したがって、Undo メソッドを検索して調査を開始します。 PaintCanvas クラスでこれが見つかります。
コードのマップを開始する
ここで、undo メソッドとその関係のマップを開始します。 コード エディターで、undo メソッドとその参照するフィールドを、新しいコード マップに追加します。 新しいマップを作成するときは、コードにインデックスを付けるのに時間がかかる場合があります。 インデックスを付けることで、後の操作をより速く実行できるようになります。
ヒント
緑色の強調表示は、マップに追加された最後の項目を示します。緑色の矢印は、コード内でのカーソルの位置を示します。項目間の矢印は、さまざまな関係を表します。ツールヒントを調べることで、マップの項目に関する詳細情報を確認できます。
マップからコードを移動して調査する
各フィールドのコード定義を確認するには、マップのフィールドをダブルクリックするか、フィールドを選択して F12 キーを押します。 緑色の矢印がマップの項目間を移動します。 コード エディターのカーソルも自動的に移動します。
ヒント
また、コード エディターでカーソルを動かすと、マップの緑色の矢印を移動できます。
コード間のリレーションシップを把握する
ここで、他のどのコードが history フィールドおよび paintObjects フィールドとやり取りしているのかを把握する必要があります。 これらのフィールドを参照するすべてのメソッドをマップに追加できます。 この操作は、マップまたはコードから行うことができます。
関係のフローを再配置してマップを読みやすくするために、レイアウトを変更します。 項目をドラッグすることにより、マップ上で項目を移動することもできます。
ヒント
既定では、[インクリメンタル レイアウト] が有効になっています。この設定では、新しい項目の追加時にマップの再配置は最小限に抑えられます。新しい項目を追加するたびにマップ全体を再配置するには、[インクリメンタル レイアウト] を無効にします。
これらのメソッドを調べます。 マップで、[PaintCanvas] メソッドをダブルクリックするか、このメソッドを選択して F12 キーを押します。 このメソッドにより、history と paintObjects が空のリストとして作成されることがわかります。
ここで、同じ手順を繰り返して、clear メソッドの定義を調べます。 clear が paintObjects と historyを使用して一部のタスクを実行することがわかります。 次に、このメソッドは Repaint メソッドを呼び出します。
ここで、addPaintObject メソッドの定義を調べます。 このメソッドも、history と paintObjects を使用して一部のタスクを実行します。 また、このメソッドは Repaint を呼び出します。
マップを調べて問題を見つける
history と paintObjects を変更するすべてのメソッドが Repaint を呼び出すと考えられます。 ただし、undo メソッドは Repaint を呼び出しませんが、undo メソッドは同じフィールドを変更します。 したがって、Repaint で undo を呼び出すことにより、この問題を解決できると考えられます。
この失われている呼び出しを示すマップがない場合、特にコードが複雑になると、この問題を見つけることがより困難になる可能性があります。
探索と次のステップを共有する
自分または他のユーザーがこのバグを修正する前に、問題と問題の解決方法に関するメモをマップに記載できます。
たとえば、マップにコメントを追加し、色を使用して項目にフラグを設定できます。
Microsoft Outlook をインストール済みの場合は、他のユーザーに電子メールでマップを送信できます。 マップをイメージまたはその他の形式でエクスポートすることもできます。
問題を修正して操作内容を表示する
このバグを修正するには、Repaintに undo の呼び出しを追加します。
修正を確認するには、デバッグ セッションを再開して、バグの再現を試みます。 ここで、[Undo my last stroke] (直前のストロークを元に戻す) を選択すると、期待どおりに機能し、正しい修正を行ったことが確認されます。
マップを更新すると、実行した修正を示すことができます。
マップには、undo と Repaint の間のリンクが示されます。
注意
マップを更新するときに、マップの作成に使用したコード インデックスが更新されたことを示すメッセージが表示される場合があります。これは、他のだれかがコードを変更し、マップが現在のコードに一致しなくなっていることを意味します。このことでマップの更新が停止されることはありませんが、コードとの一致を確認するためにマップを作成し直すことが必要になる場合があります。
これで調査が終了しました。 コードのマップにより、問題を正常に検出して修正しました。 また、コード内を移動することや確認したことの記憶に役立ち、問題を解決するための手順を示すマップも備わりました。