1. はじめに

今日のレッスンはカプセル化に当てたいと思います。一般的にはそれが何であるかはすでにご存知です。

カプセル化

カプセル化の利点は何ですか? それらはかなりの数ありますが、私の意見では主なものを 4 つ挙げることができます。


2. 有効な内部状態

プログラムでは、オブジェクトが他のいくつかのクラスと対話する状況がよく発生します。オブジェクトとのこれらの相互作用により、オブジェクト内のデータが破損し、オブジェクトが期待どおりに動作し続けることができなくなる可能性があります。

その結果、オブジェクトは内部データへの変更を追跡するか、できればオブジェクト自体に変更を加える必要があります。

他のクラスによって変数を変更したくない場合は、それをプライベートとして宣言します。これを実行すると、そのクラスのメソッドのみがアクセスできるようになります。変数を読み取り専用にしたい場合は、public getter関連する変数に を追加する必要があります。

たとえば、コレクション内の要素の数を誰もが知ることができるようにしたいが、許可なくコレクションを変更できるようにしたくないとします。次に、private int count変数とpublic getCount()メソッドを宣言します。

カプセル化を適切に使用すると、どのクラスもクラスの内部データに直接アクセスできなくなり、制御不能な変更が防止されます。これらの変更は、変更される変数と同じクラスのメソッドを呼び出すことによってのみ可能です。

他のプログラマは、あなた (クラスにとって) 最も安全な方法ではなく、常に自分にとって最も便利な方法であなたのクラスを使用すると想定するのが最善です。この動作は、バグの原因となるだけでなく、バ​​グを防止しようとする試みにもなります。


3. メソッド引数の検証

場合によっては、メソッドに渡される引数を検証する必要があります。たとえば、人を表し、誕生日を設定できるクラスがあるとします。すべての入力データをチェックして、プログラムのロジックおよびクラスのロジックと整合していることを確認する必要があります。たとえば、13 か月目や 2 月 30 日の誕生日を禁止するなどです。

なぜ誕生日を 2 月 30 日と指定するのでしょうか? まず、これはデータ入力時のユーザー エラーである可能性があります。第 2 に、プログラムは時計仕掛けのように実行を開始する前に、多数のエラーを抱えている可能性があります。例えば、以下のような状況が考えられます。

プログラマーは、明後日が誕生日である人を識別するプログラムを作成します。たとえば、今日が 3 月 3 日だとします。プログラムは、その月の現在の日に数字の 2 を加えて、3 月 5 日に生まれた全員を検索します。すべて正しいようです。

しかし、3 月 30 日が来ても、カレンダーには 3 月 32 日がないため、プログラムは誰も見つけられません。メソッドに渡されたデータをチェックすると、プログラムのエラーははるかに少なくなります。

私たちがArrayListそのコードを研究し、分析したときのことを覚えていますか? およびメソッドが が 0 以上で配列の長さより小さいかどうかをチェックしていることgetがわかりsetindex ました。さらに、インデックスが配列の範囲外にある場合、これらのメソッドは例外をスローします。 これは入力検証の典型的な例です。


4. コード変更時のエラーを最小限に抑える

大規模なプロジェクトに関与していたときに、非常に便利なクラスを作成したとします。誰もがそれをとても気に入ったので、他のプログラマーはコード内の何百もの場所でそれを使い始めました。

このクラスは非常に便利だったので、いくつかの改善を加えることにしました。しかし、クラスからメソッドを削除すると、数十人のコードがコンパイルされなくなります。彼らはすべてを書き直す必要があるでしょう。そして、変更を加えれば加えるほど、より多くのエラーが発生します。あなたは多くの集会を破り、嫌われるでしょう。

しかし、プライベートとして宣言されたメソッドを変更すると、これらのメソッドを呼び出す可能性のある他のクラスがどこにも存在しないことがわかります。それらを書き換えたり、パラメーターの数とそのタイプを変更したりすることができ、依存する外部コードは引き続き機能します。まあ、少なくともコンパイルはできます。


5. オブジェクトが外部オブジェクトとどのように相互作用するかを決定します

オブジェクトで実行できるアクションの一部を制限できます。たとえば、オブジェクトを 1 回だけインスタンス化したいとします。プロジェクト内の複数の場所に作成される場合でも。そして、カプセル化のおかげでこれが可能になります。

カプセル化 2

カプセル化により制限を追加できるため、さらなる利点を得ることができます。たとえば、クラスは不変Stringオブジェクトとして実装されます。クラスのオブジェクトは、作成された瞬間から消滅する瞬間まで不変です。クラスのすべてのメソッド( 、、 ...) は、呼び出されたオブジェクトに変更を加えることなく、新しい文字列を返します。StringStringremovesubstring

カプセル化は非常に興味深いものです。