web-dev-qa-db-ja.com

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

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

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

問題#2-カプセル化はプライベートとパブリックを使用していると常に思っていました。

データの非表示とは何か、およびカプセル化との違いを説明していただけますか?

29
dhblah

データと情報の非表示は、コンピュータサイエンスとソフトウェアエンジニアリングに見られるより広い概念です。これは、変更される可能性のあるコンピュータプログラムの部分が、他のモジュールやクライアントからアクセス可能であってはならないことを意味します。

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

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

19
m3th0dman

カプセル化とデータ非表示は関連用語です。 抽象化に関連して発生することを理解することが重要です。 Booch et。 al。inObject-Oriented Analysis and Design with Applicationsは、

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

6
theD

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

Wikipedia から:

プログラミング言語では、encapsulationを使用して、関連する2つの異なる概念の1つを参照し、場合によってはそれらの組み合わせを参照します。

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

一部のプログラミング言語の研究者や研究者は、最初の意味を単独で、または2番目の意味と組み合わせて、オブジェクト指向プログラミングの際立った機能として使用しますが、字句閉包を提供する他のプログラミング言語は、カプセル化をオブジェクト指向に直交する言語の機能と見なします。

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

4

それらはしばしば議論において交換可能に使用され、しばしば私はそれらが同じ目的を達成するために一緒に働くと思います、そして以下は完全に正確ではないかもしれませんが、区別が必要な場合、それはいくつかの意味のある区別を提供するかもしれません:

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

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

2
JustinC

多くの場合、おそらく通常は、同じ意味で使用されます。ただし、上記のBoochの引用によると、「カプセル化はほとんどの場合情報の非表示によって実現される...」、つまりほとんどの場合ですが、常にそうであるとは限りません。

Pythonはクラスでのデータのロールアップを許可しますが、プライベート変数は許可しないことに注意してください。したがって、Pythonはデータを隠すことなくカプセル化を提供します。

Javaですべてのメンバー変数をpublicにすることで同じことを行うことができますが、すべての人に心臓発作を起こすことは別として、データを隠すことの利点を失うことになります。 。つまり、オブジェクトの状態へのアクセスを制限することにより、オブジェクトのセマンティクスを保持します。

0
Rob

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

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

理想的な世界では、データ隠蔽はカプセル化より優れていますが、すべての世界が理想的であるとは限りません。 :-)

0
user949300