インタビュアー:カプセル化とは何ですか?Javaでどのように実現しますか?
Me:カプセル化は、クライアントから情報を隠すメカニズムです。情報は、データ、実装、またはアルゴリズムの場合があります。アクセス修飾子を使用してこれを実現します。
インタビュアー:これはデータ隠蔽です。 Javaでカプセル化を実現するにはどうすればよいですか?
Me:uummmm
具体的な質問:「アクセス修飾子」以外に、Javaでカプセル化を実装する方法は何ですか?
より一般的には、カプセル化は、データ(オブジェクトなど)をそのデータに対する操作と単純にバンドルすることを指します。したがって、データをカプセル化するクラスがあります-フィールド-そのデータを操作するためのメソッド.
しかし、カプセル化は答えと同じように使用されることもあります。実際、データとメソッドをバンドルするポイントの1つはhide実装です。
メソッドを使用し、すべてのフィールドをプライベートにするよりも良い答えだと思う:インターフェイスを使用する。このように、オブジェクトの操作はインターフェイスコントラクトにのみ基づいており、そのコントラクトを内部で実装するために使用されるフィールドまたはヘルパーメソッドに決して結び付けられていません。
一般的にカプセル化は、同様のアイテムをバンドルすることを意味します。
たとえば、Student
クラスを使用して、学生のインスタンス変数と、それらのインスタンス変数に作用する動作/メソッドを1か所で取得します。
なぜ重要なのですか?コードベースにコードを散らばらせたくありません。
変更を加える必要があると言えば、すべての場所で(その変更の)バリアントを見つける必要があります。同様のアイテムをバンドルすることで、このようなシナリオを回避しているだけでなく、バンドルされたコードをより集中させるのにも役立ちます。
データを外部から保護する方法を提供するだけです。つまり、インスタンス変数をパブリックにした場合、誰でもその状態を変更できます。しかし、インスタンス変数をprivate/protectedにすると、実際には、外部エンティティがそれを変更することを制限しています。
ここで疑問が生じます。どの点で変数を保護していますか?
繰り返しますが、Encapsulationは類似のアイテムを配置するために必要なコンテナにすぎないことを理解する必要があります。
外の世界へのブラックボックスのように振る舞います。外の世界(つまり、クライアント/消費者:Student
クラスの使用)は、Student
クラスの内部の詳細/実装の詳細を知らないため、実際には内部の詳細を気にする必要はありません。 /クラスの実装の詳細。クライアントアプリケーションで使用できるように、いくつかのメソッド/ APIが必要なだけです。
だから私のポイントは、すべての学生に関連する行動/変数がクラスとしてそれを呼んでいるブラックボックスに置かれていることです。クラスの設計者次第で、クラスの要素は何を隠すべきで、何を外の世界から隠すべきではないのか。
Javaの質問に戻ると、変数をプライベートにしています。これは、変数がクラス保護されていることを意味します。パッケージ全体でインスタンス変数にアクセスできるようにしたい場合は、パッケージ保護されます。プロジェクトを通して彼らは公開されています。つまり、私が言いたいのは、データを非表示にするということです。データを入れてコンテナに関して非表示にするコンテナが必要です。
だからData HidingはEncapsulationなしでは不可能だと思う。何らかの形のコンテナに入れずにデータを隠すことはできません。繰り返しますが、これをオブジェクト指向言語のコンテキストに置いていることを思い出させてください。
しかし、はいカプセル化はデータを隠すことなく可能です。すべてのものを公開すると、影響を確認できます。
Encapsulation:カプセルの例を取り上げます。開けると、たくさんの材料が入っています。オブジェクト指向プログラミングのカプセル化も同様です。名前が示すように、「Encapsulationは、すべてのデータメンバー、属性、および対応するメソッドを1つのカプセル内にカプセル化(カプセル化)することを意味します。
どうやってやる:「車」という名前のクラスを作ったとしましょう。今、車には色の価格とモデルがあります。これらは属性であり、runメソッドがあります。したがって、ここでは、「Car」という名前の車両のこれらすべての属性とメソッドをカプセル化しました。そのように車のインスタンスを作成すると
Car myCar = new Car();
MyCar変数を使用して、Carのすべての属性にアクセスできます。
"データの非表示":データの非表示は、Javaアクセス修飾子を使用して制御されます。使用するデータメンバーにアクセスするには、[〜# 〜] accessors [〜#〜]使用するデータを変更するときに "Mutators"。Javaはアクセサを提供しませんそしてミューテーターはそれ自体で、自分で作成します(ゲッターとセッター)。C#はそのためのプロパティを提供します。
私はこれをすることを嫌いますが、 Wikipedia から:
プログラミング言語では、カプセル化は、2つの関連するが別個の概念の1つを参照するために使用され、時にはそれらの組み合わせを参照する場合もあります。
- オブジェクトの一部のコンポーネントへのアクセスを制限するための言語メカニズム。
- そのデータを操作するメソッド(または他の機能)でデータをまとめることを容易にする言語構成体
あなたの説明は最初の概念に沿ったもので、インタビュアーは2番目の概念を探していました。
データのカプセル化は、関連するすべてのプロパティとメソッドを単一のエンティティに保持するのメカニズムを指します。
例:車。ステアリングホイール、タイヤ、エンジン、および関連するすべてのものをCar
として知られる1つの集合体に保持します。
プログラミング言語ではencapsulationはclassesで実現されます。クラスには、特定のタスクを実行するように設計されたone single entity
のすべてのプロパティと関連メソッドが含まれています。
データ非表示はユーザーから重要でない詳細を非表示にするを参照し、関連データのみを表示します。
例:車のブレーキやアクセルを押すと、舞台裏で何が起こっているのかわかりません(how速度が上がる、またはhow =ブレーキをタイヤに適用する)。私たちが知っているのは、望ましい結果を出すためのブレーキとアクセルがあるということです。
プログラミングでは、これはaccess modifiersを使用して行われます。 プライベートメンバーはアクセス不可クラスの外部からであり、public
メンバーのみがユーザーからアクセス可能です。プライベートメンバーにはクラスのメンバーからのみアクセスできるため、クラスの外部から直接評価されるプライベートメンバーにsecurityを提供します。
質問は誤解を招くように見えますが、インタビュアー以外の誰もがそれに答えることができるとは思わず、おそらく彼/彼女の答えが間違っている可能性があります。最も重要なことは、質問が何を評価または発見するのかが明確ではないことです。
それでも、私はそれをいくらか考えました、そして、以下は質問に答える私の試みであることができると思うものです。
Javaでは、アクセシビリティ修飾子(つまり、パブリック、保護、プライベートなど)を使用して詳細を非表示にすることで、カプセル化が実装されます。これらのレベルのアクセシビリティにより、情報隠蔽のレベルを制御できます。レベルの制限が少ないほど、変更が発生するときのコストが高くなり、クラスが他の依存クラス(つまり、ユーザークラス、サブクラス)とより密接に結びつきます。
明らかに、カプセル化は単なる隠蔽状態ではありません。 Javaでは、クラスとインターフェース全体とそれらの状態と動作を非表示にできます。これにより、API全体の実装の詳細を非表示にできます。
たとえば、メソッドArrays.asList()
はList
実装を返しますが、List
パブリックインターフェイスを満たしている限り、どの実装を使用してもかまいません。実装は、メソッドのユーザーである私たちに影響を与えることなく、将来変更できますが、実際の実装は私たちから隠されています。
ここまでは、カプセル化は詳細を隠すプログラミング言語の能力に完全に依存していたように見えるため、アクセス修飾子なしでは実現できませんでした?
しかし、Pythonのような言語は、アクセス修飾子がない場合にカプセル化をどのように実現しますか?Pythonですべてが公開されていますか?それはカプセル化が不可能であることを意味しますか?
慣例により、コンポーネントのパブリックインターフェースを定義し、パブリックインターフェースのみを介してオブジェクトの状態と動作にアクセスするとどうなりますか?明らかに、このためには、問題領域の抽象化と、ユーザーによるこれらの抽象化の使用方法を明確に理解する必要があります。
私にとっては、インタビューの質問はカプセル化をより広い概念として評価することを意図していたように見えます。
だから、私の意見では、カプセル化を本当に理解するには、まず抽象化を理解しなければなりません。
たとえば、車の概念の抽象化レベルで考えてください。車は内部実装が複雑です。トランスミッションシステム、ブレーキシステム、燃料システムなど、いくつかのサブシステムがあります。
ただし、その抽象化を簡素化し、抽象化のパブリックインターフェイスを介して世界中のすべての車と対話します。すべての車には方向を制御するハンドルがあり、ペダルを押すと車を加速して速度を制御し、別のボタンを押すと停止してギアスティックを持っていることがわかっています前後に進むかどうかを制御できます。これらの機能は、車の抽象化のパブリックインターフェイスを構成します。午前中は、セダンを運転してから降りて、午後に同じようにSUVを運転できます。
フードを開けて、それがすべてどのように機能するかを見ることができないということではありません。ただし、これらの基本的な機能がボンネットの下にどのように実装されているかの詳細を知っている人はほとんどいません。実際、車を運転するために詳細を知る必要はありません。これらはすべて、車の抽象化の下にカプセル化されています。抽象化のパブリックインターフェイスのみを知る必要があります。
自動車に油圧方向システムがなかった時代を考えてください。ある日、自動車メーカーがそれを発明し、彼らはそれをその後の車に入れることを決めました。それでも、これはユーザーがユーザーとやり取りする方法を変えませんでした。せいぜい、ユーザーは指向性システムの使用の改善を経験しました。車の内部実装がカプセル化されているため、このような変更が可能でした。
これは、詳細を隠す指向性システムの実装方法の安全に変更するによって、車のパブリックインターフェイスに影響を与えることなく、それに応じて、ユーザーの操作方法。
さて、自動車メーカーは、燃料キャップを車の側面ではなく、車の下に置くことにしたと考えてください。あなたはこれらの新しい車の1つを買いに行きます、そして、あなたがガソリンを使い果たすとき、あなたはガソリンスタンドに行きます、そして、あなたは燃料キャップを見つけません。突然、車の下にあることに気づきますが、ガスポンプホースでは届きません。さて、私たちは公開インターフェース契約を破りました。したがって、全世界が破れます。物事が期待どおりに機能していないため、崩壊します。このような変更には数百万の費用がかかります。世界のすべてのガスポンプを変更する必要があります。カプセル化を解除するときは、価格を支払う必要があります。
ご覧のとおり、カプセル化の目標は相互依存を最小限に抑え、変更を容易にするです。実装の詳細の公開を最小限に抑えることで、カプセル化を最大化します。クラスの状態は、そのパブリックインターフェイスを介してのみアクセスする必要があります。
カプセル化の美しさは、ユーザーに影響を与えずに物事を変える力です。
この究極の目標は、慎重な計画と設計にかかっていると言えます。 Javaでは、アクセス修飾子はこれらのアイデアを実現する方法ですが、この機能が存在しない言語では、カプセル化を実現することも同様に可能です。
基本的にデータのカプセル化はプロセスであり、データの非表示は技術です。カプセル化では、データはパブリックでもプライベートでもかまいませんが、データの非表示データはプライベートのみです。そのため、データの隠蔽ではカプセル化が使用されますが、さまざまな手法を使用して、許可されたアクセスのみにデータを許可します。それが役に立てば幸い!
クラスでは、属性と動作が一緒に配置されます。カプセル化とは、クラスを作成するときに、カプセル化の原則を実現することを意味します。データと動作はクラスにカプセル化されるためです。そのため、データ隠蔽は用語の主要な部分であるカプセル化です。そして、これはオブジェクトのアクセスポイントを意味します。
カプセル化の最も簡単な定義は、「データと単一のユニットにデータを操作するコードをバインドする」ことです。これにより、外部から直接データにアクセスできなくなります。
Cのような構造言語では、データはブロックの先頭で宣言され、直接使用され、オープンにアクセスされます(すべてのtom、dick、harryはデータにアクセスできます)。データの非表示は、トムディックとハリーにデータアクセスを直接かつオープンに制限する概念です。
カプセル化は、データ隠蔽を実現する方法の1つです。データと機能を組み合わせることで、データの非表示を実現します(カプセル化)。
Javaでの達成方法については、Javaのgetter()、setter()関数の例を参照してください。これをチェックして
カプセル化は、データメンバとメソッド(動作)を1つのユニットにバインドし、[encapsulation = data hiding + abstraction]と言うことができる多くのユーザーが簡単に必要な情報を提供することを意味します。
クラスはJavaで完全にカプセル化された要素です
データの非表示は、データ変数をプライベートとして宣言して、不正アクセスから保護することを意味しますが、検証用のパブリックセッターおよびゲッターメソッドを提供している場合。
私がそれを見る方法、カプセル化バインディングデータとメソッドのアイデアを参照シングルと呼ばれるユニットに- class。ただし、2つの主要な基準があり、データとメソッドをバインドします。それらの1つは情報の隠蔽であり、唯一のものではありません。完全に簡潔になるには、2つの主要な基準があります
カプセル化:カプセル化はOOPSの柱の1つであり、データ隠蔽と抽象化という他の2つの用語の上位セットでもあります。 (用語が示すように、データの隠蔽。データは変数にのみ保存できます。データを外界から隠すために、データ隠蔽の概念を使用します。パブリック、プライベート、保護)パッケージに制限されます。継承クラスに制限されます。静的変数を呼び出すことができるのは、静的内部クラスのみです。
今、抽象化(無形を意味する)に来ています。抽象化は、ユーザーから実装を隠し、最終結果のみを提供するプロセスとも見なされます。例:「Weight」プロパティを持つpersonクラスがあります。 1人の体重を0未満にすることはできないため、このプロパティは非常に注意が必要です。また、500 kgを超えるものは受け入れられません。したがって、これらの実装を非表示にするには、setterメソッドを使用します。実装の詳細を隠すこのことが抽象化です。
**そして、完全なパッケージ、つまりオブジェクトをプライベートにし、セッターとゲッターでロジックを実装することはENCAPSULATIONと呼ばれます。
私の理解を簡単にするために、すでに多くの議論が行われているのを見ました。
カプセル化オブジェクトの動作がAPIを介してのみ影響を受けるようにします。無関係なコンポーネント間に予期しない依存関係がないことを保証することにより、1つのオブジェクトへの変更がシステムの他の部分に与える影響を制御できます。カプセル化を実現するためにアクセス修飾子を使用できます。
情報の隠蔽 APIの抽象化の背後にあるオブジェクトの機能の実装方法を隠します。目の前のタスクに関係のない下位レベルの詳細を無視することで、より高い抽象化で作業できます。設計レベルでの抽象化を使用して、データの非表示を実現できます。
外部クラスメンバーからの直接アクセスからデータを隠し、適切な検証を通じてパブリックにアクセス可能なセッターおよびゲッターメソッドを通じてのみアクセスを提供することによってクラスを定義するプロセスは、カプセル化と呼ばれます。
カプセル化カプセル化は、オブジェクト指向プログラミングの概念であり、データとデータを操作する機能を結び付け、外部の干渉や誤用から安全に保ちます。データのカプセル化は、重要なOOPデータ隠蔽の概念につながりました。
クラスが呼び出しコードによる内部オブジェクトデータへのアクセスを許可せず、メソッドのみを介したアクセスを許可する場合、これはカプセル化として知られる強力な形式の抽象化または情報隠蔽です。一部の言語(Javaなど)では、クラスにアクセス制限を明示的に適用できます。たとえば、privateキーワードで内部データを指定し、publicキーワードでクラス外のコードで使用するメソッドを指定します。メソッドは、public、private、またはprotectedなどの中間レベル(同じクラスとそのサブクラスからのアクセスを許可しますが、異なるクラスのオブジェクトからは許可しない)に設計することもできます。他の言語(Pythonなど)では、これは慣例によってのみ強制されます(たとえば、プライベートメソッドの名前はアンダースコアで始まる場合があります)。カプセル化により、外部コードがオブジェクトの内部動作に関係するのを防ぎます。これにより、コードのリファクタリングが容易になります。たとえば、クラスの作成者は、外部コードを変更せずに、そのクラスのオブジェクトがデータを内部的に表す方法を変更できます(「public」メソッド呼び出しが同じように機能する限り)。また、プログラマは、特定のデータセットに関係するすべてのコードを同じクラスに配置することを推奨します。これにより、他のプログラマが簡単に理解できるように編成されます。カプセル化は、分離を促進する手法です。
データメンバーと対応するメソッドを単一のユニットにバインドするプロセスは、カプセル化に他なりません。
カプセル化=データの非表示+抽象化
抽象化は、オブジェクトと対話するために必要なものを言います。
カプセル化とは、オブジェクトのプロパティ、状態、および動作をクラスと呼ばれる単一の論理ユニットにカプセル化することを意味します。
データの非表示とは、オブジェクトの内部実装を非表示にすることは、プライベートメソッドとプロパティ、つまり状態を維持するために使用するオブジェクトを意味すると言います。
データの非表示とは、クラス内のデータにセキュリティを提供することを意味します。
抽象化とは、メンバー関数を定義してコードを隠すことです。
カプセル化は、抽象化とデータ隠蔽の組み合わせであり、データとそのデータに関連付けられたコードをラップしていることを意味します。 ex beanクラスの場合
class student {
private int age; // Data Hiding
public setAge(){} // Abstraction
public getAge(){} // Abstraction
}
学生クラスはカプセル化されています。
カプセル化=データ隠蔽+抽象化