抽象化層と間接化のレベルは別個の概念です。抽象化は、データやプログラム命令などの多くの要素の集約と意味のある命名、たとえばファイルやメソッド呼び出しの概念です。一方、間接性は、関係の実現の延期を促進するエンティティの分離です。たとえば、JNDIを使用して、プログラム内のリソースの識別を、アプリケーションコンテナによって最終的に提供される実際のリソースから分離します。
多くの場合、概念は密接に関連しており、どの概念が特定の構成に適用されるかは、進行中の運動または議論によって異なります。たとえば、APIを学習またはドキュメント化する場合、インターフェイスの抽象的な性質は重要です。アプリケーションの拡張性を追加したり、アプリケーションのテストを作成したりする場合、間接性のプロパティは重要です。
抽象化の層は、抽象化の集合であり、概念の整合性と使用の一貫性をそれらに与えます。CreateProcessは、プロセスをビルドおよび実行する一連のコードのwin32 API名です。「名前」は、このコンテキストにとって重要です。DoAllocMemThenMakeEnvThenFindEntryPointなどの関数を呼び出した場合、実際にはあまり抽象的ではないからです。Win32 APIなどのレイヤーは、プログラマーがベンチャーしないようにアドバイスされる障壁を提供します。消費電力(柔軟性、パフォーマンスなど)を犠牲にして、発信者の視点から複雑さを取り除きます。このトレードオフは、漏れやすい抽象化の頻繁な議論によって強調されます。Hibernateを使用する場合は直接SQL呼び出しを行うか、.NETを使用する場合はWin32呼び出しを行う必要があります。
インダイレクションに関しては、大部分の非自明なプログラムはユーザーコード化されたインダイレクションの何らかの形式で動作し、箱舟の前からCOBOLのINPUT-OUTPUTセクションを目撃します。データベースなどのリソースにアクセスすると、コード内のJDBC接続文字列の埋め込みがレベル0間接として、JNDI接続(リソースの選択をアプリケーションコンテナに委任する)がレベル1として、またいくつかのSpringコンストラクトがマッピングされることがあります複数のコンテナリソースの1つに対するレベル2のアプリケーションJNDI識別子。複数のレベルにより、関係(この場合は実行コードとデータベース間の関係)の外部の多数の関係者がその関係を操作できます。これは、インターフェイスやイベントなどの内部プログラムコンポーネントにも同様に適用されます。
他の品質に関係なく、抽象化によって複雑さが軽減され、間接化によって複雑さが増すことがわかります。抽象化は電力を削減し、間接性は電力を削減します。インダイレクションは、デフォルトの動作をカスタムコールバックによってオーバーライドできるようにすることで、抽象化の力を回復するために使用できます。