Kilian Fothの答えを拡張すると、この階層化の方向は、人間がシステムを探索する方向に対応します。
レイヤードシステムのバグを修正する新しい開発者であると想像してください。
バグは通常、顧客が必要とするものと彼が得るものとの不一致です。顧客がUIを介してシステムと通信し、UIを介して結果を取得すると(UIは文字通り「ユーザーインターフェイス」を意味します)、バグもUIの観点から報告されます。そのため、開発者としては、あまり多くの選択肢はありませんが、UIを調べて、何が起こったのかを把握する必要があります。
そのため、トップダウンレイヤー接続が必要です。さて、なぜ両方向の接続ができないのでしょうか?
さて、このバグが発生する可能性のあるシナリオは3つあります。
UIコード自体で発生する可能性があるため、そこでローカライズすることができます。これは簡単です。場所を見つけて修正するだけです。
UIからの呼び出しの結果として、システムの他の部分で発生する可能性があります。どちらかと言えば難しいですが、呼び出しのツリーをトレースし、エラーが発生した場所を見つけて修正します。
また、UIコードへの呼び出しの結果として発生する可能性があります。これは難しいので、呼び出しをキャッチし、そのソースを見つけて、エラーが発生した場所を特定する必要があります。開始点はコールツリーの単一のブランチの深い位置にあり、最初に正しいコールツリーを見つける必要があることを考慮すると、UIコードへの呼び出しがいくつかある可能性があるため、デバッグをカットアウトします。
最も困難なケースを可能な限り排除するために、循環依存関係は強く推奨されず、レイヤーはほとんどトップダウン方式で接続されます。他の方法で接続が必要な場合でも、通常は制限され、明確に定義されています。たとえば、コールバック(一種のリバース接続)でさえ、コールバックで呼び出されるコードは通常、最初にこのコールバックを提供し、リバース接続用の一種の「オプトイン」を実装し、理解への影響を制限しますシステム。
階層化はツールであり、主に既存のシステムをサポートする開発者を対象としています。まあ、レイヤー間の接続もそれを反映しています。