「抽象化の層」と「間接化のレベル」の違いは何ですか?


38

両方の用語を同じ意味で使用できるかどうかはわかりません。たぶん、日々のプログラミングに関係のないコンピューターサイエンスの学問的な違いがありますか?または、間違っていなくても両方の用語を同じ意味で使用できますか?たぶん、両方の用語を使用するコンテキストに依存しますか?

編集:両方の用語が互換性があると思う理由は、抽象化レイヤーに関するWikipediaのエントリです。そこでは、David Wheelersが「コンピュータサイエンスのすべての問題は、別のレベルの間接参照によって解決できる」という引用を見つけることができます。


7
...間接参照のレベルが多すぎるという問題を除きます!
メイソンウィーラー

@MasonWheeler:間接性のより間接的なレベルをもう1つ追加できます…
ジョンパーディ

C ++では、間接化の層なしで抽象化の層を追加できるため、同じことを意味することはできません。
fredoverflow

回答:


30

抽象化は単純化を扱い、間接性は場所を扱います。

  • 抽象化は、オブジェクトの複雑な詳細を、よりシンプルで操作しやすい用語で「隠す」メカニズムです。プログラミングの良い例は、マシンコードと、最終的にマシンコードに基づいたアプリケーションを作成するためのさまざまなツールの詳細の違いです。Visual Studio IDEを使用してWindowsフォームアプリケーションを作成することを検討してください。IDEを使用すると、What-You-See-Is-What-You-Getの方法で操作しやすいアイテムの観点からアプリケーションを考えることができます。画面ウィジェットの位置は、ウィジェットをドラッグして変更できるフレーム内の視覚的な位置に抽象化されます。内部的に、IDEは、高レベル言語(C#など)などの抽象化の別のレイヤーを使用してウィジェットを操作します。C#自体はマシンコードを使用して操作されるのではなく、「共通ランタイム環境」を使用して操作されます

  • インダイレクションとは、アイテムの場所を透明にすることです。WebリソースのURIを知っている場合、正確な場所を知らなくてもリソースにアクセスできます。リソースに直接アクセスするのではなく、一連のサーバー、アプリケーション、およびルーターを介して要求を渡すチャネルを介してアクセスします。インダイレクションは、場所が抽象化される特別なタイプの抽象化と見なされる場合があります。


2
これまでに+1のベストアンサー!書こうとしていたが、これは私が考えていたものに十分近い。
ニュートピア

27

抽象化は、インダイレクションを使用して実装されます。

たとえば、仮想メモリ:抽象化は、自由に使用できる連続したアドレス空間です。この抽象化は、ページテーブルを介したインダイレクションを使用して実装されます。物理メモリアドレスに直接アクセスする代わりに、仮想アドレスから物理アドレスに変換されます。

抽象化のレイヤーを追加するには、間接化のレイヤーを追加する必要があります。ただし、間接指定を追加しても、必ずしも抽象化されるわけではありません。たとえば、すべての変数にゲッターとセッターを設定することは間接的な層ですが、単純な値を取得および設定するだけであれば、抽象化は行われません。


2
実際、最後の例はあまり良くありません。プレーンなゲッターとセッターは抽象化を追加します。唯一知っているのは、それらが単純であるということです。クラスがそれらを宣言することです。実装を変更する場合、抽象化に対して構築されたコードは影響を受けません。
back2dos

間接ではあるが、抽象化ではない、より良い例を挙げることができますか?
氏コーダー

1
間違いなく間違った例
モルグ。

3
誰がクラスについて何か言いましたか?また、変数の可視性を変更することについても何も言いませんでした。直接アクセスすることを妨げるものは何もありません。それは変数です。しかし、ゲッターとセッターを介して、間接的なレベルでそれを行うこともできます。ゲッターとセッターを使用するセマンティクスは、変数に直接アクセスするのと同じなので、抽象化はありません。
オースティン

2
ゲッターとセッターが必ずしも変数に「ただ」アクセスするわけではないことを除いて。ゲッターとセッターを使用している場合は、抽象化を追加します。ユーザーが気付かないうちに異なる変数を使用するように変更できるため、抽象化です。
ドミニクマクドネル

9

まず、用語の適切な定義を試してみましょう。

  1. 抽象化の層は次を意味します:

     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)
    
  2. 一方、間接性のレベルは次のことを意味します。

      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. 

7

私の理解では、抽象化はほとんどの場合関数を指し、間接化はほとんどの場合データを指します。つまり、抽象化のレベルはスタックトレースの深さであり、間接化のレベルは間接参照する必要のあるポインターの数です。少なくともそれは私が用語を使用する方法です。


関数へのポインタとしてモデル化されている仮想関数で?
カレス

7

抽象化層と間接化のレベルは別個の概念です。抽象化は、データやプログラム命令などの多くの要素の集約と意味のある命名、たとえばファイルやメソッド呼び出しの概念です。一方、間接性は、関係の実現の延期を促進するエンティティの分離です。たとえば、JNDIを使用して、プログラム内のリソースの識別を、アプリケーションコンテナによって最終的に提供される実際のリソースから分離します。

多くの場合、概念は密接に関連しており、どの概念が特定の構成に適用されるかは、進行中の運動または議論によって異なります。たとえば、APIを学習またはドキュメント化する場合、インターフェイスの抽象的な性質は重要です。アプリケーションの拡張性を追加したり、アプリケーションのテストを作成したりする場合、間接性のプロパティは重要です。

抽象化の層は、抽象化の集合であり、概念の整合性と使用の一貫性をそれらに与えます。CreateProcessは、プロセスをビルドおよび実行する一連のコードのwin32 API名です。「名前」は、このコンテキストにとって重要です。DoAllocMemThenMakeEnvThenFindEntryPointなどの関数を呼び出した場合、実際にはあまり抽象的ではないからです。Win32 APIなどのレイヤーは、プログラマーがベンチャーしないようにアドバイスされる障壁を提供します。消費電力(柔軟性、パフォーマンスなど)を犠牲にして、発信者の視点から複雑さを取り除きます。このトレードオフは、漏れやすい抽象化の頻繁な議論によって強調されます。Hibernateを使用する場合は直接SQL呼び出しを行うか、.NETを使用する場合はWin32呼び出しを行う必要があります。

インダイレクションに関しては、大部分の非自明なプログラムはユーザーコード化されたインダイレクションの何らかの形式で動作し、箱舟の前からCOBOLのINPUT-OUTPUTセクションを目撃します。データベースなどのリソースにアクセスすると、コード内のJDBC接続文字列の埋め込みがレベル0間接として、JNDI接続(リソースの選択をアプリケーションコンテナに委任する)がレベル1として、またいくつかのSpringコンストラクトがマッピングされることがあります複数のコンテナリソースの1つに対するレベル2のアプリケーションJNDI識別子。複数のレベルにより、関係(この場合は実行コードとデータベース間の関係)の外部の多数の関係者がその関係を操作できます。これは、インターフェイスやイベントなどの内部プログラムコンポーネントにも同様に適用されます。

他の品質に関係なく、抽象化によって複雑さが軽減され、間接化によって複雑さが増すことがわかります。抽象化は電力を削減し、間接性は電力を削減します。インダイレクションは、デフォルトの動作をカスタムコールバックによってオーバーライドできるようにすることで、抽象化の力を回復するために使用できます。


1

intへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターには、6つの間接レベルがありますが、抽象化のレイヤーはまったくありません。


0

抽象化の良い例は、単一のメソッドを呼び出してデータベースにアイテムを保存することです。このメソッドは、データベースの接続と呼び出しの詳細を抽象化します。インダイレクションの例が、割り込みにアクセスするために構造体を使用している場合。構造体に値を設定すると、まだ割り込みにアクセスしています。構造体のメンバー名をメモリ内の特定のポイントに与えることにより、構造体を介して間接的に行われます。

したがって、抽象化は、インダイレクションが単に何かにアクセスするための「間接的な」インターフェースを提供する実装の詳細を隠します。

抽象化とは、何が隠されているか、どこを間接的に行うかを理解する必要がない場合です。


-1

抽象化のレベル(またはレイヤー)の追加と間接化のレベルの追加は、同じことを言う2つの方法です。問題を解決するとき、通常は直接的な解決策を試みます。それが不可能な場合があるため、間接的な解決策を試してみてください。これには、問題を単純化するために何らかの抽象化を導入する必要があります。これは、問題が複雑で直接解決できないためです。間接的なアプローチで問題を解決したので、問題を再度解決することを考慮しない理由はありませんが、より一般的には; これには、別のより高いレベルの抽象化を導入することが含まれます。そして、この新しいより一般的なソリューションは、元の間接ソリューションよりもさらに間接的です。つまり、別のレベルの間接化が導入されています。


3
これは作られたポイントを超える大幅な何かを追加しているようだし、前7つの回答で説明していません
ブヨ

ありがとう、Gnat。私はあなたのポイントを取ります、そして、この興味深い質問が残念なことに多くのスパムを引き付けます!
ChrisC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.