次の方法で共有


レイヤー図: ガイドライン

Visual Studio Ultimate でレイヤー図を作成すると、アプリケーションのアーキテクチャの概要を記述できます。 コードがこの設計と一致していることを確認するには、Visual Studio Ultimate または Visual Studio Premium でレイヤー図を使用してコードを検証します。 レイヤーの検証をビルド プロセスに含めることもできます。 「チャネル 9 ビデオ: レイヤー図の使用によるアーキテクチャの設計と検証」を参照してください。

レイヤー図とは

従来のアーキテクチャ図と同様に、レイヤー図にも、設計の主要なコンポーネントや機能ユニットのほか、それらの要素の依存関係が示されます。 レイヤーと呼ばれる図上の各ノードは、名前空間やプロジェクトをはじめとする成果物の論理グループを表します。 設計に必要な依存関係を描画できます。 従来のアーキテクチャ図とは異なり、ソース コード内の実際の依存関係が意図したとおりのものであることを検証できます。 Team Foundation Server で定期的なビルドの検証パーツを作成すると、今後変更が繰り返されても、プログラム コードがシステムのアーキテクチャに準拠している状態を維持できます。 「レイヤー図: リファレンス」を参照してください。

以下の手順では、開発プロセスにおけるレイヤー図の使用方法についての概要を示します。 このトピックの後半のセクションでは、各手順について詳細に説明します。 新しく設計を行う場合は、既存のコードを扱う手順は省略してください。

注意

これらの手順は順序が決まっているわけではありません。複数のタスクを並行して実行することも、状況に合わせてタスクの順序を変えることも、プロジェクト内で繰り返すたびに毎回同じ手順を実行することもできます。

  1. アプリケーション全体またはアプリケーション内のレイヤーを示すレイヤー図を生成します。

  2. アプリケーションの主要な機能領域またはコンポーネントを表すレイヤーを定義します。 これらのレイヤーには、その機能に合わせて "プレゼンテーション" や "サービス" などの名前を付けます。 Visual Studio ソリューションを使用する場合、各レイヤーは、既存のコードに含まれる成果物 (プロジェクト、名前空間、ファイルなど) のコレクションと関連付けることができます。

  3. レイヤー間の既存の依存関係を検出します。

  4. レイヤーと依存関係を編集し、コードに反映させる更新済みの設計を表示します。

  5. 主要なアーキテクチャ ブロックまたはコンポーネントを表すレイヤーを生成し、各レイヤーが他のレイヤーをどのように使用しているかを表す依存関係を定義して、アプリケーションの新しい領域を設計します。

  6. 同僚と図についてディスカッションしやすいように、図のレイアウトと外観を編集します。

  7. コードをレイヤー図に照らし合わせて検証し、目標とするアーキテクチャとコードの間の競合を明らかにします。

  8. コードを更新し、新しいアーキテクチャに準拠させます。 検証によって競合が報告されなくなるまで、コードの開発とリファクタリングを繰り返します。

  9. ビルド処理にレイヤー検証を組み込むことで、設計に準拠したコードの状態を維持します。

レイヤー図を作成する

レイヤー図はモデリング プロジェクト内に生成する必要があります。 新しいレイヤー図を既存のモデリング プロジェクトに追加すること、レイヤー図の新しいモデリング プロジェクトを作成すること、または既存のレイヤー図を同じモデリング プロジェクト内でコピーすることができます。

重要

モデリング プロジェクトから別のモデリング プロジェクトまたはソリューション内の別の場所に、既存のレイヤー図を追加、ドラッグ、またはコピーしないでください。この方法でコピーされたレイヤー図には、その図を変更しても、コピー元の図と同じ参照が含まれます。これにより、レイヤー検証は正しく機能せず、要素が欠落したり、図を開こうとすると他のエラーが発生するなど、他の問題が生じる可能性があります。

コードからのレイヤー図の作成」を参照してください。

機能領域または機能コンポーネントを表すレイヤーを定義する

レイヤーは、プロジェクト、コード ファイル、名前空間、クラス、メソッドなどの成果物の論理グループを表します。 Visual C# .NET プロジェクトおよび Visual Basic .NET プロジェクトの成果物からレイヤーを生成したり、Word ファイルや PowerPoint プレゼンテーションなどのドキュメントをリンクして仕様や計画をレイヤーに添付したりすることができます。 各レイヤーは、図では四角形として表示されます。また各レイヤーでは、レイヤーにリンクされている成果物の数が表示されます。 レイヤーには、より具体的なタスクを記述する入れ子になったレイヤーを含めることができます。

一般的に、レイヤーには、その機能に合わせて "プレゼンテーション" や "サービス" などの名前を付けます。 密に相互依存している成果物は、同じレイヤーに配置します。 別々に更新できる成果物や別のアプリケーションで使用できる成果物は、異なるレイヤーに配置してください。 レイヤー パターンの詳細については、Patterns & Practices の Web サイト (https://go.microsoft.com/fwlink/?LinkId=145794) を参照してください。

ヒント

一部のタイプの成果物は、レイヤーにリンクすることはできますが、レイヤー図と照らし合わせた検証はサポートしていません。成果物が検証をサポートしているかどうかを確認するには、レイヤー エクスプローラーを開き、成果物リンクの "検証をサポート" プロパティを調べます。「レイヤー間の既存の依存関係を検出する」を参照してください。

アプリケーションの使用に慣れていない場合は、更新する際にコードの調査および理解に役立つ依存関係グラフを使用することをお勧めします。 これらのグラフは、コード内のクラスターや依存関係を探すときに役立ちます。 アーキテクチャ エクスプローラーでも名前空間やクラスを調べることができます。これらは、通常は既存のレイヤーに対応しています。 このため、成果物をレイヤーに簡単に割り当てることができます。 その後で、レイヤー図を使用してコードを更新できます。

詳細については、次のトピックを参照してください。

レイヤー間の既存の依存関係を検出する

依存関係が存在するのは、あるレイヤーに関連付けられている成果物が、別のレイヤーに関連付けられている成果物を参照している場合です。 たとえば、あるレイヤー内のクラスが、別のレイヤー内のクラスを保持する変数を宣言する場合などです。 既存の依存関係を検出するには、リバース エンジニアリングします。

注意

成果物の種類によっては、依存関係をリバース エンジニアリングできないものもあります。たとえば、テキスト ファイルにリンクされているレイヤーから、またはそのレイヤーに対して依存関係をリバース エンジニアリングすることはできません。リバース エンジニアリングできる依存関係のある成果物を確認するには、1 つ以上のレイヤーを右クリックし、[リンクの表示] をクリックします。レイヤー エクスプローラーで、[検証をサポート] 列を確認します。この列の値が [FALSE] の成果物については、依存関係をリバース エンジニアリングできません。

レイヤー間の既存の依存関係をリバース エンジニアリングするには

  • 1 つ以上のレイヤーを選択し、選択したレイヤーを右クリックし、[依存関係の生成] をクリックします。

通常は、不要な依存関係がいくつか見つかります。 これらの依存関係を編集して、目的の設計に準拠するようアラインできます。

レイヤーと依存関係を編集して目的の設計を表示する

システムに追加予定の変更または目的のアーキテクチャを示すには、次の手順を実行してレイヤー図を編集します。 また、リファクタリングの変更を行い、コードを拡張する前に構造を改良することもできます。 「コードの構造を改良する」を参照してください。

目的

実行する手順

不要な依存関係を削除する

依存関係をクリックし、Del キーを押します。

依存関係の方向を変更または制限する

依存関係の Direction プロパティを設定します。

新しい依存関係を生成する

依存関係ツールと双方向の依存関係ツールを使用します。

複数の依存関係を描画するには、ツールをダブルクリックします。 操作が終わったら、[ポインター] ツールをクリックするか、Esc キーを押します。

レイヤーに関連付けられている成果物が、指定した名前空間に依存できないように指定する

レイヤーの "禁止された名前空間の依存関係" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。

レイヤーに関連付けられている成果物を、指定した名前空間に所属させることができないように指定する

レイヤーの "禁止された名前空間" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。

レイヤーに関連付けられている成果物を、指定した名前空間のいずれかに必ず所属させるように指定する

レイヤーの "必要な名前空間" プロパティに名前空間を入力します。 名前空間はセミコロン (;) を使用して区切ります。

コードの構造を改良する

リファクタリングの変更を行ってもアプリケーションの振る舞いは変わりませんが、将来、コードの変更や拡張が容易になります。 適切に構成されたコードの設計は、レイヤー図に簡単に抽出できます。

たとえば、各名前空間を表すレイヤーをコードで生成し、依存関係をリバース エンジニアリングした場合は、レイヤー間の一方向の依存関係が最小限であることを確認する必要があります。 クラスまたはメソッドをレイヤーとして使用して、より詳細に図を生成した場合は、完成した図も同じ特性を備えている必要があります。

これを満たしていない場合、開発過程でコードの変更が難しくなるほか、レイヤー図を使用した検証に適さなくなります。

アプリケーションの新しい領域をデザインする

新規プロジェクトの開発を新たに開始する場合や、新規プロジェクトで新しい領域の設計を開始する場合、コードの開発前にレイヤーと依存関係を描画することで、主要なコンポーネントを把握できます。

  • 可能であれば、特定できるアーキテクチャ パターンをレイヤー図に示します。 たとえば、デスクトップ アプリケーションを示すレイヤー図には、プレゼンテーション、ドメイン ロジック、データ ストアなどのレイヤーを追加できます。 アプリケーションの単一の機能をカバーするレイヤー図には、モデル、ビュー、コントローラーなどのレイヤーを追加できます。 こうしたパターンの詳細については、「Patterns & Practices: Application Architecture」を参照してください。

    類似のパターンを生成することがよくある場合は、カスタム ツールを生成します。 「方法: カスタム モデリング ツールボックス項目を定義する」を参照してください。

  • 名前空間、クラス、コンポーネントなどのレイヤーごとにコードを生成します。 これにより、コードの追跡やレイヤーへのコードのリンクが容易になります。 成果物を生成するごとに、すぐに適切なレイヤーにリンクさせてください。

  • ほとんどのクラスやその他の成果物は、レイヤーにリンクさせる必要はありません。これらは、より大きな成果物 (既にレイヤーにリンクしている名前空間など) に属しているためです。

  • 新機能については、新しい図を生成します。 一般には、アプリケーション全体を記述したレイヤー図を 1 つ以上生成します。 アプリケーション内の新機能を設計するときには、既存の図を流用しないでください。 代わりに、コードの新しい部分を反映した独自の図を生成します。 新しい図には、新機能のプレゼンテーション レイヤー、ドメイン ロジック レイヤー、データベース レイヤーなどを追加できます。

    アプリケーションをビルドするときに、全体を示す図とより詳細な機能の図の両方に対してコードが検証されます。

プレゼンテーションとディスカッションのレイアウトを編集する

レイヤーおよび依存関係を識別しやすくするには、またはチーム メンバーとそれらについて話し合うことができるようにするには、次の方法で図の外観およびレイアウトを編集します。

  • レイヤーのサイズ、形状、および位置

  • レイヤーと依存関係の色

    • 1 つ以上のレイヤーまたは依存関係を選択して右クリックし、[プロパティ] をクリックします。 [プロパティ] ウィンドウで、[色] プロパティを編集します。

図に対してコードを検証する

図を編集した後は、コードに対して随時手動で検証を実行するか、またはローカル ビルドまたは Team Foundation ビルド を実行するたびに自動的に検証を実行することができます。

参照トピック

新しいアーキテクチャに準拠するようにコードを更新する

通常、エラーは、更新されたレイヤー図に照らし合わせてコードを最初に検証したときに表示されます。 これらのエラーには、いくつかの原因が考えられます。

  • 成果物が不適切なレイヤーに割り当てられている。 この場合、成果物を移動します。

  • クラスなどの成果物が、アーキテクチャに違反する形で別のクラスを使用している。 この場合、コードをリファクタリングして依存関係を削除します。

これらのエラーを解決するには、コードを更新して、検証時にエラーが表示されなくなるようにします。 通常、これは反復的な作業になります。 これらのエラーの詳細については、「レイヤー図を使用したコードの検証」を参照してください。

注意

コードを開発またはリファクタリングする際には、新しい成果物をレイヤー図にリンクしなければならないことがあります。これは必ずしも必要な作業ではありません。たとえば、レイヤーが既存の名前空間を表しており、新しいコードでこれらの名前空間に要素を追加するだけの場合は不要です。

開発プロセスの実行中は、検証時に報告される一部の競合を抑制できます。 たとえば、既に解決したエラーや特定のシナリオに関連しないエラーを抑制できます。 エラーを抑制した場合は、Team Foundation で作業項目をログに記録することをお勧めします。 このタスクを実行する方法については、「レイヤー図を使用したコードの検証」を参照してください。

ビルド プロセスにレイヤーの検証を含める

今後、レイヤー図に従ってコードを変更できるように、ソリューションの標準のビルド処理にレイヤー検証を組み込むことができます。 他のチーム メンバーがソリューションをビルドした際には、コード内の依存関係とレイヤー図上の依存関係の相違がビルド エラーとして報告されます。 ビルド プロセスにレイヤーの検証を含める方法の詳細については、「レイヤー図を使用したコードの検証」を参照してください。

参照

概念

レイヤー図: リファレンス

コードからのレイヤー図の作成