カプセル化を使用してコードの保守性を実証する方法を説明する例を示してください。
これに getter メソッドと setter メソッドが使用されるのはなぜですか?
カプセル化を使用してコードの保守性を実証する方法を説明する例を示してください。
これに getter メソッドと setter メソッドが使用されるのはなぜですか?
基本的な考え方は、クラスのユーザーにデータ (クラス変数) への完全なアクセスを与えるのではなく、必要なすべての操作 (クラス メソッド) を提供することです。この手法により、クラス変数の不注意な変更やデータの不一致を防ぐことができます。例: Student というクラスがあるとします。
Class Student {
private:
int id;
string name;
public:
SetStudenDetails( int i, string n);
PrintStudentDetails();
};
Get メソッドを使用すると、クラスのユーザーが名前と ID の両方を提供することを確認できます。
Timothy Budd による Object Oriented Programming の本を読むことをお勧めします。
私たちが同じプロジェクトで働いていて、最初にクラスのコードを書き、次にプログラムであなたのクラスを使用したと想像してください。後で、クラスの動作が気に入らなかったのは、クラスのインスタンス変数の一部が (私のコードから) 予期しない値に設定されていたためです。彼らのコードはあなたのコードにエラーを引き起こしました。(安心してください、私はそんなことはしませんので、心配しないでください。) これは Java プログラムなので、新しいバージョンのクラスを出荷するだけでよいはずです。このクラスは、自分のコードを変更せずに自分のプログラムで置き換えることができます。 .
上記のシナリオは、オブジェクト指向 (OO) の 2 つの利点、つまり柔軟性と保守性を強調しています。しかし、これらのメリットは自動的には得られません。あなたは何かをしなければなりません。柔軟性と保守性をサポートする方法でクラスとコードを作成する必要があります。Java は OO の概念をサポートしているからといって、コードを書くことはできません。それをできる??たとえば、次のコードが示すように、パブリック インスタンス変数を使用してクラスを作成し、他のプログラマーがインスタンス変数を直接設定していたとします。
public class BadExample {
public int size;
public int weight;
...
}
public class AnotherBadExample {
public static void main (String [] args) {
BadExample b = new BadExample ();
b.size = -5; // Legal but bad!!
}
}
ここで、段落前に説明したシナリオに戻ります。BadExample はあなたのクラスで、AnotherBadExample は私のコードです。コードロジックに役立つように変数の1つを変更しましたが、クラスの動作が完全に変わります。今、あなたは困っています。誰もあなたの値を直接変更できないようにクラスをどのように変更しますか (私がコードで行ったように)? 唯一の選択肢は、setSize(int newVal) というメソッドをクラス内に記述してから、変数サイズのアクセス修飾子を private に変更することです。これにより、誰かが必要のないサイズ変数に値を設定しようとしたときにインスタンスを処理できるようになり、同時に、誰もサイズ変数に直接アクセスしてコードをいじることができなくなります。
しかし、残念ながら、それを行うことで、私のコードが壊れてしまいました。AnotherBadExample クラスをコンパイルしようとすると、サイズ変数が表示されなくなるため、エラーが発生します。
今、この状況にどのように対処できるでしょうか。最善の方法は、パブリック変数を誰でも変更できるようなコードを書かないことです。
あなたのコードを使用する他のすべてのユーザーのコードを壊すことなく、コードを変更できることは、カプセル化の主な利点です。実装の詳細は常に非表示にする必要があります。詳しく説明すると、常に変数をプライベートとして保持し、他のユーザーが変数にアクセスするために使用できる一連のパブリック メソッドを保持する必要があります。メソッドはパブリックであるため、誰でもアクセスできますが、クラス内にあるため、コードが最適な方法で機能することを確認できます。したがって、コードを変更したい場合は、メソッドを変更するだけです。コードでメソッド名を使用しているだけで、メソッド内のコードはあまり気にしないので、誰も怪我をしません。
保守性、柔軟性、および拡張性が必要な場合 (そして、おそらく必要だと思います)、設計にカプセル化を含める必要があります。どうやってそれをしますか?• インスタンス変数を保護します (アクセス修飾子を使用し、ほとんどが非公開)。• パブリック アクセサー メソッドを作成し、インスタンス変数に直接アクセスするのではなく、これらのメソッドを使用する呼び出しコードを強制します。• メソッドには、set と get の JavaBeans 命名規則を使用します。
アクセス メソッドをゲッターとセッターと呼びますが、アクセサーとミューテーターというより凝った用語を好む人もいます。(個人的には、ゲッターとセッターという用語を使用します) それらを何と呼びたいかに関係なく、それらは他のプログラマーがインスタンス変数にアクセスするために通過しなければならないメソッドです。それらは単純に見えます。Java コードを書いている場合は、おそらくそれらを永遠に使用しているでしょう。
public class GoodExample {
// protect the instance variable only an instance of your class can access it
private int size;
// Provide public getters and setters
public int getSize() {
return size;
}
public void setSize(int newSize) {
size = newSize;
}
}
あなたはおそらくつぶやいているでしょう、何もせずに値を設定または取得するだけのメソッドを持つことの利点は何ですか。むしろパブリック変数が必要です。それを行った場合は、カプセル化の下の最初の段落に移動し、すべてを読み直してください。そして、あなたがそれをしていないのに、誰も無効な値に変更しないようにするために setSize() メソッドにあるはずの検証コードはどこにあるのかと私に尋ねているなら、私の友人、これは単なるサンプルクラスです。どのように実装する必要があるかについては、あなたに考えてもらいます。少なくとも、私のような誰かがあなたと一緒にコーディングしたり、さらに悪いことに、予期しないショックを受けることはありません!!!
カプセル化は情報隠蔽です。これは、Java のアクセス修飾子(private、public、protected、default)によって実現できます 。したがって、アクセス修飾子を使用することで、変数とメソッドの可視性に制限を課すことができます。
また、カプセル化は、エンティティに関連する関数と変数を単一のクラスにラップします。
ゲッターおよびセッター メソッドは、クラスのインスタンス変数に外部からアクセスするために使用されるため、インスタンス変数への直接アクセスが保護されます。