システム全体に存在すると予想される層を設計する必要があります。各層は、さまざまな人が並行して設計/実装できますが、統合ポイントでは、契約を決定するためにコラボレーションが必要になります。
2つの一般的なインターフェース/コントラクトパターンがあります。
1)コンシューマー/アプリケーションのニーズ->インターフェイス/コントラクトはアプリケーションによって決定され、次の層はそれらのニーズに準拠/適応するように作成されます。現在、すべての層は基本的に下流の消費者によって推進されています。長所は、必要な方法のセットが最も効率的で限られている可能性が高いことです。短所は、システムを他の消費者に適応させるための作業が増えることです。
また
2)サービスプロバイダー->インターフェイス/コントラクトは、多くのアプリにサービスを提供する可能性のある共通機能のコアセットをサポートするように設計されたサービスによって決定されます。次に、プロバイダーを使用するアプリケーションは、コントラクトの機能を内部のニーズに適合させる必要があります。長所は、サービスを変更せずに再利用できることですが、これらの一般化された方法は、特定のアプリのニーズにあまり効率的に適合しない可能性があります。
これらはどちらも完璧な答えではなく、状況によって異なります。上記の1または2の決定は、作業している層接続によっても異なる場合があります。サービスコントラクト#2のサービス、独自のニーズコントラクト#1のアプリ、そしてアプリのニーズをサービスの機能にマップするアダプター層を作成できます。
使用するパターンに関係なく、特定の層で作業を開始するときよりも、層のアーキテクチャ、それらのコントラクト、およびそれらが互いにどのように相互作用するかが重要です。
一般に、層の設計が整ったら、契約が定義されている層で作業し、契約が消費されている層でフォローアップします。