抽象化VS情報隠蔽VSカプセル化


167

ソフトウェア開発における抽象化情報隠蔽の違いは何ですか?

私は混乱しています。抽象化は詳細な実装を隠し、情報を隠すことは何かの詳細全体を抽象化します。

更新:これらの3つの概念に対する良い答えを見つけました。そこから引用されたいくつかの引用については、以下の個別の回答を参照してください


「カプセル化は、情報をパッケージ化して、非表示にする必要のあるものを非表示にし、表示しようとしているものを表示する方法です。」; カプセル化は情報を隠すことで実現されることを思い出してください。
wulfgarpro '20年


引用キンクが壊れている
Rishi Dua

回答:


152

ソースに行きます!Grady Boochは次のように述べています(オブジェクト指向分析とデザイン、49ページ、第2版):

抽象化とカプセル化は補完的な概念です:抽象化はオブジェクトの観察可能な動作に焦点を当てています...カプセル化はこの動作を引き起こす実装に焦点を合わせています...カプセル化はほとんどの場合、その本質的な特性に貢献しないオブジェクトの秘密。

言い換えると、抽象化=外部のオブジェクト。カプセル化(情報の隠蔽により実現)=内部的にオブジェクト、

例:.NET Frameworkでは、System.Text.StringBuilderクラスは文字列バッファの抽象化を提供します。このバッファーの抽象化により、その実装に関係なくバッファーを操作できます。したがって、StringBuilderバッファがいっぱいになったときに内部でバッファへのポインタやメモリの管理などを内部で追跡する方法に関係なく、バッファに文字列を追加できます(情報の非表示によるカプセル化で行われます)。

rp


5
抽象化とカプセル化が補完的であるのと同じように、カプセル化と情報隠蔽も補完的だと思いますか?確かに、カプセル化は情報の隠蔽によって実現されますが、カプセル化は情報の隠蔽が実現されるメカニズムではありませんか?
wulfgarpro 2011

Boochの定義のもう1つの実例は、こちらから
ライフバランス

抽象化はクライアントコードの観点から最もよく理解され、カプセル化はサービスコード(つまり、カプセル化クラス自体)の観点から最もよく理解されると言って間違いありませんか。
user1338998

上記の定義のための実世界の例がここで説明されていますstackoverflow.com/a/635755/3181500
user3181500

83

OPは、エドワードV.ベラードによる「抽象化、カプセル化、および情報の隠蔽」というタイトルの記事で、彼が見つけたいくつかの引用で質問を更新しました。それはそれ自体で答えになるはずなので、私はOPのアップデートを少し拡張して再フォーマットしたバージョンを再投稿しています。

(引用はすべて上記の記事から引用されます。)

抽象化:

「抽象化に関する混乱の1つのポイントは、プロセスとエンティティの両方としての使用です。抽象化は、プロセスとして、本質的な詳細を無視しながら、アイテムまたはアイテムのグループに関する本質的な詳細を抽出することを意味します。抽象化、エンティティは、実際のアイテムのモデル、ビュー、またはその他のフォーカスされた表現を示します。」

情報の非表示:

「そのインターフェースまたは定義は、その内部の仕組みについてできる限り明らかにしないように選択されました。」— [パルナス、1972b]

「抽象化は、どの情報を非表示にするかを識別するための手法として使用できます。」

「人々が情報の隠蔽と、どの情報が隠されるべきかを特定するのを助けるために使用される技術(例えば、抽象化)とを区別できない場合、混乱が起こり得る。」

カプセル化:

「[…]は、いくつかのコレクションの周りにカプセルを構築することを指します。— [Wirfs-Brock et al、1990]

「プロセスとしてのカプセル化とは、1つまたは複数のアイテムを[…]コンテナー内に封入する行為を意味します。エンティティーとしてのカプセル化とは、1つまたは複数のアイテムを保持(包含、封入)するパッケージまたはエンクロージャーを指します。」

「カプセル化が「情報隠蔽と同じもの」だったとしたら、「カプセル化されたものもすべて隠されている」という主張をするかもしれません。これは明らかに真実ではありません。」

結論:

「抽象化、情報の隠蔽、およびカプセル化は非常に異なりますが、関連性の高い概念です。抽象化は、どの特定の情報を表示し、どの情報を非表示にするかを識別するのに役立つ手法であると主張できます。カプセル化はその手法です非表示にする必要があるものを非表示にし、表示されるものを表示するように情報をパッケージ化するため。」


実質的に素晴らしい説明。Javaで具体的な例を提供するのは素晴らしいことです。Javaのセッター/ゲッターはInformation Hiding実装を隠し、それによって達成(または実装の非表示)するのに対し、ジェネリックclassはカプセル化と抽象化をprivateアクセスを通じて達成するように
見え

57

Abstraction 基本機能の上にレイヤーを提供することにより、実装の詳細を隠しています。

Information Hidingその実装によって影響を受けているデータを隠しています。の使用privatepublicこれの下になります。たとえば、クラスの変数を非表示にします。

Encapsulation同様のすべてのデータと関数を、たとえばClassプログラミングなどでグループ化するだけです。Packetネットワーキングで。

クラスを使用することにより、我々はすべての3つの概念を実装する- AbstractionInformation HidingおよびEncapsulation


33

単純な概念を複雑にしないでください。

カプセル化:データとメソッドを1つのユニットにまとめるとカプセル化(例:クラス)

抽象化:背景の詳細​​を含めずに、本質的なものだけを表す行為です。(例:インターフェース)

例と詳細情報GOTOの場合:

http://thecodekey.com/C_VB_Codes/Encapsulation.aspx

http://thecodekey.com/C_VB_Codes/Abstraction.aspx

ここで承認された定義

PS:私はまた、私が11番目のクラスで読んだSumita AroraによるC ++という名前の本の定義を覚えています;)


6

ここで意図されている意味に最も近いオックスフォード英語辞典(OED)によって与えられた抽象化の意味は、「思考を分離する行為」です。より適切な定義は、「背景や本質的でない詳細を含まずに何かの本質的な特徴を表現すること」かもしれません。

情報の非表示は、ソフトウェアコンポーネント(クラスなど)のユーザーが、コンポーネントの初期化とアクセス方法の本質的な詳細のみを知る必要があり、実装の詳細を知る必要がないという原則です。

編集:抽象化は、実装のどの部分を非表示にするかを決定するプロセスであるように私には思えます。

つまり、抽象化ではなく、情報を隠蔽することです。それはVIAの抽象化を隠す情報です。


4

抽象化

抽象化は、背景の詳細​​を含めずに本質的な詳細を表す行為です。抽象クラスはメソッドシグネチャのみを持ち、実装クラスは独自の実装を持つことができます。これにより、複雑な詳細はユーザーから隠されます。抽象化は外側のビューに焦点を当てています。言い換えると、抽象化は、実際の実装からのインターフェースの分離です。

カプセル化

カプセル化では、データメンバーとメソッドを1つのユニットにバインドする方法について説明します。情報の隠蔽は、カプセル化の主な目的です。カプセル化は、private、public、protectedなどのアクセス指定子を使用して実現されます。クラスメンバー変数はプライベートにされているため、外部から直接アクセスすることはできません。カプセル化は内部ビューに焦点を当てています。つまり、カプセル化は、オブジェクト内の情報を他のオブジェクトから保護するために使用される手法です。


3

抽象化により、実装の詳細が隠されます。

アクションを実行するために非常に単純なことをするだけでよいように、十分に高いポイントまで何かを抽象化します。

情報非表示は、実装の詳細を非表示にしています。プログラミングは難しいです。対処し、処理することがたくさんあります。非常に密接に追跡したい変数が存在する可能性があります。情報を非表示にすると、公開した変数またはメソッドを使用して誰かが誤って何かを壊すことがなくなります。

これら2つの概念は、オブジェクト指向プログラミングで密接に結びついています。


3

抽象化 -これは、無関係で面倒な詳細を含めずに、オブジェクトの本質的な特性を識別するプロセスです。

カプセル化 -データとこのデータを操作する関数を単一のユニットに囲むプロセスです。

抽象化とカプセル化は関連していますが、補完的な概念です。

  1. 抽象化はプロセスです。カプセル化は、抽象化が実装されるメカニズムです。

  2. 抽象化は、オブジェクトの観察可能な動作に焦点を当てています。カプセル化は、この動作を引き起こす実装に焦点を当てています。

情報の非表示 -オブジェクトの実装の詳細を非表示にするプロセスです。これはカプセル化の結果です。


2

カプセル化:データメンバーとメンバー関数をバインドすることをカプセル化と呼びます。カプセル化はクラスを通じて行われます。抽象化:実装の詳細を使用法から、またはビューから隠すことを抽象化と呼びます。例:int x; intが内部でどのように機能するかはわかりません。しかし、intが機能することはわかっています。それが抽象化です。


2

抽象化:抽象化は、オブジェクトの外部ビューとなるものを識別するために使用される概念/手法です。必要なインターフェースのみを使用可能にする。

情報の隠蔽:情報の隠蔽によって抽象化が実現されるため、抽象化を補完します。外部ビュー以外のすべてを非表示にします。

カプセル化:ユニットへのデータと関連機能のバインドです。抽象化と情報の隠蔽を容易にします。メンバーアクセスなどの機能をユニットに適用して、抽象化と情報の非表示を実現する


2

漏れのある抽象化の法則に関するジョエルの投稿を参照してください

JoelOnsoftware

基本的に、抽象化により、より高いレベルの概念を自由に考えることができます。プログラミング以外の類推では、ほとんどの人が自分の食べ物がどこから来たのか、どのようにして生産されたのかわかりませんが、私たちが(通常)心配する必要がないという事実により、次のような他のことをすることができますプログラミング。

情報隠蔽については、渋滞に同意します。


2

非常に短い

カプセル化:–情報の隠蔽

抽象化 :–実装の隠蔽

Abstractionあなたに焦点を当てることができますwhat the object doesカプセル化手段つつ、how an object works


1

抽象化により、複雑なプロセスを単純なプロセスとして扱うことができます。たとえば、標準の「ファイル」抽象化では、ファイルを連続したバイト配列として扱います。ユーザーや開発者は、クラスターや断片化の問題について考える必要さえありません。(通常、抽象化はクラスまたはサブルーチンとして表示されます。)

情報の隠蔽とは、抽象化を悪意のある/無能なユーザーから保護することです。一部の状態(ハードドライブの割り当てなど)の制御を元の開発者に制限することにより、大量のエラー処理が冗長になります。ファイルシステムドライバー以外の誰もがハードドライブに書き込むことができない場合、ファイルシステムドライバーはハードドライブに何がどこに書き込まれたかを正確に認識します。(この概念の一般的な症状があるprivateprotectedオブジェクト指向言語のキーワード。)


1

何かを抽象化するには、詳細を非表示にするか、抽象化する必要がある何かの詳細を非表示にする必要があります。ただし、どちらもカプセル化によって実現できます。

したがって、情報の隠蔽が目標であり、抽象化はプロセスであり、カプセル化は技術です。


同じもののJavaの例を提供できますか?
チンメイ

1

抽象化とは、ソフトウェアの本質的な詳細のみがユーザーに表示され、ユーザーがソフトウェアを使用または操作できるようにする手法を意味します。したがって、そのソフトウェアの実装の詳細は表示されません(非表示になります)。 カプセル化は、1つ以上のアイテムを保持するパッケージを使用する技術であり、一部の情報(特にプログラムの詳細)が表示され、一部はユーザーに表示されないため、情報の非表示によってカプセル化が実現されます。要約すれば。抽象化は(外部で)観察可能な動作のためであり、カプセル化は(内部で)非可視性のためですが、これら2つは本当に相補的です。


1

InformationHidingに関する詳細を追加するだけで、このリンクは例のある非常に優れたソースです

InformationHidingは、意図しない結合を防ぐために、システムの他の部分から設計上の決定を隠すべきであるという考えです。InformationHidingは設計原則です。InformationHidingは、あなたが道知らせるべきカプセル化のことを、もちろん、それはする必要はありません

カプセル化はプログラミング言語の機能です。


1

抽象化とカプセル化は、4つの基本的なOOP概念のうちの2つであり、現実世界のものをオブジェクトにモデル化して、プログラムやコードに実装できるようにします。多くの初心者は、どちらも非常によく似ているため、抽象化とカプセル化を混同しています。抽象化とは何かを尋ねると、不必要な詳細を隠すことで関連情報に焦点を当てたOOPの概念であると彼は言うでしょう。抽象化とカプセル化の両方が何かを隠しているので、定義は間違っていませんが、主な違いは意図にあります。

抽象化は、より抽象的な図、10,000フィートのビューのようなものを提供することで複雑さを隠し、カプセル化は内部の動作を隠して後で変更できるようにします。つまり、抽象化は設計レベルで詳細を隠し、カプセル化は実装レベルで詳細を隠します。


0

上記のすべての回答を1つずつ読んだ後、私はそれを投稿するのを止めることはできません

抽象化には、作業を実行し、その状態を報告および変更し、システム内の他のオブジェクトと「通信」することができる抽象的な「俳優」を表すオブジェクトを定義する機能が含まれます。

カプセル化は上からかなり明らかです->

カプセル化という用語は、状態の詳細を隠すことを指しますが、データ型の概念を以前のプログラミング言語から拡張して、動作をデータと最も強く関連付け、さまざまなデータ型が相互作用する方法を標準化することが抽象化の始まりです。

リファレンスウィキ


0

私も抽象化とカプセル化の2つの概念について非常に混乱していました。しかし、myjavatrainer.comで抽象化の記事を見ると、抽象化とカプセル化がAppleとOrangeであることがわかりました。両方が必要なため、実際には比較できません。

カプセル化はオブジェクトを作成する方法であり、抽象化はオブジェクトを外界で見る方法です。


0

カプセル化:バインディングデータとそれに作用するメソッド。これにより、他のクラスの他のすべてのメソッドからデータを隠すことができます。例:MyList、アイテムを追加項目を削除し、すべての項目を削除する方法をできるクラスaddremoveおよびremoveAll外部から直接アクセスすることはできませんリスト(プライベート配列)に作用します。

抽象化:無関係な動作とデータを隠しています。アイテムが実際にどのように保存、追加、または削除されるかは非表示(抽象化)です。私のデータは、単純な配列、ArrayList、LinkedListなどに保持される場合があります。また、メソッドの実装方法は外部から隠されています。


0

カプセル化-制御された方法で内部データへのアクセスを強制するか、メンバーが直接アクセスされるのを防ぎます。

抽象化-特定のメソッドの実装の詳細を非表示にすることは、抽象化と呼ばれます

例を参考に理解しましょう:-

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()メソッドの例を考えることができます。これは、印刷に使用され、データをどのように印刷するかがわからないためです。私はブログを詳細に書いています。抽象化とカプセル化の詳細については、以下のリンクをご覧ください。


0

これらの用語は標準化されたIEEE定義であり、https://pascal.computer.org/で検索できることに注意してください

抽象化

  1. 特定の目的に関連する情報に焦点を当て、残りの情報を無視するオブジェクトのビュー
  2. ビューを作成するプロセス
  3. 単純化されたモデルを確立するために無関係な詳細を抑制するプロセス、またはそのプロセスの結果

情報隠蔽

  1. 各モジュールのインターフェースがモジュールの内部の仕組みについてできる限り明らかにしないソフトウェア開発技術。他のモジュールは、モジュールのインターフェース仕様にないモジュールに関する情報を使用できません。
  2. 決定が他のモジュールから隠されるように、単一のモジュールに設計または実装の決定を含める

カプセル化

  1. モジュール内のシステム機能または一連のデータとそれらのデータに対する操作を分離し、モジュールの正確な仕様を提供することからなるソフトウェア開発手法
  2. クラスの責任の名前、意味、および値へのアクセスは、それらの実現へのアクセスから完全に分離されているという概念
  3. モジュールには内部とは異なる外部があり、外部インターフェースと内部実装があるという考え
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.