両方の用語を同じ意味で使用できるかどうかはわかりません。たぶん、日常のプログラミングには関係のない、コンピュータサイエンスの学問的な違いがあるのでしょうか。または、間違っていない両方の用語を交換して使用できますか?多分それは私が両方の用語を使う文脈に依存しますか?
編集:両方の用語が交換可能であると思う理由は ウィキペディアの抽象化レイヤーに関するエントリ です。そこで、あなたは David Wheelers quoteを見つけることができます。
抽象化簡略化を扱いますindirection場所を扱います。
抽象化は、オブジェクトの複雑な詳細を、より簡単で操作しやすい用語で「隠す」メカニズムです。プログラミングの良い例は、機械コードと、最終的に機械コードに基づくアプリケーションを作成するためのさまざまなツールとの詳細の違いです。 Visual Studio IDEでWindowsフォームアプリケーションを作成することを検討してください。 IDEを使用すると、アプリケーションを簡単に操作できるアイテムの観点から、What-You-See-Is-What-You-Getの方法で考えることができます。画面ウィジェットの位置は、ウィジェットをドラッグして変更できるフレーム内の視覚的な場所に抽象化されます。内部的には、IDEは、高水準言語(C#など)などの抽象化の別のレイヤーを使用してウィジェットを操作します)C#自体はマシンコードを使用して操作されるのではなく、それ自体がコンピューターとオペレーティングシステムを抽象化した「共通ランタイム環境」を使用して操作されます。
間接参照は、アイテムの場所を透明にすることを指します。 WebリソースのURIがわかっている場合は、その正確な場所がわからなくてもリソースにアクセスできます。リソースに直接アクセスするのではなく、一連のサーバー、アプリケーション、ルーターを介してリクエストを渡すチャネルを介してアクセスします。間接指定は、場所が抽象化される特殊なタイプの抽象化であると見なすことができます。
抽象化は、間接参照を使用して実装されます。
たとえば、仮想メモリ:抽象化は、完全に自由に使用できる連続したアドレス空間です。この抽象化は、ページテーブルを介した間接参照を使用して実装されます。物理メモリアドレスに直接アクセスする代わりに、仮想アドレスから物理アドレスに変換されます。
抽象化の層を追加するには、間接層を追加する必要があります。ただし、間接参照を追加しても、必ずしも抽象化が得られるわけではありません。たとえば、すべての変数にゲッターとセッターを設定することは間接的なレイヤーですが、単純な値を取得して設定するだけの場合、抽象化はありません。
まず、用語の適切な定義を試してみましょう。
抽象化のレイヤーとは:
a) there is large number of positions which use abstraction
(layer = all the positions together)
b) each position is hiding some complex stuff, but allows invoking it
using only simple code.
(abstraction == one-to-one mapping between simple code and complex code)
一方、間接参照のレベルは次のことを意味します。
a) you're counting levels
b) indirection==there are several steps before you can reach or access the data
c) level of indirection is just how many steps it takes to access the data
これらの両方は、あなたが使用する限り、同じことを意味します:
a) step = going from simple code to complex code.
抽象化レイヤーと間接化レベルは、異なる概念です。抽象化とは、データやプログラムの命令などの多くの要素の集約と意味のある命名です。たとえば、ファイルやメソッドの呼び出しの概念ですが、間接化とは、関係の実現の延期を容易にするためのエンティティの分離です。たとえば、JNDIを使用して、プログラム内のリソースの識別を、アプリケーションコンテナによって最終的に提供される可能性がある実際のリソースから分離します。
多くの場合、概念は関連しており、特定の構成にどの概念を適用するかは、進行中の演習またはディスカッションによって異なります。たとえば、APIを学習または文書化する場合、インターフェースの抽象的な性質が重要です。アプリケーションに拡張性を追加したり、アプリケーションのテストを作成したりする場合、その間接性のプロパティは重要です。
抽象化のレイヤーとは、抽象化の集合であり、概念の整合性と使用の一貫性を抽象化します。 CreateProcessは、プロセスを構築して実行する一連のコードのwin32 API名です。 「名前」はこのコンテキストにとって重要です。DoAllocMemThenMakeEnvThenFindEntryPointなどの関数を呼び出した場合、実際にはそれほど抽象的ではないからです。 Win32 APIなどのレイヤーは、プログラマーがベンチャーしないようにアドバイスできる障壁を提供します。電力を削減(柔軟性、パフォーマンスなど)を犠牲にして、呼び出し側の視点から複雑さを取り除きます。このトレードオフは、リークの多い抽象化の頻繁な議論によって強調されています。Hibernateを使用する場合は直接SQL呼び出しを行うか、.NETを使用する場合はWin32呼び出しを行う必要がある場合があります。
インダイレクションに関しては、ほとんどの重要なプログラムは何らかの形でユーザーがコード化したインダイレクションで動作し、アークの前からCOBOLのINPUT-OUTPUTセクションを確認します。データベースなどのリソースにアクセスすると、コードにJDBC接続文字列がレベル0の間接参照として埋め込まれ、JNDI接続(リソースの選択がアプリケーションコンテナーに委任されます)がレベル1になり、Springの構成要素がマッピングされます。レベル2として、多くのコンテナリソースの1つに対するアプリケーションJNDI識別子。複数のレベルにより、関係(この場合は、実行コードとデータベース間の関係)の外部にある多数の関係者がその関係を操作できます。これは、インターフェイスやイベントなどの内部プログラムコンポーネントにも同様に適用されます。
他の資質に関係なく、抽象化は複雑さを減らし、間接化は複雑さを増やすことがわかります。抽象化は電力を削減しますが、間接化はそれを増加させます。間接指定を使用して、デフォルトの動作をカスタムコールバックでオーバーライドできるようにすることで、抽象化の力を回復できます。
私の理解では、抽象化は主に関数を指し、間接は主にデータを指します。つまり、抽象化のレベルはスタックトレースが取得する深さであり、間接参照のレベルは逆参照する必要があるポインターの数です。少なくともそれが私が用語を使う方法です。
Intへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターには、6つの間接レベルがありますが、抽象化のレイヤーはまったくありません。
抽象化の良い例は、データベースにアイテムを格納する単一のメソッドを呼び出すことです。このメソッドは、データベースの接続と呼び出しの詳細を抽象化します。間接参照の例は、構造体を使用して割り込みにアクセスする場合です。構造体に値を設定するときも、割り込みにアクセスしています。構造体のメンバー名をメモリ内の特定のポイントに与えることにより、構造体を介して間接的に行われます。
したがって、抽象化は実装の詳細を隠し、間接は単に何かにアクセスするための「間接的な」インターフェースを提供するだけです。
抽象化とは、何が隠されているかを理解する必要がない場合で、間接的に行う場合です。