レイヤー図: ガイドライン
Visual Studio Ultimate では、レイヤー図を使用して、アプリケーションの大まかな構造を把握し、コードがその大まかな設計に準拠しているかどうかを確認できます。 コードが設計と一致していることを確認するには、ビルド処理にレイヤー検証を組み込みます。
従来のアーキテクチャ図と同様に、レイヤー図にも、設計の主要なコンポーネントや機能ユニットのほか、それらの要素の依存関係が示されます。 レイヤーと呼ばれる図上の各ノードは、名前空間やプロジェクトをはじめとする成果物の論理グループを表します。 設計に必要な依存関係を描画できます。 従来のアーキテクチャ図とは異なり、ソース コード内の実際の依存関係が意図したとおりのものであることを検証できます。 Team Foundation Server で定期的なビルドの検証パーツを作成すると、今後変更が繰り返されても、プログラム コードがシステムのアーキテクチャに準拠している状態を維持できます。
レイヤー図の要素およびそれらのプロパティについては、「レイヤー図: リファレンス」を参照してください。
方法: レイヤー図を使用してアプリケーションを設計または更新する
以下の手順では、開発プロセスにおけるレイヤー図の使用方法についての概要を示します。 このトピックの後半のセクションでは、各手順について詳細に説明します。 新しく設計を行う場合は、既存のコードを扱う手順は省略してください。
注意
これらの手順は順序が決まっているわけではありません。 複数のタスクを並行して実行することも、状況に合わせてタスクの順序を変えることも、プロジェクト内で繰り返すたびに毎回同じ手順を実行することもできます。
アプリケーション全体またはアプリケーション内のレイヤーを示すレイヤー図を生成します。
アプリケーションの主要な機能領域またはコンポーネントを表すレイヤーを定義します。 これらのレイヤーには、その機能に合わせて "プレゼンテーション" や "サービス" などの名前を付けます。 Visual Studio ソリューションを使用する場合、各レイヤーは、既存のコードに含まれる成果物 (プロジェクト、名前空間、ファイルなど) のコレクションと関連付けることができます。
レイヤー間の既存の依存関係を検出します。
レイヤーと依存関係を編集し、コードに反映させる更新済みの設計を表示します。
主要なアーキテクチャ ブロックまたはコンポーネントを表すレイヤーを生成し、各レイヤーが他のレイヤーをどのように使用しているかを表す依存関係を定義して、アプリケーションの新しい領域を設計します。
同僚と図についてディスカッションしやすいように、図のレイアウトと外観を編集します。
コードをレイヤー図に照らし合わせて検証し、目標とするアーキテクチャとコードの間の競合を明らかにします。
コードを更新し、新しいアーキテクチャに準拠させます。 検証によって競合が報告されなくなるまで、コードの開発とリファクタリングを繰り返します。
ビルド処理にレイヤー検証を組み込むことで、設計に準拠したコードの状態を維持します。
レイヤー図を生成する
レイヤー図はモデリング プロジェクト内に生成する必要があります。 新しいレイヤー図を既存のモデリング プロジェクトに追加することも、新しいレイヤー図用の新しいモデリングをソリューションに作成することもできます。
新しいレイヤー図をモデリング プロジェクトに追加するには
[アーキテクチャ] メニューの [新しいダイアグラム] をクリックします。
[テンプレート] で、[レイヤー図] をクリックします。
図に名前を付けます。
[モデリング プロジェクトへの追加] で、ソリューション内の既存のモデリング プロジェクトを参照して選択します。
または
[新しいモデリング プロジェクトを作成します] をクリックして、新しいモデリング プロジェクトをソリューションに追加します。
注意
レイヤー図はモデリング プロジェクト内に存在している必要があります。 ただし、それはソリューション内の任意の場所に存在する成果物にリンクできます。
同じモデリング プロジェクト内に既存のレイヤー図をコピーすることもできます。
注意
モデリング プロジェクトから別のモデリング プロジェクトまたはソリューション内の別の場所に、既存のレイヤー図を追加、ドラッグ、またはコピーしないでください。 この方法でコピーされたレイヤー図には、その図を変更しても、コピー元の図と同じ参照が含まれます。 これにより、レイヤー検証は正しく機能せず、要素が欠落したり、図を開こうとすると他のエラーが発生するなど、他の問題が生じる可能性があります。
レイヤー図をコピーするには、次の手順を実行します。
既存のレイヤー図をコピーするには
新しいレイヤー図をモデリング プロジェクトに追加します。
コピー元のレイヤー図から新しいレイヤー図へ要素をコピーします。
機能領域またはコンポーネントを表すレイヤーの定義
レイヤーは、プロジェクト、コード ファイル、名前空間、クラス、メソッドなどの成果物の論理グループを表します。 Visual Studio ソリューション内の成果物からレイヤーを生成したり、Word ファイルや PowerPoint プレゼンテーションなどのドキュメントをリンクして仕様や計画をレイヤーに添付できます。 各レイヤーは、図では四角形として表示されます。また各レイヤーでは、レイヤーにリンクされている成果物の数が表示されます。 レイヤーには、より詳細なタスクを示す入れ子になったレイヤーを含めることができます。
一般的に、レイヤーには、その機能に合わせて "プレゼンテーション" や "サービス" などの名前を付けます。 密に相互依存している成果物は、同じレイヤーに配置します。 別々に更新できる成果物や別のアプリケーションで使用できる成果物は、異なるレイヤーに配置してください。 レイヤー パターンの詳細については、Patterns & Practices のサイト (https://go.microsoft.com/fwlink/?LinkId=145794) を参照してください。
注意
一部のタイプの成果物は、レイヤーにリンクできる一方で、レイヤー図と照らし合わせた検証はサポートしていません。 成果物が検証をサポートしているかどうかを確認するには、レイヤー エクスプローラーを開き、成果物リンクの "検証をサポート" プロパティを調べます。 詳細については、「レイヤーと成果物の間のリンクを管理する」を参照してください。
アプリケーションの使用に慣れていない場合は、更新する際にコードの調査および理解に役立つ依存関係グラフを使用することをお勧めします。 これらのグラフは、コード内のクラスターや依存関係を探すときに役立ちます。 アーキテクチャ エクスプローラーでも名前空間やクラスを調べることができます。これらは、通常は既存のレイヤーに対応しています。 このため、成果物をレイヤーに簡単に割り当てることができます。 その後で、レイヤー図を使用してコードを更新できます。
詳細については、次のトピックを参照してください。
レイヤーを生成するには、次の操作を行います。
タスク |
実行する手順 |
---|---|
1 つの成果物を表すレイヤーを生成する |
|
選択したすべての成果物を表す 1 つのレイヤーを生成する |
選択されたすべての成果物を同時に図へドラッグします。 レイヤーが図に表示され、成果物のグループ全体にリンクされます。 |
選択した各成果物を表すレイヤーを生成する |
Shift キーを押しながら、レイヤー図にすべての成果物を同時にドラッグします。
メモ
Shift キーを使用して項目の範囲を選択する場合は、成果物を選択した後でキーを離します。成果物を図にドラッグするときは、キーを再び押して、押したままにします。
各成果物を表すレイヤーが図に表示され、その成果物にリンクされます。 |
成果物をレイヤーに追加する |
成果物をレイヤーにドラッグします。 |
リンクされない新しいレイヤーを生成する |
ツールボックスで、[レイヤー図] セクションを展開し、[レイヤー] をレイヤー図にドラッグします。 複数のレイヤーを追加するには、ツールをダブルクリックします。 操作が終わったら、[ポインター] ツールをクリックするか、Esc キーを押します。 または レイヤー図を右クリックし、[追加] をポイントし、[レイヤー] をクリックします。 この操作により、まだ開発作業を開始していないアプリケーション パートなどを表現できます。 このようなレイヤーのプレースホルダー コードを早い段階で生成しておくことをお勧めします。 |
入れ子になったレイヤーを生成する |
既存のレイヤーを別のレイヤー上へドラッグします。 または レイヤーを右クリックし、[追加] をポイントし、[レイヤー] をクリックします。 |
複数の既存レイヤーを含む新しいレイヤーを生成する |
レイヤーを選択し、選択したレイヤーを右クリックし、[グループ] をクリックします。 |
レイヤーの色を変更する |
レイヤーの "カラー" プロパティを任意の色に設定します。 |
レイヤーに関連付けられている成果物が、指定した名前空間に依存できないように指定する |
レイヤーの "禁止された名前空間の依存関係" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。 |
レイヤーに関連付けられている成果物を、指定した名前空間に所属させることができないように指定する |
レイヤーの "禁止された名前空間" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。 |
レイヤーに関連付けられている成果物を、指定した名前空間のいずれかに必ず所属させるように指定する |
レイヤーの "必要な名前空間" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。 |
レイヤーと成果物の間のリンクを管理する
レイヤー図でレイヤーを右クリックし、[リンクの表示] をクリックします。
レイヤー エクスプローラーに、選択したレイヤーにリンクされている成果物が表示されます。 図上のレイヤーにリンクされているすべての成果物を表示するには、図をクリックします。
これらのリンクを管理するには、次の操作を行います。
タスク
レイヤー エクスプローラーでの操作
レイヤーと成果物のリンクを削除する
成果物のリンクを右クリックし、[削除] をクリックします。
リンクを別のレイヤーに移動する
成果物のリンクを図上の既存のレイヤーにドラッグします。
または
成果物のリンクを右クリックし、[切り取り] をクリックします。
レイヤー図でレイヤーを右クリックし、[貼り付け] をクリックします。
リンクを別のレイヤーにコピーする
成果物のリンクを右クリックし、[コピー] をクリックします。
レイヤー図でレイヤーを右クリックし、[貼り付け] をクリックします。
既存の成果物のリンクから新しいレイヤーを生成する
成果物のリンクを図上の空白領域にドラッグします。
リンクされた成果物がレイヤー図に対する検証をサポートしていることを確認する
成果物のリンクの [検証をサポート] 列を確認します。
レイヤー図と照らし合わせた検証をサポートしていない成果物には、C++ プロジェクト、Web サイト、Office ドキュメント、およびプレーンテキスト ファイルがあります。 そうした成果物をレイヤーにリンクさせることはできますが、検証プロセスではそれらは無視されます。 別々のレイヤー間に依存関係が表示されない場合、これらのレイヤーにリンクされているプロジェクトやアセンブリへの参照には、検証エラーは表示されません。 このような参照は、コードがこれらの参照を使用している場合を除き、依存関係と見なされません。
レイヤー間の既存の依存関係の検出
依存関係が存在するのは、あるレイヤーに関連付けられている成果物が、別のレイヤーに関連付けられている成果物を参照している場合です。 たとえば、あるレイヤー内のクラスが、別のレイヤー内のクラスを保持する変数を宣言する場合などです。 既存の依存関係を検出するには、リバース エンジニアリングします。
注意
成果物の種類によっては、依存関係をリバース エンジニアリングできないものもあります。 たとえば、テキスト ファイルにリンクされているレイヤーから、またはそのレイヤーに対して依存関係をリバース エンジニアリングすることはできません。 リバース エンジニアリングできる依存関係のある成果物を確認するには、1 つ以上のレイヤーを右クリックし、[リンクの表示] をクリックします。 レイヤー エクスプローラーで、[検証をサポート] 列を確認します。 この列の値が [FALSE] の成果物については、依存関係をリバース エンジニアリングできません。
レイヤー間の既存の依存関係をリバース エンジニアリングするには
- 1 つ以上のレイヤーを選択し、選択したレイヤーを右クリックし、[依存関係の生成] をクリックします。
通常は、不要な依存関係がいくつか見つかります。 これらの依存関係を編集して、目的の設計に準拠するよう配置できます。
レイヤーと依存関係を編集して目的の設計を表示する
システムに追加予定の変更を示すには、図を編集し、更新後の設計を反映することができます。 また、リファクタリングの変更を行い、コードを拡張する前に構造を改良することもできます。 詳細については、「コードの構造の改良」を参照してください。
タスク |
実行する手順 |
---|---|
不要な依存関係を削除する |
依存関係をクリックし、Del キーを押します。 |
依存関係の方向を変更または制限する |
依存関係の Direction プロパティを設定します。 |
新しい依存関係を生成する |
依存関係ツールと双方向の依存関係ツールを使用します。 複数の依存関係を描画するには、ツールをダブルクリックします。 操作が終わったら、[ポインター] ツールをクリックするか、Esc キーを押します。 |
レイヤーに関連付けられている成果物が、指定した名前空間に依存できないように指定する |
レイヤーの "禁止された名前空間の依存関係" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。 |
レイヤーに関連付けられている成果物を、指定した名前空間に所属させることができないように指定する |
レイヤーの "禁止された名前空間" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。 |
レイヤーに関連付けられている成果物を、指定した名前空間のいずれかに必ず所属させるように指定する |
レイヤーの "必要な名前空間" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。 |
コードの構造の改良
リファクタリングの変更を行ってもアプリケーションの振る舞いは変わりませんが、将来、コードの変更や拡張が容易になります。 適切に構成されたコードの設計は、レイヤー図に簡単に抽出できます。
たとえば、各名前空間を表すレイヤーをコードで生成し、依存関係をリバース エンジニアリングした場合は、レイヤー間の一方向の依存関係が最小限であることを確認する必要があります。 クラスまたはメソッドをレイヤーとして使用して、より詳細に図を生成した場合は、完成した図も同じ特性を備えている必要があります。
これを満たしていない場合、開発過程でコードの変更が難しくなるほか、レイヤー図を使用した検証に適さなくなります。
アプリケーションの新しい領域の設計
新規プロジェクトの開発を新たに開始する場合や、新規プロジェクトで新しい領域の設計を開始する場合、コードの開発前にレイヤーと依存関係を描画することで、主要なコンポーネントを把握できます。
可能であれば、特定できるアーキテクチャ パターンをレイヤー図に示します。 たとえば、デスクトップ アプリケーションを示すレイヤー図には、プレゼンテーション、ドメイン ロジック、データ ストアなどのレイヤーを追加できます。 アプリケーションの単一の機能をカバーするレイヤー図には、モデル、ビュー、コントローラーなどのレイヤーを追加できます。 このようなパターンの詳細については、「Patterns & Practices: Application Architecture (patterns & practices: アプリケーション アーキテクチャ)」を参照してください。
類似のパターンを生成することがよくある場合は、カスタム ツールを生成します。 詳細については、「方法: カスタム モデリング ツールボックス項目を定義する」を参照してください。
名前空間、クラス、コンポーネントなどのレイヤーごとにコードを生成します。 これにより、コードの追跡やレイヤーへのコードのリンクが容易になります。 成果物を生成するごとに、すぐに適切なレイヤーにリンクさせてください。
ほとんどのクラスやその他の成果物は、レイヤーにリンクさせる必要はありません。これらは、より大きな成果物 (既にレイヤーにリンクしている名前空間など) に属しているためです。
新機能については、新しい図を生成します。 一般には、アプリケーション全体を記述したレイヤー図を 1 つ以上生成します。 アプリケーション内の新機能を設計するときには、既存の図を流用しないでください。 代わりに、コードの新しい部分を反映した独自の図を生成します。 新しい図には、新機能のプレゼンテーション レイヤー、ドメイン ロジック レイヤー、データベース レイヤーなどを追加できます。
アプリケーションをビルドするときに、全体を示す図とより詳細な機能の図の両方に対してコードが検証されます。
プレゼンテーションとディスカッション用のレイアウトの編集
レイヤーおよび依存関係を識別しやすくするには、また、チーム メンバーとそれらについて話し合うことができるようにするには、次の方法で図の外観およびレイアウトを編集します。
レイヤーのサイズ、形状、および位置
レイヤーと依存関係の色
- 1 つ以上のレイヤーまたは依存関係を選択して右クリックし、[プロパティ] をクリックします。 [プロパティ] ウィンドウで、[色] プロパティを編集します。
図に対するコードの検証
図を編集した後は、コードに対して随時手動で検証を行うか、ローカル ビルドを実行するたびに自動的に検証を行うことができます。 Team Foundation Server を使用してビルドするたびに、検証を自動的に実行することもできます。
詳細については、次のトピックを参照してください。
ビルド処理へのレイヤー検証の組み込み
検証用のアセンブリまたはプロジェクトを手動で追加するには
ソリューション エクスプローラーで、モデリング プロジェクトまたは [レイヤー参照] フォルダーを右クリックします。次に、[参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスで、アセンブリまたはプロジェクトを選択し、[OK] をクリックします。
開いているレイヤー図からコードを手動で検証するには
図の画面を右クリックし、[アーキテクチャの検証] をクリックします。
注意
既定では、図を検証プロセスに含めるには、レイヤー図 (layerdiagram) ファイルの "ビルド アクション" プロパティが [検証] に設定されている必要があります。
発生したエラーは、[エラー一覧] ウィンドウに表示されます。 検証エラーの詳細については、「レイヤー検証エラーについて」を参照してください。
各エラーのソースを表示するには、[エラー一覧] ウィンドウでエラーをダブルクリックします。
注意
Visual Studio では、エラーのソースの代わりに依存関係グラフが表示されることがあります。 これは、レイヤー図で指定されていないアセンブリ上にコードの依存関係があるか、レイヤー図で指定された依存関係がコードにない場合に起こります。 依存関係グラフまたはコードを確認し、依存関係が必要であるかどうかを検証してください。 依存関係グラフの詳細については、「方法: グラフ ドキュメントを参照および操作する」を参照してください。
エラーを管理するには、「コードを更新して新しいアーキテクチャに準拠させる」を参照してください。
コマンド プロンプトから手動でコードを検証するには
Visual Studio のコマンド プロンプトを開きます。
コマンド プロンプトを開くには、[スタート] ボタンをクリックし、[すべてのプログラム] をポイントします。次に、[Microsoft Visual Studio 2010] をポイントし、[Visual Studio ツール] をポイントし、[Visual Studio コマンド プロンプト (2010)] をクリックします。
次のいずれかを選択します。
ソリューションの特定のモデリング プロジェクトに対してコードを検証するには、次のカスタム プロパティを使用して MSBuild を実行します。
msbuild <FilePath+ModelProjectFileName>.modelproj /p:ValidateArchitecture=true
または
モデリング プロジェクト (.modelproj) ファイルとレイヤー図が入っているフォルダーを参照し、次のカスタム プロパティを使用して MSBuild を実行します。
msbuild /p:ValidateArchitecture=true
ソリューションのすべてのモデリング プロジェクトに対してコードを検証するには、次のカスタム プロパティを使用して MSBuild を実行します。
msbuild <FilePath+SolutionName>.sln /p:ValidateArchitecture=true
または
レイヤー図が入っているモデリング プロジェクトを必ず含むソリューション フォルダーを参照し、次のカスタム プロパティを使用して MSBuild を実行します。
msbuild /p:ValidateArchitecture=true
発生したすべてのエラーが表示されます。 MSBuild の詳細については、「MSBuild」および「MSBuild タスク」を参照してください。
検証エラーの詳細については、「レイヤー検証エラーについて」を参照してください。
ローカル ビルドからコードを自動的に検証するには
- テキスト エディターを使用してモデリング プロジェクト (.modelproj) ファイルを開き、次のプロパティを追加します。
<ValidateArchitecture>true</ValidateArchitecture>
または
ソリューション エクスプローラーで、1 つ以上のレイヤー図が含まれているモデリング プロジェクトを右クリックし、[プロパティ] をクリックします。
プロパティ ウィンドウで、モデリング プロジェクトの "アーキテクチャの検証" プロパティが [True] に設定されていることを確認します。
これには、検証プロセス内のモデリング プロジェクトが含まれます。
ソリューション エクスプローラーで、検証プロセスに使用するレイヤー図 (.layerdiagram) ファイルをクリックします。
[プロパティ] ウィンドウで、図の "ビルド アクション" プロパティが [検証] に設定されていることを確認します。
これには、検証プロセス内のレイヤー図が含まれます。
検証エラーの詳細については、「レイヤー検証エラーについて」を参照してください。 エラーを管理するには、「コードを更新して新しいアーキテクチャに準拠させる」を参照してください。
コードを更新して新しいアーキテクチャに準拠させる
通常、エラーは、更新されたレイヤー図に照らし合わせてコードを最初に検証したときに表示されます。 これらのエラーには、いくつかの原因が考えられます。
成果物が不適切なレイヤーに割り当てられている。 この場合、成果物を移動します。
クラスなどの成果物が、アーキテクチャに違反する形で別のクラスを使用している。 この場合、コードをリファクタリングして依存関係を削除します。
これらのエラーを解決するには、コードを更新して、検証時にエラーが表示されなくなるようにします。 通常、これは反復的な作業になります。
注意
コードを開発またはリファクタリングする際には、新しい成果物をレイヤー図にリンクしなければならないことがあります。 これは必ずしも必要な作業ではありません。たとえば、レイヤーが既存の名前空間を表しており、新しいコードでこれらの名前空間に要素を追加するだけの場合は不要です。
開発プロセスの実行中は、検証時に報告される一部の競合を抑制できます。 たとえば、既に解決したエラーや特定のシナリオに関連しないエラーを抑制できます。 エラーを抑制した場合は、Team Foundation で作業項目をログに記録することをお勧めします。
検証エラーの作業項目を作成するには
- [エラー一覧] ウィンドウで、エラーを右クリックし、[作業項目の作成] をポイントし、作成する作業項目の種類をクリックします。
[エラー一覧] ウィンドウで検証エラーを管理するには、次の操作を行います。
目的 |
手順 |
---|---|
検証中に選択したエラーを抑制する |
エラーを 1 つ以上選択して右クリックし、[検証エラーの管理] をポイントし、[エラーの抑制] をクリックします。 抑制されたエラーは、取り消し線付きで表示されます。 次回検証を実行したとき、これらのエラーは表示されません。 抑制されたエラーは、対応するレイヤー図ファイルの .suppressions ファイルで追跡されます。 |
選択したエラーの抑制を停止する |
抑制されたエラーを 1 つまたは複数選択して右クリックし、[検証エラーの管理] をポイントし、[エラーの抑制の停止] をクリックします。 次回検証を実行したとき、抑制されたエラーのうち選択したものが表示されます。 |
[エラー一覧] ウィンドウに、抑制されたすべてのエラーを再び表示する |
[エラー一覧] ウィンドウ内の任意の場所を右クリックし、[検証エラーの管理] をポイントし、[抑制されたエラーの表示] をクリックします。 |
[エラー一覧] ウィンドウで抑制されたエラーをすべて非表示にする |
[エラー一覧] ウィンドウ内の任意の場所を右クリックし、[検証エラーの管理] をポイントし、[抑制されたエラーの表示] をクリックします。 |
ビルド処理へのレイヤー検証の組み込み
今後、レイヤー図に従ってコードを変更できるように、ソリューションの標準のビルド処理にレイヤー検証を組み込むことができます。 他のチーム メンバーがソリューションをビルドした際には、コード内の依存関係とレイヤー図上の依存関係の相違がビルド エラーとして報告されます。
Team Foundation ビルドの実行中にコードを検証するには
チーム エクスプローラーで、ビルド定義をダブルクリックし、[プロセス] をクリックします。
[ビルド プロセス パラメーター] の [コンパイル] を展開し、[MSBuild 引数] パラメーターに次のように入力します。
/p:ValidateArchitecture=true
詳細については、「既定のテンプレートを使用してビルドを定義する」を参照してください。
参照
処理手順
方法: レイヤー図と照らし合わせて .NET コードを検証する