JavaRush /Java Blog /Random-JA /Java のカプセル化原則

Java のカプセル化原則

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

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.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;

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

  2. インターフェースによる使いやすさ。ユーザーアクセス用に「外部」メソッドのみを残します。彼がしなければならないのは、結果を得るために彼らに電話することだけであり、彼らの仕事の詳細を掘り下げる必要はまったくありません。

  3. コードを変更してもユーザーには影響しません。すべての変更はメソッド内で行います。これはユーザーには影響しません。ユーザーは車のガソリン用に auto.gas() を書いたので、それを書きます。そして、gas() メソッドの操作で何かを変更したという事実は、彼には見えないままになります。彼は、以前と同様に、単に目的の結果を受け取るだけです。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION