「こんにちは、アミーゴ! 今日の講義はカプセル化について捧げたいと思いますあなたはすでにカプセル化が何であるかについての大まかなアイデアを持っています。」

カプセル化 - 1

では、カプセル化の利点は何でしょうか? たくさんありますが、私が考える最も重要なものを 4 つ挙げます。

1) 有効な内部状態。

プログラムには、同じオブジェクトと対話する複数のクラスが含まれることがよくあります。オブジェクトの内部データと同時に対話することにより、オブジェクトのデータの整合性が侵害され、オブジェクトが正しく動作しなくなる可能性があります。

したがって、オブジェクトは内部データへの変更を追跡する必要があります。さらに言えば、オブジェクト自体がそれらの変更を行う必要があります。

あるクラス変数を他のクラスによって変更されたくない場合は、それをprivate と宣言します。これは、そのクラスのメソッドのみがその変数にアクセスできることを意味します。他のクラスに対して変数を読み取り専用にしたい場合は、これらの変数にpublic getterを追加します。

たとえば、コレクションに含まれる要素の数を全員に知らせたい場合がありますが、許可なしに誰もそれを変更することはできません。この場合、変数private int countとメソッドpublic getCount()を宣言します。

適切なカプセル化により、他のクラスがクラスの内部データに直接アクセスできなくなり、その結果、アクションを制御できない限りデータを変更できなくなります。変更される変数を含むクラスのメソッドを呼び出す必要があります。

他のプログラマは常に、あなた (またはあなたのクラス) にとって最も安全な方法ではなく、自分にとって最も便利な方法であなたのクラスを使用すると想定するのが最善です。これはバグの原因であり、バグを防ぐ方法でもあります。

2) パラメータのチェック。

場合によっては、クラスのメソッドに渡されるパラメーターを確認する必要があります。たとえば、「人」を表すクラスがあり、その誕生日を指定できるとします。渡されたデータがプログラムのロジックおよびクラスのロジックに対応していることを検証する必要があります。たとえば、13 番目の月や 2 月 30 日などはありません。

「なぜ誰かが誕生日を2月30日と示すのでしょうか?」

「そうですね、まず第一に、データ入力エラーの結果である可能性があります。」

次に、プログラムが時計のように機能する前に、多くのバグが存在する可能性があります。たとえば、このようなことが起こるかもしれません。

プログラマーは、誰が明後日の誕生日を迎えるかを決定するコードを書きます。今日が 3 月 3 日だとします。プログラムは現在の日付に 2 を加えて、3 月 5 日に生まれた全員を検索します。ここまでは問題ありません。

しかし、3 月 30 日が来ても、3 月 32 日がないため、プログラムは誰も見つけません。メソッドがパラメーター チェックを実行すると、プログラムのバグははるかに少なくなります。」

「ArrayList を研究したとき、そのコードを見たときのことを覚えています。インデックス パラメータが 0 以上で配列の長さ未満であることを確認するための get メソッドと set メソッドのチェックがありました。コードは配列にインデックスに対応する要素がなかった場合は例外です。

「はい、これは古典的な入力チェックです。

3) クラス内のコードを変更する際のバグが少なくなります。

巨大なプロジェクトの一部として非常に役立つクラスを作成したとします。誰もがこれを非常に気に入ったため、他のプログラマーが自分のコードの何百もの場所でこれを使用し始めました。

このクラスは非常に便利であることが判明したため、それを改善することにしました。しかし、クラス内のメソッドのいずれかを削除すると、他の何十ものプログラマのコードはコンパイルできなくなります。コードをすぐに書き直す必要があります。そして、書き換えが増えるほど、バグが発生する可能性が高くなります。頻繁にビルドを壊すと嫌われるでしょう。

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

4) 他のオブジェクトが私たちのオブジェクトとどのように相互作用するかを定義します。

オブジェクトに対して実行できるアクションを制限できます。たとえば、プロジェクト内の複数の場所で同時にクラスが作成される場合でも、クラスのインスタンスを 1 つだけ作成したい場合があります。そして、カプセル化を使用してこれを実現できます。

カプセル化 - 2

カプセル化により、追加の制限を課すことができ、それがさらなる利点となる可能性があります。たとえば、String クラスは不変オブジェクトとして実装されます。String クラスのインスタンスは、作成から破棄までの間で変更できません。String クラスのすべてのメソッド (remove、substring など) は新しい文字列を返しますが、呼び出されたオブジェクトは一切変更されません。

「聖なる牛よ。そういうことなんですね。」

「カプセル化は興味深いですね。」

"同意します。"