次のクラスについて考えてみます。
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
は実装の詳細であるため、ゲッターとセッターは、相互依存している場合でも、クラスのコンテンツを取得および設定するための統一された方法を提供します(ここで_z
は内部には存在しませんが、ユーザーにとっては、およびz
のような変数です)。x
y
ここで、とのゲッター/セッターを作成する必要をなくすためにx
、y
次のようなラッパーを使用できます。
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
は単なる例です。私の質問は非常に「一般的」です。ゲッターWrapper
/セッターが内部値を返す/設定するだけの場合、クラスのゲッター/セッターを提案されたものに置き換えるのは危険ですか。