ソフトウェア開発における抽象化と情報隠蔽の違いは何ですか?
私は混乱しています。抽象化は詳細な実装を隠し、情報を隠すことは何かの詳細全体を抽象化します。
更新:これらの3つの概念に対する良い答えを見つけました。そこから引用されたいくつかの引用については、以下の個別の回答を参照してください。
ソフトウェア開発における抽象化と情報隠蔽の違いは何ですか?
私は混乱しています。抽象化は詳細な実装を隠し、情報を隠すことは何かの詳細全体を抽象化します。
更新:これらの3つの概念に対する良い答えを見つけました。そこから引用されたいくつかの引用については、以下の個別の回答を参照してください。
回答:
ソースに行きます!Grady Boochは次のように述べています(オブジェクト指向分析とデザイン、49ページ、第2版):
抽象化とカプセル化は補完的な概念です:抽象化はオブジェクトの観察可能な動作に焦点を当てています...カプセル化はこの動作を引き起こす実装に焦点を合わせています...カプセル化はほとんどの場合、その本質的な特性に貢献しないオブジェクトの秘密。
言い換えると、抽象化=外部のオブジェクト。カプセル化(情報の隠蔽により実現)=内部的にオブジェクト、
例:.NET Frameworkでは、System.Text.StringBuilder
クラスは文字列バッファの抽象化を提供します。このバッファーの抽象化により、その実装に関係なくバッファーを操作できます。したがって、StringBuilder
バッファがいっぱいになったときに内部でバッファへのポインタやメモリの管理などを内部で追跡する方法に関係なく、バッファに文字列を追加できます(情報の非表示によるカプセル化で行われます)。
rp
OPは、エドワードV.ベラードによる「抽象化、カプセル化、および情報の隠蔽」というタイトルの記事で、彼が見つけたいくつかの引用で質問を更新しました。それはそれ自体で答えになるはずなので、私はOPのアップデートを少し拡張して再フォーマットしたバージョンを再投稿しています。
(引用はすべて上記の記事から引用されます。)
抽象化:
「抽象化に関する混乱の1つのポイントは、プロセスとエンティティの両方としての使用です。抽象化は、プロセスとして、本質的な詳細を無視しながら、アイテムまたはアイテムのグループに関する本質的な詳細を抽出することを意味します。抽象化、エンティティは、実際のアイテムのモデル、ビュー、またはその他のフォーカスされた表現を示します。」
情報の非表示:
「そのインターフェースまたは定義は、その内部の仕組みについてできる限り明らかにしないように選択されました。」— [パルナス、1972b]
「抽象化は、どの情報を非表示にするかを識別するための手法として使用できます。」
「人々が情報の隠蔽と、どの情報が隠されるべきかを特定するのを助けるために使用される技術(例えば、抽象化)とを区別できない場合、混乱が起こり得る。」
カプセル化:
「[…]は、いくつかのコレクションの周りにカプセルを構築することを指します。— [Wirfs-Brock et al、1990]
「プロセスとしてのカプセル化とは、1つまたは複数のアイテムを[…]コンテナー内に封入する行為を意味します。エンティティーとしてのカプセル化とは、1つまたは複数のアイテムを保持(包含、封入)するパッケージまたはエンクロージャーを指します。」
「カプセル化が「情報隠蔽と同じもの」だったとしたら、「カプセル化されたものもすべて隠されている」という主張をするかもしれません。これは明らかに真実ではありません。」
結論:
「抽象化、情報の隠蔽、およびカプセル化は非常に異なりますが、関連性の高い概念です。抽象化は、どの特定の情報を表示し、どの情報を非表示にするかを識別するのに役立つ手法であると主張できます。カプセル化はその手法です非表示にする必要があるものを非表示にし、表示されるものを表示するように情報をパッケージ化するため。」
Information Hiding
実装を隠し、それによって達成(または実装の非表示)するのに対し、ジェネリックclass
はカプセル化と抽象化をprivate
アクセスを通じて達成するように
Abstraction
基本機能の上にレイヤーを提供することにより、実装の詳細を隠しています。
Information Hiding
その実装によって影響を受けているデータを隠しています。の使用private
とpublic
これの下になります。たとえば、クラスの変数を非表示にします。
Encapsulation
同様のすべてのデータと関数を、たとえばClass
プログラミングなどでグループ化するだけです。Packet
ネットワーキングで。
クラスを使用することにより、我々はすべての3つの概念を実装する- Abstraction
、Information Hiding
およびEncapsulation
単純な概念を複雑にしないでください。
カプセル化:データとメソッドを1つのユニットにまとめるとカプセル化(例:クラス)
抽象化:背景の詳細を含めずに、本質的なものだけを表す行為です。(例:インターフェース)
例と詳細情報GOTOの場合:
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
ここで承認された定義
PS:私はまた、私が11番目のクラスで読んだSumita AroraによるC ++という名前の本の定義を覚えています;)
ここで意図されている意味に最も近いオックスフォード英語辞典(OED)によって与えられた抽象化の意味は、「思考を分離する行為」です。より適切な定義は、「背景や本質的でない詳細を含まずに何かの本質的な特徴を表現すること」かもしれません。
情報の非表示は、ソフトウェアコンポーネント(クラスなど)のユーザーが、コンポーネントの初期化とアクセス方法の本質的な詳細のみを知る必要があり、実装の詳細を知る必要がないという原則です。
編集:抽象化は、実装のどの部分を非表示にするかを決定するプロセスであるように私には思えます。
つまり、抽象化ではなく、情報を隠蔽することです。それはVIAの抽象化を隠す情報です。
抽象化
抽象化は、背景の詳細を含めずに本質的な詳細を表す行為です。抽象クラスはメソッドシグネチャのみを持ち、実装クラスは独自の実装を持つことができます。これにより、複雑な詳細はユーザーから隠されます。抽象化は外側のビューに焦点を当てています。言い換えると、抽象化は、実際の実装からのインターフェースの分離です。
カプセル化
カプセル化では、データメンバーとメソッドを1つのユニットにバインドする方法について説明します。情報の隠蔽は、カプセル化の主な目的です。カプセル化は、private、public、protectedなどのアクセス指定子を使用して実現されます。クラスメンバー変数はプライベートにされているため、外部から直接アクセスすることはできません。カプセル化は内部ビューに焦点を当てています。つまり、カプセル化は、オブジェクト内の情報を他のオブジェクトから保護するために使用される手法です。
抽象化 -これは、無関係で面倒な詳細を含めずに、オブジェクトの本質的な特性を識別するプロセスです。
カプセル化 -データとこのデータを操作する関数を単一のユニットに囲むプロセスです。
抽象化とカプセル化は関連していますが、補完的な概念です。
抽象化はプロセスです。カプセル化は、抽象化が実装されるメカニズムです。
抽象化は、オブジェクトの観察可能な動作に焦点を当てています。カプセル化は、この動作を引き起こす実装に焦点を当てています。
情報の非表示 -オブジェクトの実装の詳細を非表示にするプロセスです。これはカプセル化の結果です。
漏れのある抽象化の法則に関するジョエルの投稿を参照してください
基本的に、抽象化により、より高いレベルの概念を自由に考えることができます。プログラミング以外の類推では、ほとんどの人が自分の食べ物がどこから来たのか、どのようにして生産されたのかわかりませんが、私たちが(通常)心配する必要がないという事実により、次のような他のことをすることができますプログラミング。
情報隠蔽については、渋滞に同意します。
抽象化により、複雑なプロセスを単純なプロセスとして扱うことができます。たとえば、標準の「ファイル」抽象化では、ファイルを連続したバイト配列として扱います。ユーザーや開発者は、クラスターや断片化の問題について考える必要さえありません。(通常、抽象化はクラスまたはサブルーチンとして表示されます。)
情報の隠蔽とは、抽象化を悪意のある/無能なユーザーから保護することです。一部の状態(ハードドライブの割り当てなど)の制御を元の開発者に制限することにより、大量のエラー処理が冗長になります。ファイルシステムドライバー以外の誰もがハードドライブに書き込むことができない場合、ファイルシステムドライバーはハードドライブに何がどこに書き込まれたかを正確に認識します。(この概念の一般的な症状があるprivate
とprotected
オブジェクト指向言語のキーワード。)
InformationHidingに関する詳細を追加するだけで、このリンクは例のある非常に優れたソースです
InformationHidingは、意図しない結合を防ぐために、システムの他の部分から設計上の決定を隠すべきであるという考えです。InformationHidingは設計原則です。InformationHidingは、あなたが道知らせるべきカプセル化のことを、もちろん、それはする必要はありません。
カプセル化はプログラミング言語の機能です。
抽象化とカプセル化は、4つの基本的なOOP概念のうちの2つであり、現実世界のものをオブジェクトにモデル化して、プログラムやコードに実装できるようにします。多くの初心者は、どちらも非常によく似ているため、抽象化とカプセル化を混同しています。抽象化とは何かを尋ねると、不必要な詳細を隠すことで関連情報に焦点を当てたOOPの概念であると彼は言うでしょう。抽象化とカプセル化の両方が何かを隠しているので、定義は間違っていませんが、主な違いは意図にあります。
抽象化は、より抽象的な図、10,000フィートのビューのようなものを提供することで複雑さを隠し、カプセル化は内部の動作を隠して後で変更できるようにします。つまり、抽象化は設計レベルで詳細を隠し、カプセル化は実装レベルで詳細を隠します。
カプセル化:バインディングデータとそれに作用するメソッド。これにより、他のクラスの他のすべてのメソッドからデータを隠すことができます。例:MyList
、アイテムを追加項目を削除し、すべての項目を削除する方法をできるクラスadd
、remove
およびremoveAll
外部から直接アクセスすることはできませんリスト(プライベート配列)に作用します。
抽象化:無関係な動作とデータを隠しています。アイテムが実際にどのように保存、追加、または削除されるかは非表示(抽象化)です。私のデータは、単純な配列、ArrayList、LinkedListなどに保持される場合があります。また、メソッドの実装方法は外部から隠されています。
カプセル化-制御された方法で内部データへのアクセスを強制するか、メンバーが直接アクセスされるのを防ぎます。
抽象化-特定のメソッドの実装の詳細を非表示にすることは、抽象化と呼ばれます
例を参考に理解しましょう:-
class Rectangle
{
private int length;
private int breadth;// see the word private that means they cant be accesed from
outside world.
//now to make them accessed indirectly define getters and setters methods
void setLength(int length)
{
// we are adding this condition to prevent users to make any irrelevent changes
that is why we have made length private so that they should be set according to
certain restrictions
if(length!=0)
{
this.length=length
}
void getLength()
{
return length;
}
// same do for breadth
}
ここで抽象化のために、アクセスのみ可能なメソッドを定義し、ユーザーはメソッドの本体が何であり、どのように機能するかを知りません。上記の例を考えてみましょう。長方形の面積を計算するメソッドエリアを定義できます。
public int area()
{
return length*breadth;
}
ここで、ユーザーが上記の方法を使用するときはいつでも、計算方法ではなく面積を取得します。println()メソッドの例を考えることができます。これは、印刷に使用され、データをどのように印刷するかがわからないためです。私はブログを詳細に書いています。抽象化とカプセル化の詳細については、以下のリンクをご覧ください。
これらの用語は標準化されたIEEE定義であり、https://pascal.computer.org/で検索できることに注意してください。
抽象化
情報隠蔽
カプセル化