23

(そもそもそれらを持っているべきかという問題はさておき。)

関数のオーバーロードを使用して、ゲッターとセッターの両方に同じ名前を付けることを常に好んでいました。

int rate() { return _rate; }      
void rate(int value) { _rate = value; }

// instead of     
int getRate() { return _rate; }      
void setRate(int value) { _rate = value; }

// mainly because it allows me to write the much cleaner     
total( period() * rate() );    
// instead of      
setTotal( getPeriod() * getRate() );

当然、私は正しいのですが、ライブラリの作成者には正当な理由があるのだろうか?

4

13 に答える 13

2

誰も言及していないもう 1 つの問題は、関数のオーバーロードの場合です。この(不自然で不完全な)例を見てみましょう:

class Employee {
    virtual int salary() { return salary_; }
    virtual void salary(int newSalary) { salary_ = newSalary; }
};

class Contractor : public Employee {
    virtual void salary(int newSalary) {
        validateSalaryCap(newSalary);
        Employee::salary(newSalary);
    }
    using Employee::salary; // Most developers will forget this
};

このusingContractorがないと、過負荷のため、 のユーザーは給与を照会できません。私は最近-Woverloaded-virtual、私が取り組んでいるプロジェクトの警告セットに追加しましたが、見よ、これはいたるところに現れました.

于 2009-10-23T01:21:57.110 に答える
2

「取得」と「設定」にはいくつかのレベルがあります。

  • 「高速」操作には Get と Set を使用します。
  • これらの名前は、結果を取得するために何らかの作業を行う必要があることを暗示しているため、実行に時間がかかるものはしばしば Calc になります。
  • より長い操作では、ロード/保存、クエリ/ストア、読み取り/書き込み、検索/検索などのプレフィックスを取得し始めます。

したがって、Get/Set は有用な意味を持ち、より大規模で一貫した命名戦略の一部となることができます。

于 2009-10-22T21:43:25.340 に答える
2

簡潔であることは重要ですが、不完全であることや誤解を招くことを犠牲にしてはいけません。そのため、私は Foo() と Foo(int foo) よりも GetFoo() と SetFoo() を好みます。

于 2009-10-22T21:34:17.563 に答える
1

個人的には、ペアになっているゲッターとセッターは、「ビジュアル」言語とその「プロパティ」から引き継がれたコードの匂いだと思います。「良い」クラスでは、データ メンバーは書き込み専用または読み取り専用ですが、読み取り/書き込みではありません。

ゲッターとセッターの最も一般的な原因は、オブジェクト モデルを十分に深く持っていないことだと思います。あなたの例では、合計が期間と率を超えているのはなぜですか? 彼らはクラスのメンバーではありませんか? したがって、期間とレートのみを設定する必要があり、合計のみを取得する必要があります。

おそらく例外はありますが、クラスを見て「getX/setX、getY/setYなど」を見つけるのが嫌いです。クラスがどのように使用されるべきかについて十分な考慮がなされていないようであり、作成者はクラスをどのように使用すべきかを検討する必要がないように、データを取得しやすいようにクラスを作成しました。

もちろん私は正しい。

于 2009-10-22T21:36:43.500 に答える
0

get ラベルと set ラベルを避けることを好みます。これらの単純なプロパティのほとんどについて、コンパイラがその仕事をするために情報は必要ありません。

問題が発生する可能性があります:

class Stuff {
  void widget( int something ); // 'special' setter
  const Widget& widget( int somethingelse ) const; // getter
}
Stuff a; 
a.widget(1); // compiler won't know which widget you mean, not enough info
于 2009-10-23T03:47:59.873 に答える