7

これにはおそらく答えられないことはわかっていますが、プライベートメンバーを直接使用するか、クラスメソッド内でパブリックアクセサーを使用するかについて、何らかのガイダンスがあるかどうかを探しています。

たとえば、次のコードを考えてみましょう (Java のコードですが、C++ でも非常によく似ています)。

public class Matrix {

    // Private Members
    private int[][] e;
    private int numRows;
    private int numCols;

    // Accessors
    public int rows(){ return this.numRows; }
    public int cols(){ return this.numCols; }

    // Class Methods
    // ...
    public void printDimensions()
    {
        // [A] Using private members
        System.out.format("Matrix[%d*%d]\n", this.numRows, this.numCols);


        // [B] Using accessors
        System.out.format("Matrix[%d*%d]\n", this.rows(), this.cols());
    }

このprintDimensions()関数は、同じ情報を取得する 2 つの方法を示しています。[A] プライベート メンバーを使用する方法 ( this.numRows, this.numCols) または [B] アクセサーを使用する方法 ( this.rows(), this.cols()) です。

一方では、プライベート メンバー変数の値を誤って変更する可能性がないため、アクセサーを使用することを好むかもしれません。一方、不要な関数呼び出しを削除することを期待して、プライベート メンバーに直接アクセスすることを好む場合があります。

私の質問は、事実上の標準なのか、それとも優先されているのかということです。

4

3 に答える 3

8

スタイルコールです。私はアクセサーを使用することを好みます。私見によると、関数呼び出しのオーバーヘッドは十分に小さいため、ほとんどの場合問題にならず、この使用によりデータの抽象化が維持されます。後でデータの保存方法を変更したい場合は、変数に触れたすべての場所を探すのではなく、アクセサーを変更するだけで済みます。

しかし、私はそれについて強く感じていません。正当な理由があれば、この「ルール」を破ります。

于 2012-06-05T17:22:34.167 に答える
3

私見では、アクセサーはアクセサー自体ではなく、構造とデータ管理の問題です。場合によっては、データを返す前に一部のデータを前処理する必要があります。この例について考えてみましょう。

public class Foo {

    private List<Bar> bars = null;

    //Methods and stuff

    public List<Bar> getBars() {
        if(bars == null)
            bars = SomeClass.loadBars();
            // You can also use 
            // setBars(SomeClass.loadBars());
        return bars;
    }

}

この場合、ゲッターはフィールドをラップするだけでなく、呼び出すたびに初期化されたフィールドを返します。クラス内でアクセサーを使用すると、部外者の場合と同じ利点が得られます。フィールドの特定の詳細から自分自身を抽象化し、処理後に取得できます。

一方、フィールドが直接返される場合(たとえば、文字列)、getを使用するかどうかは関係ありませんが、コードの標準を尊重するためにgetを使用することをお勧めします。

結局、それはすべてコーディングスタイルに要約されます。

于 2012-06-05T17:41:25.113 に答える
2

オブジェクトのサブクラスを含む他のオブジェクトがあり、アクセサーを使用していますが、オブジェクト自体にフィールドを使用させています。そうすれば、内部と他の世界とのインターフェースの間に明確な違いがあります。クラスの内容をそれ自体から隠すことは不必要であり、混乱を招く可能性があります。実装をオブジェクトの他の部分から隠すことで本当にメリットがある場合は、それを別のオブジェクトに分割します。

于 2012-06-05T17:40:02.917 に答える