依存関係図: ガイドライン
Visual Studio で "依存関係図" を作成することで、アプリのアーキテクチャの概要を記述します。 コードを依存関係図に照らして検証することで、作成したコードがこの設計と一貫性があるかどうかを確認します。 レイヤーの検証をビルド プロセスに含めることもできます。
この機能をサポートする Visual Studio のバージョンを確認するには、「アーキテクチャとモデリング ツールのエディション サポート」を参照してください。
Note
.NET Core プロジェクトの依存関係図は、Visual Studio 2019 バージョン16.2 以降でサポートされています。
依存関係図とは
従来のアーキテクチャ図と同様に、依存関係図では、設計の主要なコンポーネントまたは機能ユニットとそれらの依存関係が識別されます。 "レイヤー" と呼ばれる図の各ノードは、名前空間やプロジェクトなどの成果物の論理グループを表します。 設計に必要な依存関係を描画できます。 従来のアーキテクチャ図とは異なり、ソース コード内の実際の依存関係が意図したとおりのものであることを検証できます。 Team Foundation Server で定期的なビルドの検証パーツを作成すると、今後変更が繰り返されても、プログラム コードがシステムのアーキテクチャに準拠している状態を維持できます。 「依存関係図: リファレンス」を参照してください。
依存関係図を使用してアプリを設計または更新する方法
以下の手順では、開発プロセスにおける依存関係図の使用方法についての概要を示します。 このトピックの後半のセクションでは、各手順について詳細に説明します。 新しく設計を行う場合は、既存のコードを扱う手順は省略してください。
Note
これらの手順は順序が決まっているわけではありません。 複数のタスクを並行して実行することも、状況に合わせてタスクの順序を変えることも、プロジェクト内で繰り返すたびに毎回同じ手順を実行することもできます。
アプリケーション全体またはその中のレイヤー用の依存関係図を作成します。
アプリケーションの主要な機能領域またはコンポーネントを表すレイヤーを定義します。 これらのレイヤーには、その機能に合わせて "プレゼンテーション" や "サービス" などの名前を付けます。 Visual Studio ソリューションがある場合は、各レイヤーを成果物 (プロジェクト、名前空間、ファイルなど) のコレクションと関連付けることができます。
レイヤー間の既存の依存関係を検出します。
コードを反映させる更新後の設計を示すようにレイヤーと依存関係を編集します。
主要なアーキテクチャ ブロックまたはコンポーネントを表すレイヤーを作成し、各レイヤーで他のレイヤーがどのように使用されるかを表す依存関係を定義することで、アプリケーションの新しい領域を設計します。
同僚と図についてディスカッションしやすいように、図のレイアウトと外観を編集します。
目標とするアーキテクチャとコードの間の競合を明らかにするために、コードを依存関係図に照らし合わせて検証します。
コードを更新して、新しいアーキテクチャに準拠させます。 検証によって競合が報告されなくなるまで、コードの開発とリファクタリングを繰り返します。
設計に準拠したコードの状態を維持するために、ビルド処理にレイヤー検証を組み込みます。
依存関係図を作成する
依存関係図は、モデリング プロジェクト内に作成する必要があります。 新しい依存関係図を既存のモデリング プロジェクトに追加する、依存関係図の新しいモデリング プロジェクトを作成する、または既存の依存関係図を同じモデリング プロジェクト内でコピーすることができます。
重要
既存の依存関係図を、モデリング プロジェクトから別のモデリング プロジェクトまたはソリューション内の別の場所に追加、ドラッグ、またはコピーしないでください。 この方法でコピーされた依存関係図には、その図を変更した場合でも、コピー元の図と同じ参照が含まれます。 これにより、レイヤー検証は正しく機能せず、要素が欠落したり、図を開こうとすると他のエラーが発生するなど、他の問題が生じる可能性があります。
「コードから依存関係図を作成する」を参照してください。
機能領域または機能コンポーネントを表すレイヤーを定義する
レイヤーは、プロジェクト、コード ファイル、名前空間、クラス、メソッドなどの成果物の論理グループを表します。 Visual C# プロジェクトと Visual Basic プロジェクトの成果物からレイヤーを作成したり、Word ファイルや PowerPoint プレゼンテーションなどのドキュメントにリンクすることで仕様や計画をレイヤーに添付したりできます。 各レイヤーは、図では四角形として表示されます。また各レイヤーでは、レイヤーにリンクされている成果物の数が表示されます。 レイヤーには、より具体的なタスクを記述する入れ子になったレイヤーを含めることができます。
一般的に、レイヤーには、その機能に合わせて "プレゼンテーション" や "サービス" などの名前を付けます。 密に相互依存している成果物は、同じレイヤーに配置します。 別々に更新できる成果物や別のアプリケーションで使用できる成果物は、異なるレイヤーに配置してください。
ヒント
レイヤーにリンクすることはできますが、依存関係図と照らし合わせた検証はサポートされない特定の種類の成果物があります。 成果物の検証がサポートされているかどうかを確認するには、レイヤー エクスプローラーを開き、成果物リンクの [検証をサポート] プロパティを調べます。 「レイヤー間の既存の依存関係を検出する」を参照してください。
よく知らないアプリケーションを更新する場合は、コード マップを作成することもできます。 これらの図を利用することで、コードを検証するときに、パターンと依存関係を見つけやすくなります。 ソリューション エクスプローラーを使って、名前空間やクラスを調べることができます。これらは、通常は既存のレイヤーに対応しています。 ソリューション エクスプローラーからこれらのコードの成果物を依存関係図にドラッグすることで、レイヤーに割り当てます。 その後、依存関係図を使用すると、コードの更新が簡単になり、デザインとの一貫性を維持することができます。
参照:
レイヤー間の既存の依存関係を検出する
依存関係が存在するのは、あるレイヤーに関連付けられている成果物が、別のレイヤーに関連付けられている成果物を参照している場合です。 たとえば、あるレイヤー内のクラスが、別のレイヤー内のクラスを保持する変数を宣言する場合などです。 既存の依存関係を検出するには、リバース エンジニアリングします。
Note
成果物の種類によっては、依存関係をリバース エンジニアリングできないものもあります。 たとえば、テキスト ファイルにリンクされているレイヤーから、またはそのレイヤーに対して依存関係をリバース エンジニアリングすることはできません。 リバース エンジニアリングできる依存関係のある成果物を確認するには、1 つ以上のレイヤーを右クリックし、 [リンクの表示] をクリックします。 レイヤー エクスプローラーで、 [検証をサポート] 列を調べます。 この列に [False] と表示されている成果物については、依存関係をリバース エンジニアリングすることはできません。
レイヤー間の既存の依存関係をリバース エンジニアリングするには
1 つ以上のレイヤーを選択し、選択したレイヤーを右クリックし、 [依存関係の生成] をクリックします。
通常は、不要な依存関係がいくつか見つかります。 これらの依存関係を編集して、目的の設計に準拠するようアラインできます。
レイヤーと依存関係を編集して目的の設計を表示する
システムに追加予定の変更または目的のアーキテクチャを示すには、次の手順を実行して依存関係図を編集します。 また、リファクタリングの変更を行い、コードを拡張する前に構造を改良することもできます。 「コードの構造の改良」を参照してください。
To | 実行する手順 |
---|---|
不要な依存関係を削除する | 依存関係をクリックし、DELETE キーを押します。 |
依存関係の方向を変更または制限する | その [方向] プロパティを設定します。 |
新しい依存関係を生成する | 依存関係ツールと双方向の依存関係ツールを使用します。 複数の依存関係を描画するには、ツールをダブルクリックします。 操作が終わったら、 [ポインター] ツールをクリックするか、Esc キーを押します。 |
レイヤーに関連付けられている成果物が、指定した名前空間に依存できないように指定する | レイヤーの [禁止された名前空間の依存関係] プロパティに名前空間を入力します。 名前空間はセミコロン ( ; ) を使用して区切ります。 |
レイヤーに関連付けられている成果物を、指定した名前空間に所属させることができないように指定する | レイヤーの [禁止された名前空間] プロパティに名前空間を入力します。 名前空間はセミコロン ( ; ) を使用して区切ります。 |
レイヤーに関連付けられている成果物を、指定した名前空間のいずれかに必ず所属させるように指定する | レイヤーの [必要な名前空間] プロパティに名前空間を入力します。 名前空間はセミコロン ( ; ) を使用して区切ります。 |
コードの構造を改良する
リファクタリングの変更を行ってもアプリケーションの振る舞いは変わりませんが、将来、コードの変更や拡張が容易になります。 適切に構造化されたコードの設計は、依存関係図に簡単に抽出できます。
たとえば、各名前空間を表すレイヤーをコードで生成し、依存関係をリバース エンジニアリングした場合は、レイヤー間の一方向の依存関係が最小限であることを確認する必要があります。 クラスまたはメソッドをレイヤーとして使用して、より詳細に図を生成した場合は、完成した図も同じ特性を備えている必要があります。
これを満たしていない場合、開発過程でコードの変更が難しくなるほか、依存関係図を使用した検証に適さなくなります。
アプリケーションの新しい領域をデザインする
新規プロジェクトの開発を新たに開始する場合や、新規プロジェクトで新しい領域の設計を開始する場合、コードの開発前にレイヤーと依存関係を描画することで、主要なコンポーネントを把握できます。
依存関係図に識別可能なアーキテクチャ パターンを表示します (可能な場合)。 たとえば、デスクトップ アプリケーションを記述する依存関係図には、プレゼンテーション、ドメイン ロジック、データ ストアなどのレイヤーが含まれる可能性があります。 アプリケーションの単一の機能をカバーする依存関係図には、モデル、ビュー、コントローラーなどのレイヤーが含まれる可能性があります。
名前空間、クラス、コンポーネントなどのレイヤーごとにコード成果物を生成します。 これにより、コードの追跡やレイヤーへのコードのリンクが容易になります。 成果物を生成するごとに、すぐに適切なレイヤーにリンクさせてください。
ほとんどのクラスやその他の成果物は、レイヤーにリンクさせる必要はありません。 これらは、より大きな成果物 (既にレイヤーにリンクしている名前空間など) に属しているためです。
新しい機能用の新しい図を作成します。 通常、アプリケーション全体を記述する依存関係図は 1 つ以上存在します。 アプリケーション内の新機能を設計するときには、既存の図を流用しないでください。 代わりに、コードの新しい部分を反映した独自の図を生成します。 新しい図には、新機能のプレゼンテーション レイヤー、ドメイン ロジック レイヤー、データベース レイヤーなどを追加できます。
アプリケーションをビルドするときに、全体を示す図とより詳細な機能の図の両方に対してコードが検証されます。
プレゼンテーションとディスカッションのレイアウトを編集する
レイヤーおよび依存関係を識別しやすくするには、またはチーム メンバーとそれらについて話し合うことができるようにするには、次の方法で図の外観およびレイアウトを編集します。
レイヤーのサイズ、形状、および位置
レイヤーと依存関係の色
- 1 つ以上のレイヤーまたは依存関係を選択して右クリックし、 [プロパティ] をクリックします。 [プロパティ] ウィンドウで、 [カラー] プロパティを編集します。
図に対してコードを検証する
図を編集した後、コードに対して随時手動で検証を行うか、ビルドするたびに自動的に検証を行うことができます。
参照トピック
新しいアーキテクチャに準拠するようにコードを更新する
通常、エラーは、更新された依存関係図に照らし合わせてコードを最初に検証したときに表示されます。 これらのエラーには、いくつかの原因が考えられます。
成果物が不適切なレイヤーに割り当てられている。 この場合、成果物を移動します。
クラスなどの成果物が、アーキテクチャに違反する形で別のクラスを使用している。 この場合、コードをリファクタリングして依存関係を削除します。
これらのエラーを解決するには、コードを更新して、検証時にエラーが表示されなくなるようにします。 通常、これは反復的な作業になります。 これらのエラーの詳細については、「 依存関係図を使用したコードの検証」を参照してください。
注意
コードを開発またはリファクタリングする際には、新しい成果物を依存関係図にリンクしなければならないことがあります。 これは必ずしも必要な作業ではありません。たとえば、レイヤーが既存の名前空間を表しており、新しいコードでこれらの名前空間に要素を追加するだけの場合は不要です。
開発プロセスの実行中は、検証時に報告される一部の競合を抑制できます。 たとえば、既に解決したエラーや特定のシナリオに関連しないエラーを抑制できます。 エラーを抑制した場合は、Team Foundation で作業項目をログに記録することをお勧めします。 このタスクを実行するには、「依存関係図を使用してコードを検証する」を参照してください。
ビルド プロセスにレイヤーの検証を含める
今後、依存関係図に従ってコードを変更できるように、ソリューションの標準のビルド処理にレイヤー検証を組み込みます。 他のチーム メンバーがソリューションをビルドする場合、コード内の依存関係と依存関係図上の依存関係の相違が、常にビルド エラーとして報告されます。 ビルド プロセスにレイヤーの検証を含める方法の詳細については、「レイヤー図と照らし合わせてコードを検証する」を参照してください。