プロパティとカプセル化
-
04-10-2019 - |
質問
以下は、クラスでプロパティの使用に関する質問です。
私は、メンバー変数を公に公開する代わりに、公共のプロパティを使用しています。大多数は、このアプローチがカプセル化に役立つことをアドバイスしています。しかし、私はそれをプロパティにすることによってカプセル化の利点を理解していません。
多くの人がプロパティを使用する本当の理由を知っています。彼らはコーディング標準の一環としてそれを行います。
誰かが、プロパティがパブリックメンバー変数よりも優れている方法と、カプセル化をどのように改善するかを明確に説明できますか?
解決
カプセル化は、Calling Classeを変更から絶縁することで役立ちます。
車のエンジンをモデル化するシンプルなクラスがあると想像しましょう(すべてのOOの例には、車の類推が含まれるべきです:))。このような単純なフィールドがあるかもしれません:
private bool engineRunning;
単にこのフィールドを公開するか、ISENGINERUNNING()Getterを提供するだけでは違うようには見えません。
ここで、クラスをより洗練されたものにして、そのフィールドを削除してそれを置き換えたいとします。
private bool ignitionOn;
private bool starterWasActivated;
今、あなたが古いものにアクセスする多くのクラスがあるなら engineRunning
あなたが行ってそれらすべてを変えなければならないフィールド(悪い時代)。
代わりにあなたが始めていた場合:
public bool IsEngineRunning()
{
return this.engineRunning;
}
これで変更できます。
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
また、クラスのインターフェイスは同じままです(良い時期)。
他のヒント
メンバー変数の代わりにプロパティを公開する方が良いです。なぜなら、メンバー変数の値を設定または取得するときに、あらゆる種類のチェックを行うことができるからです。
あなたがメンバー変数を持っているとします:
private int id;
そして、あなたは公共財産を持っています:
public int ID
{
get
{
// do something before returning
}
set
{
// do some checking here may be limits or other kind of checking
}
}
短くします。プロパティ=柔軟性
1 プロパティは、常にクラスで保持したくないメンバーを作成したり、既存のメンバーの集約/機能であるメンバーを作成したりするのに役立ちます。
例えば。年齢は生年月日に基づいて出力できます、Canswimはhaslimbs && floatから生成できます
2 既存のデータベースを使用してシステム内の予期しない変更を処理する際に、メンバーをプロパティとして公開することは役立ちます[誰かがすべてのクライアントの要求を予測しましたか?]。
例えば。ユーザーが18歳以上で、パフォーマンスのためにキャッシュされている場合、Isallowedは当てはまります。クライアントは米国でサービスを実行したいと考えており、falseがチャチュであり、キャッシュが真である場合にのみ年齢をチェックする場合はfalseを返すことができます
いくつかの考え:
通話クラスに影響を与えることなく、データの内部表現を変更できます。
例えば (前)
public boolean isActive() { return this.is_active; }
(後)
public boolean isActive() { return this.is_active && this.approved && this.beforeDeadline; }
これは、コードが他の人によって使用されている場合に特に重要です(つまり、コードは サードパーティ)。ある程度、インターフェイス/APIは安定したままでなければなりません。小さな変更は、それを使用する他のコードのコードに影響しないはずです。
より複雑な操作を行うことができます。変数を検討してください
is_active
. 。この変数の値を変更すると、オブジェクトの他のプロパティにも影響します。メソッドのアクセスをカプセル化する場合、このメソッド内でこれを処理することができ、発信者は気にする必要がありません。例えば
public void setActive(boolean active) { this.is_active = active; this.startTimeout(); this.updateOtherInformation(); }
したがって、特定の一連のアクションが実施されます。君 しない 発信者がこのアクションを適切に実行するという事実に依存しています。あなたのオブジェクトは常に正しい状態にあります。