四角形のクラスを定義し、さまざまなメソッドを装備するように要求する割り当てを行ってgetHeight()
いgetWidth()
ます. 要点がわかりません。orにアクセスしたい場合は、代わりに参照してアクセスしないのはなぜですか?return this.height;
return this.width;
width
height
this.width
this.getWidth()
3 に答える
主なポイントは次のとおりです。インターフェイスを実装から分離すること。
属性の getter および setter 関数 (getWidth()
およびgetHeight()
) はインターフェイスです。実際の変数this.width
とthis.height
は実装です。
外の世界にとって重要なのはインターフェイスだけであり、実装は重要ではありません。実装は内部のままにする必要があります (データのカプセル化)。
セッターとゲッターを持つことは、クラスの基礎を書くときにタイピングの練習のように感じることがありますが、クラスとそのインターフェースがより複雑になると、通常は効果があります。Eclipse for Java や C++ などの一部の IDE は、新しいデータ メンバーのボイラープレート コードの生成をサポートしています。
非常に単純なクラスの場合、分離は無意味に見え、ゲッターとセッターを省略して直接アクセスを許可することがあります。1 つの例は、メンバーおよびを持つPoint2d
クラスです。x
y
しかし、オブジェクトがより複雑になるとすぐに、getter と setter を使用することをお勧めします。インターフェイスを変更せずに、後で実装を変更できます。たとえば、オブジェクトの幅が変更されたときに、後で他のインスタンスに通知できます。
getter の主要なアプリケーションの 1 つは、いくつかの側面への読み取り専用インターフェイスを実装することです。この場合、getter メソッドだけがあり、setter はなく、データ要素は非公開になります。このようにして、クラスを使用するコードが誤って値を変更するのを防ぎます。
一部の言語では、位置によって、または.private
Python などの他の言語は、この厳密なデータ カプセル化を明示的にサポートしていませんが、慣例により、内部データ メンバーの前に特定のプレフィックスまたはサフィックスを付けることで実現できます (Python では二重または単一のアンダースコアであり、二重のアンダースコアは名前をいくらか混乱させます)。
これは情報隠蔽と呼ばれ、それを利用する理由はさまざまです。たとえば、通常、外部ユーザーにアクセスを許可しthis.height
たり、外部ユーザーthis.width
に直接変更してほしくない (おそらく無効な値に設定する) ことは望ましくありません。一般に、データがクラスにどのように格納されるかを非表示にし、自分で定義したメソッドを介したアクセスのみを許可します。
もちろん、これについて心配する必要がない場合もあります。final
たとえば、フィールドが次のように宣言されている場合、直接アクセスを許可しても問題ない場合があります。public final int
これは、 というフィールドを持つすべての配列で見られますlength
。フィールドへの直接アクセスをfinal
より適切にするのは、ユーザーがフィールドを変更できないことを知っていることです。
さらに、ゲッターとセッターを使用すると、コードの保守と将来の更新が容易になります。たとえば、将来、高さの報告方法を変更したい場合はどうでしょうか? つまり、特定のしきい値を下回っている場合は 0 を報告します。height
人々がすでにフィールドに直接アクセスしている場合、これは不可能です。
これに関する基本原則は、クラスの実装と使用を分離することです (クラス インターフェイスによって定義されます)。クラスのユーザーが「setter」メソッドと「getter」メソッドを介してクラス属性にアクセスするように強制すると、後でインターフェイスを変更せずに、これらの属性の実装方法を変更できるようになります。たとえば、属性を格納する代わりに計算したり、メモリ変数の代わりにデータベースに格納したりすることができ、クラスのユーザーは知ったり気にしたりする必要がありません。