「実際のJava同時実行性」を読んでいます。「幸いなことに、カプセル化やデータ隠蔽など、よく組織化された保守可能なクラスを作成するのに役立つオブジェクト指向の手法は、スレッドセーフの作成にも役立ちますクラス。"
問題#1-データの隠蔽について聞いたことがなく、それが何であるかわかりません。
問題#2-カプセル化はプライベート対パブリックを使用しており、実際にはデータが隠れていると常に考えていました。
データ隠蔽とは何か、カプセル化とどのように異なるのか説明していただけますか?
「実際のJava同時実行性」を読んでいます。「幸いなことに、カプセル化やデータ隠蔽など、よく組織化された保守可能なクラスを作成するのに役立つオブジェクト指向の手法は、スレッドセーフの作成にも役立ちますクラス。"
問題#1-データの隠蔽について聞いたことがなく、それが何であるかわかりません。
問題#2-カプセル化はプライベート対パブリックを使用しており、実際にはデータが隠れていると常に考えていました。
データ隠蔽とは何か、カプセル化とどのように異なるのか説明していただけますか?
回答:
データと情報の隠蔽は、コンピューターサイエンスとソフトウェアエンジニアリングで見られるより広い概念です。これは、変更される可能性のあるコンピュータープログラムの部分が、他のモジュールから/クライアントからアクセスできないようにする必要があるという事実を指します。
カプセル化とは、オブジェクト指向のパラダイムに見られる用語であり、データをプライベートフィールドに保持し、メソッドを介してのみデータを変更することを指します。
したがって、カプセル化は、オブジェクト指向システムでデータ隠蔽を実現する方法と見なすことができます。
クラスの作成には、カプセル化の概念が含まれます。クラスを作成するとき、データと動作をクラス内に配置すると、クラスはオブジェクトと呼ばれる1つのユニットになります。したがって、データの非表示はカプセル化の一部です。
ウィキペディアから:
プログラミング言語では、カプセル化は、2つの関連するが別個の概念の1つを参照するために使用されます。
- オブジェクトの一部のコンポーネントへのアクセスを制限するための言語メカニズム。
- データを操作するメソッド(または他の関数)でデータをバンドルすることを容易にする言語構成体。
プログラミング言語の研究者や学者の中には、オブジェクト指向プログラミングの際立った機能として最初の意味を単独で、または2番目と組み合わせて使用しているものもありますが、語彙的クロージャーを提供する他のプログラミング言語では、カプセル化をオブジェクト指向に直交する言語の機能と見なしています。
2番目の定義は、多くのOOP言語ではコンポーネントの非表示が自動ではないか、オーバーライドできるという事実に基づいています。 したがって、情報の隠蔽は、2番目の定義を好む人による別の概念として定義されます。
それらはしばしば議論の中で交換可能に使用され、しばしば同じ目的を達成するために一緒に働くと思う。
カプセル化について話すとき、多くの場合、手続き/機能メカニズムとして実装されます。基礎となる状態には何らかのタイプのガードがあり、ガードを介したアクセスでは、アクセスを許可するために特定のプロトコルに従う必要があります(目的の状態の読み取りまたは変更)。カプセル化はまた、アクセスにより副作用が発生する機会を提供します(カスケード状態の変更、イベントの通知/発生/関心のあるものの読み取りまたは変更時のシグナルの発行など)。したがって、フォローアップアクションを開始できます。繰り返しますが、カプセル化は、プロシージャとして実装される概念であるとよく考えます。
データ隠蔽の概念は、カプセル化と目的が似ていると思います。ただし、メカニズムは構造的であり、異なるレベルで動作します。実際には、プロシージャを通じてガードおよび副作用メカニズムを提供する代わりに、状態は言語およびランタイムの構造メカニズムを通じて保護および影響を受けます。これらのタイプのガードは、可視性句、タイプ定義、継承などになります。構造的に保護されたオブジェクトから活用できる副作用は、やはり言語とランタイムに依存するものです。おそらく、オブジェクトのアクティブ化、参照カウント、またはこれらの行に沿ったものです。
オブジェクト指向では、カプセル化は情報がオブジェクト内に保持される場所です。たとえば、aにPerson
はname
Personのクライアントがあり(つまり、あなた)、Personがパブリックフィールドまたはアクセサメソッドを介して名前を持っていることを知っています。そして、できれば、名前などのグローバル配列に名前を保持する必要がないことを願っています。したがって、これは、管理できないスパゲッティコードを避けるための大きなステップです。しかし、クライアントは、Personが名前を処理する方法について何かを知る必要があります。例えば、スペースまたはコンマ区切り?
データの非表示にはPerson
名前フィールドがありますが、少なくとも理論的には誰も知りません。このフィールドはプライベートであり、パブリックアクセサーメソッドはありません。クライアントはデータベースレコード、XML、HTTP POSTなどから名前を渡すことができますが、Personが名前を処理する方法の内部動作は「ブラックボックス」です。Personの将来の実装は、たとえばa firstName
とa に切り替えるなど、自由に変更できlastName
ます。
理想的な世界では、データの非表示はカプセル化よりも優れていますが、すべての世界が理想的ではありません。:-)