やあ!今日のレッスンは Java でのカプセル化に当て、すぐに例から始めます:) ここには普通のソーダ自動販売機があります。一つ質問があるのですが、どのように機能するのでしょうか?詳細に答えてみましょう: ソーダはどこから来たのですか? 内部の温度はどのように保たれているのでしょうか?氷はどこに保管されていますか? 機械はどのシロップを加えるべきかをどうやって判断するのでしょうか? おそらく、これらの質問に対する答えは見つからないでしょう。まあ、誰もがこれらのマシンを使用しているわけではないかもしれません。現在はそれほど人気がありません。別の例を試してみましょう。毎日必ず何度も使うもの。ああ、アイデアがあるよ! Googleの検索エンジンの仕組みを教えてください動作します。入力した単語に関する情報はどのように検索されるのでしょうか? これらの結果が他の結果ではなくトップにあるのはなぜですか? Google を毎日使っていても、おそらく知らないでしょう。しかし、それは問題ではありません。結局のところ、それはあなたが知る必要があるものではありません。検索エンジンは、それがどのように機能するかを正確に考えなくても使用できます。ソーダがどのように作られているかを知らなくても、機械からソーダを買うことができます。内燃機関の仕組みを詳しく調べなくても、高校物理の知識がなくても、車を運転することはできます。これはすべて、オブジェクト指向プログラミングの主要原則の 1 つであるカプセル化のおかげで可能になります。このトピックに関するさまざまな記事を読んでいると、カプセル化と情報隠蔽という 2 つの広く普及しているプログラミング概念に遭遇したことがあるはずです。偶然にも、「」という言葉を理解する人は異なります。「カプセル化」は別の意味になります。両方の用語を解読して、完全に理解してください。プログラミングにおける本来の意味は、カプセル化とは、データとそのデータを操作するためのメソッドを 1 つのパッケージ (「カプセル」) に結合することでした。Java では、パッケージをカプセル化するのはクラスです。このクラスには、データ(フィールド) とそのデータを操作するための メソッドの両方が含まれています。これは明白に思えるかもしれませんが、他のプログラミング パラダイムではすべてが異なる配置になっています。たとえば、関数型プログラミングでは、データはデータ操作から厳密に分離されます。オブジェクト指向プログラミング (OOP) では、プログラムはデータとデータを操作する関数の両方で構成されるカプセル (クラス) で構成されます。
さて、情報隠蔽について話しましょう
どのように構築され、どのように機能するかを理解せずに、どのようにしてあらゆる種類の複雑なメカニズムを使用できるのでしょうか? それは簡単です。作成者はシンプルで便利なインターフェイスを提供しました。ソーダマシンのインターフェイスはフロントパネルのボタンです。ボタン1つでカップサイズを選択できます。2番目のボタンでシロップを選択します。3 番目は氷を加える役割を果たします。必要なのはそれだけです。機械の内部がどうなっているかは関係ありません。重要なのは、ユーザーが 3 つのボタンを押すとソーダが得られるように設計されていることです。同じことが車にも当てはまります。中で何が起こっているかは関係ありません。重要なのは、右のペダルを踏むと車が前進し、左のペダルを踏むと車が減速するということです。これが情報隠蔽の本質だ。プログラムのすべて」s の「内部」はユーザーから隠されています。このような情報は、ユーザーにとって余分または不要です。ユーザーが必要とするのは内部プロセスではなく、最終結果です。例として、次を見てみましょう。車両クラス:
public class Vehicle {
public void gas() {
/* Some complicated things happen inside a car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside a car.
As a result, it slows down */
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
// How everything looks to the user
// Press one pedal, the car moves
vehicle.gas();
// Press the other pedal, the car brakes
vehicle.brake();
}
}
このようにして、Java プログラム内に実装が隠蔽されます。現実世界と同じように、ユーザーにはインターフェイス (メソッド) が提供されます。プログラム内で、アクションを実行するために車が必要な場合は、目的のメソッドを呼び出すだけです。これらのメソッド内で何が起こるかは余分です。重要なのは、すべてが正常に機能することです。ここでは実装の隠蔽について説明してきました。Java にもデータ隠蔽機能があります。これについてはゲッターとセッターに関するレッスンで書きましたが、思い出していただいても問題ありません。たとえば、Catクラスがあります。
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Meow!");
}
}
おそらく、過去のレッスンでこのクラスの問題点を覚えていますか? そうでない場合は、思い出してみましょう。問題は、そのデータ (フィールド) が誰にでも公開されていることです。別のプログラマーは、体重 0、年齢 -1000 歳の名前のない猫を簡単に作成できます。
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
この状況では、同僚の 1 人が無効な状態のオブジェクトを作成しているかどうかを注意深く追跡することもできますが、これらの無効なオブジェクトが作成される可能性さえ排除する方がはるかに適切です。 以下の助けを借りてデータ隠蔽を実現します。
- アクセス修飾子 (プライベート、保護、パッケージのデフォルト);
- ゲッターとセッター。
カプセル化には、いくつかの重要な利点があります。
- オブジェクトの正しい状態を監視します。上でこの例を示しました。setter とprivate修飾子のおかげで、重み 0 の猫に対してプログラムを保護することができました。
- ユーザーフレンドリーなインターフェース。メソッドのみをユーザーに公開します。ユーザーは単にそれらを呼び出すだけで結果が得られます。そして、それらがどのように機能するかについて詳しく調べる必要はまったくありません。
- コードの変更はユーザーには影響しません。すべての変更はメソッド内で行います。これはユーザーには影響しません。ユーザーはガスを適用するためにvehicle.gas()を書き、それを今後も実行し続けることになります。Gas()メソッド内で何かを変更したという事実は目に見えないままです。以前と同様に、必要な結果が得られるだけです。
GO TO FULL VERSION