「データ隠蔽」と「カプセル化」の違いは何ですか?


29

「実際のJava同時実行性」を読んでいます。「幸いなことに、カプセル化やデータ隠蔽など、よく組織化された保守可能なクラスを作成するのに役立つオブジェクト指向の手法は、スレッドセーフの作成にも役立ちますクラス。"

問題#1-データの隠蔽について聞いたことがなく、それが何であるかわかりません。

問題#2-カプセル化はプライベート対パブリックを使用しており、実際にはデータが隠れていると常に考えていました。

データ隠蔽とは何か、カプセル化とどのように異なるのか説明していただけますか?


2
Code Complete 2nd editionをお読みください。あなたの質問の多くに答えます。
シプルモカディム12年

情報の隠蔽については、次を参照してください:javaworld.com/jw-05-2001/jw-0518-encapsulation.html
デイブジャービス

このリンクには、この 情報に関する有用な洞察があり、設計原則を隠し、意図しない結合を防ぐために設計決定をシステムの残りの部分から隠すことを指定します。カプセル化する方法を通知する必要がありますが、もちろんそうする必要はありません。 カプセル化はプログラミング言語の機能です。
-Abhijeet

回答:


19

データと情報の隠蔽は、コンピューターサイエンスとソフトウェアエンジニアリングで見られるより広い概念です。これは、変更される可能性のあるコンピュータープログラムの部分が、他のモジュールから/クライアントからアクセスできないようにする必要があるという事実を指します。

カプセル化とは、オブジェクト指向のパラダイムに見られる用語であり、データをプライベートフィールドに保持し、メソッドを介してのみデータを変更することを指します。

したがって、カプセル化は、オブジェクト指向システムでデータ隠蔽を実現する方法と見なすことができます


1
返信ありがとうございます。データの隠蔽が同じであるがカプセル化よりも少し広い場合、なぜそれが同様の広さのものであり、別のものを含むものではないかのように言及されている理由はまだわかりません。
-dhblah

著者はおそらく、データ隠蔽はデータ構造-プライベートフィールド-のみを隠しているという意味で、データ隠蔽と情報隠蔽との違いをもたらしますが、情報隠蔽とは、インターフェースを介してのみ行われる実装の詳細(たとえば、使用されるアルゴリズム)のカプセル化を指す場合があります
m3th0dman

2
どちらか一方を持たなくても構いません-データを隠していないPythonを見てください(プライベート属性や保護属性などはありません)。
レイティー

@Lattywareのポイントは非常に真実で重要です。また、何も隠さずに、つまり、すべてのメンバーの些細なゲッターとセッターを盲目的に公開することで、カプセル化を行うことができます(私はここで説明しているため、これに反対します)。それは何も隠さず、何も妨げませんが、レターへのカプセル化の一般的な定義を満たします。

1
カプセル化は、データをプライベートフィールドに保持しないため、より多くの情報が隠されます。カプセル化は、一般的な方法で、情報/データとメソッドをクラスにまとめる(カプセル化する)概念です。
-nbro

6

カプセル化とデータ隠蔽は関連する用語です。それらが抽象化に関連して生じることを理解することが重要です。ブーチ他 al。オブジェクト指向分析設計アプリケーションと説明し、

抽象化とカプセル化は補完的な概念です。抽象化はオブジェクトの観察可能な動作に焦点を合わせ、カプセル化はこの動作を引き起こす実装に焦点を合わせます。カプセル化は、多くの場合、情報の非表示(データの非表示だけでなく)によって実現されます。これは、本質的な特性に寄与しないオブジェクトのすべての秘密を非表示にするプロセスです。通常、オブジェクトの構造とそのメソッドの実装は隠されています。


5

クラスの作成には、カプセル化の概念が含まれます。クラスを作成するとき、データと動作をクラス内に配置すると、クラスはオブジェクトと呼ばれる1つのユニットになります。したがって、データの非表示はカプセル化の一部です。


4

ウィキペディアから:

プログラミング言語では、カプセル化は、2つの関連するが別個の概念の1つを参照するために使用されます。

  • オブジェクトの一部のコンポーネントへのアクセスを制限するための言語メカニズム
  • データを操作するメソッド(または他の関数)でデータをバンドルすることを容易にする言語構成体

プログラミング言語の研究者や学者の中には、オブジェクト指向プログラミングの際立った機能として最初の意味を単独で、または2番目と組み合わせて使用​​しているものもありますが、語彙的クロージャーを提供する他のプログラミング言語では、カプセル化をオブジェクト指向に直交する言語の機能と見なしています。

2番目の定義は、多くのOOP言語ではコンポーネントの非表示が自動ではないか、オーバーライドできるという事実に基づいています。 したがって、情報の隠蔽は、2番目の定義を好む人による別の概念として定義されます。


お返事をありがとうございます。フォローアップの質問:1)Javaプログラミング言語には、カプセル化に関連する2番目の概念が参照する機能がありますか?2)データ隠蔽のオーバーライドが重要な理由がわかりません。たとえば、javaでは、リフレクションを介して任意のフィールド(パブリックまたはプライベート)にアクセスできます。
-dhblah

@Software Engeneering Learner:ソースコードの構成要素としてのクラスは、2番目の概念を表します。情報の隠蔽に関しては、データの範囲を制限することが多くの場合、特定の別個の言語メカニズムに基づいているという点です。
マイケルボルグワード

2

それらはしばしば議論の中で交換可能に使用され、しばしば同じ目的を達成するために一緒に働くと思う。

カプセル化について話すとき、多くの場合、手続き/機能メカニズムとして実装されます。基礎となる状態には何らかのタイプのガードがあり、ガードを介したアクセスでは、アクセスを許可するために特定のプロトコルに従う必要があります(目的の状態の読み取りまたは変更)。カプセル化はまた、アクセスにより副作用が発生する機会を提供します(カスケード状態の変更、イベントの通知/発生/関心のあるものの読み取りまたは変更時のシグナルの発行など)。したがって、フォローアップアクションを開始できます。繰り返しますが、カプセル化は、プロシージャとして実装される概念であるとよく考えます。

データ隠蔽の概念は、カプセル化と目的が似ていると思います。ただし、メカニズムは構造的であり、異なるレベルで動作します。実際には、プロシージャを通じてガードおよび副作用メカニズムを提供する代わりに、状態は言語およびランタイムの構造メカニズムを通じて保護および影響を受けます。これらのタイプのガードは、可視性句、タイプ定義、継承などになります。構造的に保護されたオブジェクトから活用できる副作用は、やはり言語とランタイムに依存するものです。おそらく、オブジェクトのアクティブ化、参照カウント、またはこれらの行に沿ったものです。


0

多くの場合、通常は交換可能に使用されます。しかし、上記のBoochの引用では、「カプセル化はほとんどの場合、情報の隠蔽によって達成されます...」、つまり最も頻繁に行われますが、常にそうとは限りません。

Pythonでは、クラスでデータをロールアップできますが、プライベート変数は許可されません。したがって、Pythonはデータを隠すことなくカプセル化を提供していると言えます。

すべてのメンバー変数を作成することでJavaで同じことを行うことができますが、すべてのpublic人に心臓発作を与えることは別として、データの非表示の利点を失うことになります。


0

オブジェクト指向では、カプセル化は情報がオブジェクト内に保持される場所です。たとえば、aにPersonnamePersonのクライアントがあり(つまり、あなた)、Personがパブリックフィールドまたはアクセサメソッドを介して名前を持っていること知っています。そして、できれば、名前などのグローバル配列に名前を保持する必要がないことを願っています。したがって、これは、管理できないスパゲッティコードを避けるための大きなステップです。しかし、クライアントは、Personが名前を処理する方法について何かを知る必要があります。例えば、スペースまたはコンマ区切り?

データの非表示にPerson名前フィールドがありますが、少なくとも理論的には誰も知りません。このフィールドはプライベートであり、パブリックアクセサーメソッドはありません。クライアントはデータベースレコード、XML、HTTP POSTなどから名前を渡すことができますが、Personが名前を処理する方法の内部動作は「ブラックボックス」です。Personの将来の実装は、たとえばa firstNameとa に切り替えるなど、自由に変更できlastNameます。

理想的な世界では、データの非表示はカプセル化よりも優れていますが、すべての世界が理想的ではありません。:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.