6

以下は、クラスでのプロパティの使用に関する質問です。

メンバー変数を公開する代わりに、パブリックプロパティを使用しています。大多数は、このアプローチがカプセル化に役立つとアドバイスしています。しかし、私はそれをプロパティにすることによるカプセル化の利点を理解していません。

多くの人は、プロパティを使用する本当の理由を知りません。彼らはコーディング標準の一部としてそれを行うだけです。

プロパティがパブリックメンバー変数よりも優れていること、およびカプセル化がどのように改善されるかを誰かが明確に説明できますか?

4

4 に答える 4

8

カプセル化は、呼び出しクラスを変更から隔離するのに役立ちます。

車のエンジンをモデル化する単純なクラスがあるとしましょう (すべての OO の例には車のアナロジーが含まれている必要があります :))。次のような単純なフィールドがある場合があります。

private bool engineRunning;

このフィールドを公開するか、IsEngineRunning() ゲッターを提供するだけで、違いはないようです。

クラスをより洗練されたものにする場合、そのフィールドを削除して次のように置き換えます。

private bool ignitionOn;
private bool starterWasActivated;

古いフィールドにアクセスするクラスがたくさんある場合は、engineRunningそれらすべてを変更する必要があります (悪い時期です)。

代わりに次のものから始めた場合:

public bool IsEngineRunning()
{
    return this.engineRunning;
}

次のように変更できます。

public bool IsEngineRunning()
{
    return ignitionOn && starterWasActivated;
}

クラスのインターフェースは同じままです(良い時代です)。

于 2010-05-25T09:33:15.333 に答える
5

メンバー変数の値を設定または取得するときにあらゆる種類のチェックを実行できるため、メンバー変数の代わりにプロパティを公開することをお勧めします。

メンバー変数があるとします:

private int id;

そしてあなたは公共の財産を持っています:

public int ID
{
    get 
    { 
       // do something before returning
    }
    set 
    {
      // do some checking here may be limits or other kind of checking
    }
}
于 2010-05-25T10:46:54.070 に答える
3

短くします。プロパティ=柔軟性

1プロパティは、常にクラスに保持したくないメンバーや、既存のメンバーの集約/関数であるメンバーを作成する場合に役立ちます。

例えば。age は生年月日に基づいて出力できます。 canSwim は hasLimbs && floats から生成できます。

2メンバーをプロパティとして公開すると、既存のデータベースを持つシステムで予期しない変更 [すべてのクライアントの要求を予測したことがありますか?] に対処するときに役立ちます。

例えば。isAllowed は、ユーザーが 18 歳以上で、パフォーマンスのためにキャッシュされている場合に true になります。クライアントは米国でサービスを実行したいと考えており、false がキャッシュされている場合は false を返し、キャッシュが true の場合にのみ年齢を確認できます

于 2010-05-25T10:10:57.027 に答える
1

いくつかの考え:

  • 呼び出しクラスに影響を与えることなく、データの内部表現を変更できます。

    (前)

    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();
    }
    

    したがって、特定の一連のアクションを強制します。呼び出し元がこのアクションを適切に実行するという事実に依存する必要はありません。オブジェクトは常に正しい状態になります。

于 2010-05-25T09:33:28.917 に答える