以下のクラスを考えてみましょう:getter/setterの設計を単純化するために、値ラッパーと演算子()のオーバーロードを使用する:危険な方法ですか?
class MyClass1
{
public:
double x() const {return _x;} // getter
double y() const {return _y;} // getter
double z() const {return _x*_y;} // getter
void x(const double var) {_x = var;} // setter
void y(const double var) {_y = var;} // setter
void z(const double var) {_x = var; _y = 1;} // setter
protected:
double _x;
double _y;
};
MyClass1
の実際の内容は、実装の詳細であるため、ゲッターとセッターは、クラスの内容を取得し、設定する統一された方法を提供し、彼らはinterdependantであっても(ここでは_z
ありません内部的に存在するが、ユーザにとっては、z
は、x
およびy
のような変数である。 x
とy
のgetter/setterメソッドを記述する必要がないようにする今
、1はこのようにラッパーを使用することができます。
template <typename Type>
class Wrapper
{
public:
constexpr Wrapper(const Type& value) {_value = value;}
constexpr Type& operator()() {return _value;}
constexpr const Type& operator()() const {return _value;}
constexpr void operator()(const Type& value) {_value = value;}
protected:
_value;
};
をそして今、元のクラスは次のようになります。
class MyClass2
{
public:
Wrapper<double> x;
Wrapper<double> y;
double z() const {return x*y;} // getter
void z(const double var) {x = var; y = 1;} // setter
};
がそれですゲッター/セッターを書く必要がないようにするには、危険な練習かよい解決策が必要ですか?
注:ここでMyClass1
とMyClass2
は例にすぎません。私の質問は非常に "一般的"です:getter/setterが単に内部値を返す/設定するとき、提案されたWrapper
によってクラスのgetter/setterを置き換えるのは危険です。
実際に何かを実行する必要があると思います(検証、等)をアクセサーに与える。そうでなければ、彼らはそれらを持つという目的を打ち負かすでしょう。あなたは思いませんか? imho – imreal
あなたのクラスはインターフェイスを取得/設定する必要がありますか?これらの関数がクラス不変式を維持する必要がない場合、それらをカプセル化することはほとんどありません。 – TemplateRex