やあ!今日のレッスンをカプセル化に捧げ、すぐに例から始めましょう :)ここには普通のソーダマシンがカプセル化の原則 - 1あります。一つ質問があるのですが、どのように機能するのでしょうか?詳細な回答を提供するようにしてください。カップはどこから来たのか、内部の温度はどのように維持されているのか、氷はどこに保管されているのか、機械はどのシロップを加えるべきかをどのように判断しているのか、などです。おそらく、これらの質問に対する答えは見つからないでしょう。誰もがそのようなマシンを使用しているわけではないので、十分にそうです。今ではあまり人気がありません。別の例を挙げてみましょう。毎日必ず何度も使うもの。ああ、ここにアイデアがあります! Google 検索エンジンの仕組みを教えてくださいカプセル化の原則 - 2動作します。入力した単語に関連する情報はどのように正確に検索されるのでしょうか? 特定の結果が上位にランクされ、他の結果は上位にランクされないのはなぜですか? Google を毎日使用しているとしても、知らない可能性があります。しかし、それは問題ではありません。これを知る必要はありません。検索エンジンがどのように機能するかを考えずに、検索エンジンにクエリを入力できます。仕組みを知らなくても、機械からソーダを買うことができます。内燃機関の仕組みがわからなくても、物理の知識がまったくなくても、小学生レベルでも車を運転することはできます。これらすべては、オブジェクト指向プログラミングの主要原則の 1 つであるカプセル化のおかげで可能になります。オブジェクト指向プログラミング (OOP) に関するさまざまな記事を読むと、プログラミングにはカプセル化隠蔽という2 つの共通の概念が含まれるという事実に遭遇したはずです。そして著者は「カプセル化」という言葉を、あることを意味したり、別のことを意味したりするために使用します。完全に理解できるよう、両方の用語について説明します。プログラミングにおけるカプセル化の本来の意味は、データとそのデータを操作するメソッドを 1 つのユニット(つまり「カプセル」)にバンドルすることです。Java では、クラスはカプセル化の単位です。クラスには、データ(フィールド) と、このデータを操作するためのメソッドの両方が含まれています。カプセル化の原則 - 3これは明らかに正しいアプローチのように思えるかもしれませんが、他のプログラミング パラダイムでは、すべてが異なる配置になっています。たとえば、関数型プログラミングでは、データはデータに対する操作から厳密に分離されます。OOP では、プログラムはカプセルまたはクラスで構成され、カプセルはデータとそのデータを操作する関数の両方で構成されます。次に、非表示について話しましょう。私たちは、どのように構成され、どのように機能するかを理解せずに、あらゆる種類の複雑なデバイスを使用することができるのでしょうか? それは簡単です。作成者はシンプルで便利なインターフェースを提供してくれました。。ソーダマシンでは、インターフェイスはパネル上のボタンです。ボタンを1つ押すと、カップサイズが選択されます。別のボタンを押すと、フレーバーを選択できます。3 番目は氷を加える役割を果たします。必要なのはそれだけです。マシンの内部構成は関係ありません。重要なのは、ユーザーがソーダを飲むために 3 つのボタンを押す必要があるように設計されていることです。車についても同様です。中で何が起こっているかは関係ありません。重要なのは、右のペダルを踏むと車は前進し、左のペダルを踏むと減速することです。。隠すということはそういうことだ。プログラムの「内部」はすべてユーザーから隠されています。ユーザーにとっては余計で不要な情報。ユーザーが必要とするのは内部プロセスではなく、最終結果です。Auto例としてクラス を見てみましょう。

public class Auto {

   public void go() {

       /* Some complicated things happen inside the car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside the car.
       As a result, it slows down. */
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // From the user's perspective,

       // one pedal is pressed and the car accelerates.
       auto.gas();
      
       // The other is pressed, and the car slows down.
       auto.brake();
   }
}
Java プログラムにおける実装の隠蔽がどのように見えるかを次に示します。これは現実世界と同じで、ユーザーにはインターフェイス (メソッド) が提供されます。ユーザーがアクションを実行するためにプログラム内で車が必要な場合は、目的のメソッドを呼び出すだけです。これらのメソッド内で何が起こるかは余分です。重要なのは、すべてが正常に機能することです。ここでは実装の隠蔽について話します。それに加えて、Java にはデータ隠蔽機能もあります。これについてはgetter と setter のレッスンで書きましたが、概念を復習しておいて損はありません。たとえば、次のような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;

}
同僚の誰かが無効な状態のオブジェクトを作成していないかどうかを注意深く監視することはできるかもしれませんが、そのような「無効なオブジェクト」を作成する可能性さえ排除した方がはるかに良いでしょう。カプセル化の原則 - 4次のメカニズムは、データ隠蔽の実現に役立ちます。
  1. アクセス修飾子 ( privateprotectedpackage default )
  2. ゲッターとセッター
たとえば、誰かが猫の年齢に負の数値を割り当てようとしているかどうかを確認するために、そこにチェックを入れることができます。前に述べたように、カプセル化に関するさまざまな記事の著者は、データとメソッドの結合、またはそれらの非表示、あるいはその両方 (結合と非表示) を意味する場合があります。Java には両方のメカニズムがあるため (これは他の OOP 言語に必ずしも当てはまるとは限りません)、最後の意味が最も正確です。カプセル化には、いくつかの重要な利点があります。
  1. オブジェクトの正しい状態を制御します。上記にその例がありました。setter と private 修飾子を使用すると、プログラムに体重が 0 の猫が存在しないことが保証されます。

  2. インターフェースによる使いやすさ。メソッドのみが外部に「公開」されたままになります。結果を得るにはメソッドを呼び出すだけで十分です。メソッドがどのように機能するかを詳しく調べる必要はまったくありません。

  3. コードの変更はユーザーには影響しません。メソッド内であらゆる変更を加えます。これはメソッドのユーザーには影響しません。以前にアクセル ペダルを踏むための正しいコードが "auto.gas()" だった場合は、引き続きそのコードが適用されます。Gas() メソッド内で何かを変更したという事実は、ユーザーには見えないままです。以前と同様、呼び出し元は単に目的の結果を受け取るだけです。