質問

何が違うのか教えていただけますか 抽象化 そして 情報隠蔽 ソフトウェア開発では?

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

アップデート: これら 3 つの概念に対する適切な答えを見つけました。 以下の別の回答を参照してください から引用したいくつかの点について そこには.

役に立ちましたか?

解決

源流へ行こう!Grady Booch 氏は次のように述べています (『オブジェクト指向分析と設計』第 2 版、49 ページ)。

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

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

例:.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 ネットワーキングで。

クラスを使用することで、3 つの概念すべてを実装します。 Abstraction, Information Hiding そして Encapsulation

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

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

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

例と詳細については、後藤 :

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

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

承認された定義 ここ

追記:11 時間目の授業で読んだスミタ・アローラ著の C++ という本の定義も覚えています ;)

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

情報隠蔽とは、ソフトウェア コンポーネント (クラスなど) のユーザーがコンポーネントの初期化方法とアクセス方法の重要な詳細だけを知っていればよく、実装の詳細を知る必要がないという原則です。

編集:私には抽象化こそが プロセス 実装のどの部分を実装すべきかを決定する 隠れた.

したがって、それは抽象化ではなく、情報の隠蔽でもありません。VIA の抽象化を隠す情報です。

抽象化

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

カプセル化

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

抽象化とは、文字通り実装の詳細を隠すことです。

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

情報の隠蔽とは、実装の詳細を隠蔽することです。プログラミングは難しいです。対処しなければならないことがたくさんあります。非常に厳密に追跡したい、または追跡する必要がある変数が存在する場合があります。情報を非表示にすると、公開した変数やメソッドを使用して誰かが誤って何かを壊すことがなくなります。

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

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

カプセル化 - データとそのデータを操作する関数を 1 つのユニットにまとめるプロセスです。

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

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

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

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

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

抽象化 : 抽象化とは、オブジェクトの外観がどうあるべきかを特定するために使用される概念/技術です。必要なインターフェイスのみを利用できるようにします。

情報の非表示: 情報を隠すことによって抽象化が達成されるため、これは抽象化を補完します。外観以外のすべてを非表示にします。

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

漏れやすい抽象化の法則に関する Joel の投稿を参照してください。

ジョエルオンソフトウェア

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

情報隠蔽に関しては、ジャミングには賛成です。

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

情報の隠蔽とは、悪意のあるユーザーや無能なユーザーから抽象化を保護することです。一部の状態 (ハード ドライブの割り当てなど) の制御を元の開発者に制限すると、大量のエラー処理が不要になります。ファイル システム ドライバー以外にハード ドライブに書き込むことができる人がいない場合、ファイル システム ドライバーはハード ドライブに何がどこに書き込まれたかを正確に認識します。(この概念の通常の表現は次のとおりです。 private そして protected OO 言語のキーワード。)

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

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

抽象化 単に、ユーザーがソフトウェアを使用または操作できるようにするために、ソフトウェアの重要な詳細のみをユーザーに表示して、そのソフトウェアの実装の詳細を表示しない (非表示にする) 技術を意味します。カプセル化 これは、1 つ以上の項目を保持するパッケージを備えているため、情報の一部 (特にプログラムの詳細) がユーザーに表示され、一部がユーザーに表示されないため、情報の隠蔽によってカプセル化が実現される技術です。要約すれば。 抽象化 は観察可能な動作 (外部) を対象とし、カプセル化は非表示 (内部) を対象としていますが、これら 2 つは実際には補完的です。

詳細を追加するだけです 情報非表示, 、 見つかった このリンクは例を含む非常に優れたソースです

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

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

私も、抽象化とカプセル化という 2 つの概念について非常に混乱していました。しかし、私が見たとき、 抽象化記事 myjavatrainer.com で、抽象化とカプセル化はリンゴとオレンジのようなものであることが明らかになりました。両方が必要であるため、実際に比較することはできません。

カプセル化はオブジェクトの作成方法であり、抽象化はオブジェクトが外の世界でどのように表示されるかです。

上記の回答をすべて 1 つずつ読んだ後、投稿せずにはいられません

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

ただし、カプセル化は上記から非常に明らかです ->

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

参照 ウィキ

カプセル化: バインディング データとそれに作用するメソッド。これにより、他のクラスの他のすべてのメソッドからデータを隠すことができます。例: 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/.

抽象化

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

情報隠蔽

  1. 各モジュールのインターフェースがモジュールの内部動作について可能な限り明らかにせず、他のモジュールがモジュールのインターフェース仕様にないモジュールに関する情報を使用しないようにするソフトウェア開発手法
  2. 設計または実装の決定を単一のモジュールに含めて、その決定が他のモジュールから隠されるようにすること

カプセル化

  1. システム機能または一連のデータとモジュール内のそれらのデータに対する操作を分離し、モジュールに正確な仕様を提供することで構成されるソフトウェア開発手法
  2. クラスの責任の名前、意味、および値へのアクセスが、その実現へのアクセスから完全に分離されているという概念
  3. モジュールには内部とは異なる外部があり、外部インターフェイスと内部実装があるという考え
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top