ソフトウェア開発における抽象化と情報隠蔽の違いは何ですか?
私は混乱しています。抽象化は、詳細な実装を隠し、情報を隠して、何かの詳細全体を抽象化します。
更新:これら 3 つの概念に対する適切な答えを見つけました。そこから取られたいくつかの引用については、以下の別の回答を参照してください。
ソフトウェア開発における抽象化と情報隠蔽の違いは何ですか?
私は混乱しています。抽象化は、詳細な実装を隠し、情報を隠して、何かの詳細全体を抽象化します。
更新:これら 3 つの概念に対する適切な答えを見つけました。そこから取られたいくつかの引用については、以下の別の回答を参照してください。
ソースへどうぞ!Grady Booch は次のように述べています (オブジェクト指向の分析と設計、49 ページ、第 2 版)。
抽象化とカプセル化は補完的な概念です。抽象化は、オブジェクトの観察可能な動作に焦点を当てています...カプセル化は、この動作を引き起こす実装に焦点を当てています...カプセル化は、ほとんどの場合、すべての情報を隠すプロセスである情報隠蔽によって達成されます本質的な特性に寄与しないオブジェクトの秘密。
言い換えれば、抽象化 = 外部のオブジェクト。カプセル化(情報隠蔽によって達成)=オブジェクトの内部、
例: .NET Framework では、System.Text.StringBuilder
クラスは文字列バッファーに対する抽象化を提供します。このバッファの抽象化により、実装に関係なくバッファを操作できます。StringBuilder
したがって、バッファーへのポインターやバッファーがいっぱいになったときのメモリ管理などを内部的に追跡する方法に関係なく、バッファーに文字列を追加できます(これは、情報隠蔽によるカプセル化で行われます)。
rp
OPは、彼が見つけたいくつかの引用、つまり「抽象化、カプセル化、および情報隠蔽」というタイトルのエドワードV.ベラードによる記事で彼の質問を更新しました。それ自体が答えになるはずなので、OPの更新のわずかに拡張および再フォーマットされたバージョンを再投稿しています。
(引用はすべて上記の記事からの引用です。)
抽象化:
「抽象化に関する混乱の1つのポイントは、プロセスとエンティティの両方としての使用です。プロセスとしての抽象化は、重要でない詳細を無視しながら、アイテムまたはアイテムのグループに関する本質的な詳細を抽出することを意味します。抽象化は、エンティティは、モデル、ビュー、または実際のアイテムのその他の焦点を絞った表現を示します。」
情報隠蔽:
「そのインターフェースまたは定義は、その内部の仕組みについてできるだけ明らかにしないように選択されました。」— [パルナス、1972b]
「抽象化は […] どの情報を隠す必要があるかを特定するための技術として使用できます。」
「人々が情報の隠蔽と、どの情報を隠蔽するかを識別するのに役立つ技術 (例えば、抽象化) とを区別できない場合、混乱が生じる可能性があります。」
カプセル化:
「それは[…]カプセルを構築することを指し、場合によっては概念的な障壁であり、いくつかのもののコレクションの周りにある.」— [Wirfs-Brock ら、1990 年]
「プロセスとしてのカプセル化とは、[…] コンテナ内に 1 つ以上のアイテムを封入する行為を意味します。エンティティとしてのカプセル化とは、1 つ以上のアイテムを保持 (収容、封入) するパッケージまたはエンクロージャを指します。」
「カプセル化が『情報隠蔽と同じこと』であるとすれば、『カプセル化されたものはすべて隠されている』という議論をする人もいるかもしれません。これは明らかに真実ではありません。」
結論:
「抽象化、情報の隠蔽、およびカプセル化は非常に異なりますが、非常に関連性の高い概念です。抽象化は、どの特定の情報を表示する必要があり、どの情報を非表示にする必要があるかを識別するのに役立つ技術であると主張できます。カプセル化は技術です。隠さなければならないものを隠し、見えるように意図されたものを見えるようにするような方法で情報をパッケージ化する.」
Abstraction
基本機能の上にレイヤーを提供することで、実装の詳細を隠しています。
Information Hiding
その実装によって影響を受けるデータを隠しています。private
との使用はpublic
これに該当します。たとえば、クラスの変数を非表示にします。
Encapsulation
Class
プログラミングなどで、すべての同様のデータと関数をグループに入れるだけです。Packet
ネットワーキングで。
クラスを使用することで、Abstraction
、 、Information Hiding
およびの 3 つの概念すべてを実装します。Encapsulation
単純な概念を複雑にしないでください。
カプセル化: データとメソッドを単一のユニットにまとめることがカプセル化です (例: クラス)
抽象化: 背景の詳細を含めずに、本質的なものだけを表現する行為です。(例: インターフェイス)
例と詳細については、GOTO :
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
承認された定義はこちら
PS: 11 年生で読んだ Sumita Arora の C++ という本の定義も覚えています ;)
ここで意図されている意味に最も近い、オックスフォード英語辞典 (OED) による抽象化の意味は、「思考を分離する行為」です。より適切な定義は、「背景や重要でない詳細を含めずに、何かの本質的な特徴を表すこと」かもしれません。
情報隠蔽とは、ソフトウェア コンポーネント (クラスなど) のユーザーは、コンポーネントの初期化方法とアクセス方法の基本的な詳細のみを知る必要があり、実装の詳細を知る必要がないという原則です。
編集: 抽象化とは、実装のどの部分を非表示にするかを決定するプロセスのように思えます。
したがって、抽象化と情報の隠蔽ではありません。抽象化を介して隠蔽された情報です。
抽象化は、実装の詳細を隠しています。
アクションを実行するために非常に単純なことを行うだけで十分なほど、何かを抽象化します。
情報隠蔽は、実装の詳細を隠しています。プログラミングは難しい。対処して処理することがたくさんあります。非常に詳細に追跡したい/必要とする変数が存在する場合があります。情報を非表示にすると、公開した変数やメソッドを使用して誰かが誤って何かを壊してしまうことがなくなります。
これら 2 つの概念は、オブジェクト指向プログラミングにおいて非常に密接に結びついています。
リークのある抽象化の法則に関するJoelの投稿を参照してください
基本的に、抽象化により、より高いレベルの概念を自由に考えることができます。プログラミング以外のアナロジーは、私たちのほとんどが私たちの食べ物がどこから来たのか、それがどのように生産されているのかを知らないということですが、私たちが(通常)それについて心配する必要がないという事実は私たちを他のことをするために解放しますプログラミング。
情報隠蔽に関しては、私は妨害に同意します。
抽象化 :抽象化は、オブジェクトの外部ビューを特定するために使用される概念/手法です。必要なインターフェースのみを利用可能にする。
情報隠蔽: 情報隠蔽によって抽象化が達成されるため、抽象化を補完します。外部ビュー以外のすべてを非表示にします。
カプセル化 :データと関連する機能をユニットにバインドすることです。抽象化と情報の隠蔽を容易にします。メンバーアクセスなどの機能をユニットに適用して、抽象化と情報の隠蔽を実現できるようにする
カプセル化: データ メンバーとメンバー関数を一緒にバインドすることをカプセル化と呼びます。カプセル化はクラスを通じて行われます。抽象化: 実装の詳細をフォームの使用法またはビューから隠すことを抽象化と呼びます。例: int x; int が内部でどのように機能するかはわかりません。しかし、int が機能することはわかっています。それが抽象化です。
抽象化により、複雑なプロセスを単純なプロセスとして扱うことができます。たとえば、標準の「ファイル」抽象化では、ファイルを連続したバイト配列として扱います。ユーザー/開発者は、クラスターや断片化の問題について考える必要さえありません。(抽象化は、通常、クラスまたはサブルーチンとして表示されます。)
情報隠蔽とは、悪意のある/無能なユーザーから抽象化を保護することです。一部の状態 (ハード ドライブの割り当てなど) の制御を元の開発者に制限することで、膨大な量のエラー処理が不要になります。ファイル システム ドライバ以外にハード ドライブに書き込むことができない場合、ファイル システム ドライバは、ハード ドライブに何がどこに書き込まれたかを正確に認識します。(この概念の通常の表現は、オブジェクト指向言語のprivate
andprotected
キーワードです。)
何かを抽象化するには、詳細を隠すか、抽象化する必要があるものの詳細を隠す必要があります。ただし、どちらもカプセル化によって実現できます。
したがって、情報の隠蔽は目標であり、抽象化はプロセスであり、カプセル化は技術です。
抽象化とは、ソフトウェアの本質的な詳細のみをユーザーに表示して、ユーザーがソフトウェアを使用または操作するのを支援し、そのソフトウェアの実装の詳細を表示しない (不可視にする) 技術を単に意味します。 カプセル化は、1 つ以上のアイテムを保持するパッケージを使用する手法であり、一部の情報 (特にプログラムの詳細) が表示され、一部はユーザーに表示されないため、カプセル化は情報隠蔽によって実現されます。要約すれば。抽象化は (外部的に) 観察可能な動作のためのものであり、カプセル化は (内部的に) 不可視性のためのものですが、これら 2 つは実際には補完的です。
InformationHiding に関する詳細を追加するだけで、このリンクは例を含む非常に優れたソースです
InformationHidingは、意図しない結合を防ぐために、システムの残りの部分から設計上の決定を隠す必要があるという考えです。InformationHiding は設計原則です。InformationHidingは、物事をカプセル化する方法を通知する必要がありますが、もちろんそうである必要はありません。
カプセル化はプログラミング言語の機能です。
抽象化とカプセル化はどちらも、現実世界のものをオブジェクトにモデル化し、プログラムやコードに実装できるようにする 4 つの基本的な OOP 概念のうちの 2 つです。抽象化とカプセル化は見た目が非常に似ているため、多くの初心者が混乱します。抽象化とは何かを誰かに尋ねると、それは不必要な詳細を隠して関連情報に焦点を当てる OOP の概念であると答え、カプセル化について尋ねると、多くの人はデータを外界から隠す別の OOP の概念であると言うでしょう。抽象化とカプセル化の両方が何かを隠しているため、定義は間違っていませんが、重要な違いは意図にあります。
抽象化は、より抽象的な画像、一種の 10,000 フィート ビューを提供することで複雑さを隠しますが、カプセル化は後で変更できるように内部作業を隠します。つまり、抽象化は設計レベルで詳細を隠し、カプセル化は実装レベルで詳細を隠します。
私も、抽象化とカプセル化の 2 つの概念について非常に混乱していました。しかし、 myjavatrainer.com で抽象化の記事を見たとき、抽象化とカプセル化はリンゴとオレンジであることが明らかになりました。両方が必要なので、実際に比較することはできません。
カプセル化はオブジェクトの作成方法であり、抽象化はオブジェクトが外の世界でどのように表示されるかです。
上記のすべての回答を1つずつ読んだ後、それを投稿するのをやめることはできません
抽象化には、作業を実行し、状態を報告および変更し、システム内の他のオブジェクトと「通信」できる抽象的な「アクター」を表すオブジェクトを定義する機能が含まれます。
ただし、カプセル化は上から非常に明確です->
カプセル化という用語は、状態の詳細を隠すことを指しますが、以前のプログラミング言語からデータ型の概念を拡張して動作を最も強くデータに関連付け、さまざまなデータ型が相互作用する方法を標準化することが抽象化の始まりです。
参考ウィキ
カプセル化:バインディング データとそれに作用するメソッド。これにより、他のクラスの他のすべてのメソッドからデータを隠すことができます。例:MyList
項目の追加、項目の削除、およびすべての項目の削除ができるクラス 、add
、remove
およびメソッドはremoveAll
、外部から直接アクセスできないリスト (プライベート配列) に対して作用します。
抽象化:無関係な動作とデータを隠しています。項目が実際にどのように保管、追加、または削除されるかは隠蔽 (抽象化) されています。私のデータは、単純な配列、ArrayList、LinkedList などに保持されている可能性があります。また、メソッドの実装方法は外部から隠されています。