3

他のいくつかのプライベート変数に基づいて値を計算するパブリック読み取り専用プロパティがあります。計算されたプロパティから多くのことを読み取ります。計算で使用される変数はめったに変化しません。現在、読み取り専用のゲッターに計算ロジックを実行させていますが、従属変数が変更されたときに新しい値をプロパティにプッシュする方が理にかなっています。

私の現在のコードの例:

public class rectangle()
{
    public rectangle(int height, int width)
    {
        _height = height;
        _width = width;
    }

    public void resize(int heightOffset, int widthOffset)
    {
        _height += heightOffset;
        _width += widthOffset;
    }

    private int _height;
    private int _width;
    public int area
    {
        get
        {
            return _height * _width;
        }
    }
}

上記のコードは非常に単純化されていますが、私の言いたいことをうまく示しています。_height と _width は変更される可能性がありますが、変更されることはめったにありません。area プロパティはたくさん読み取られます... area プロパティの 100,000 回以上の読み取りごとに _height/_width が 1 回変更されると推定します。

単純な掛け算であれば気にしませんが、実際の計算は複雑で、多くの実行時間が余分な計算の繰り返しに費やされています。

私はそれを修正するために次のことができることを知っています:

...

private int _height;
private int height
{
    set
    {
        _height = value;
        _area = _height * _width;
    }
}

private int _width;
private int width
{
    set
    {
        _width = value;
        _area = _height * _width;
    }
}

private int _area;
public int area
{
    get
    {
        return _area;
    }
}

...

上記のコードは、私の状況を考えるとはるかに理にかなっていますが、これを行うためのより良い方法があるに違いないと私には思えます。最初の例を考えると、プロパティを削除して計算ロジックを resize() メソッドに移動できることはわかっていますが、実際のコードでは、プライベート値に影響を与えるメソッドは 1 つだけではありません。すべての出現を見つけるために自分のコードをくまなく調べる必要はありません。そうするのは保守的ではないようです。

2番目の方法は行く方法ですか?機能することはわかっていますが、何かがおかしいと感じています。私の懸念は、プライベート プロパティの値をプライベート変数に格納するのは奇妙に思えることだと思います。私はこれを考えすぎているかもしれません。

4

5 に答える 5

4

プロパティ アクセサーがアクセス修飾子を持つことができることをご存知ですか?

例えば:

public string A
{
    internal get
    {
        // Whatever
    }
    private set
    {
        // Whatever
    }
}

これは自動プロパティでも機能します。

public string A
{
    internal get;
    private set;
}

更新: アクセサー アクセス修飾子についてはわかりましたが、これについてはどうですか?

public class rectangle()
{
    public rectangle(int height, int width)
    {
        Height = height;
        Width = width;
    }

    public int Height { get; private set; }
    public int Width { get; private set; }
    public int Area { get; private set; }

    public void resize(int heightOffset, int widthOffset)
    {
        Height += heightOffset;
        Width += widthOffset;

        RefreshArea();
    }

    private void RefreshArea() 
    {
        Area = Height * Width;
    }
}

さようなら、プライベートフィールド!

于 2012-06-06T16:17:44.487 に答える
0

高さ/幅のプロパティを常に使用して _height と _width を設定する限り、提案された方法は機能します。

プライベート変数にプライベート プロパティを使用しても問題はありません。更新コードを 1 つの場所に移動して、保守を容易にします。

マティアスが述べたように、高さと幅のプロパティに異なるアクセス修飾子を持つアクセサーを持たせることができるので、このクラスの外で高さ/幅のプロパティを読み取ることはできますが、書き込むことはできません。

于 2012-06-06T16:23:23.867 に答える