考虑以下类:
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
的实际内容是一个实现细节,getter 和 setter 提供了一种统一的方式来获取和设置类内容,即使它们是相互依赖的(此处 _z
内部不存在,但对于用户而言,z
是一个变量,如 x
和 y
)。
现在为了避免必须为 x
和 y
编写 getter/setter,可以使用这样的包装器:
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
};
避免必须编写 getter/setter 是危险的做法还是好的解决方案?
注意:此处MyClass1
和MyClass2
只是示例。我的问题非常“笼统”:当 getter/setter 只是返回/设置一个内部值时,用提议的 Wrapper
替换类的 getter/setter 是否危险。
最佳答案
正如您所提到的,getter 和 setter 的主要目的是提供一种访问和设置私有(private)实例变量的统一方式。
在您的包装器解决方案中,如果在程序生命周期的某个时候您决定更改一个 setter,您可以扔掉包装器并将其替换为原始的 getter/setter,就像在 MyClass1 中一样——而不必更改所有其他调用它的代码组件。
因此,从那时起,我认为您的解决方案是一种有效的方法,可以让您免于输入额外的几行代码。
关于c++ - 使用值包装器和 operator() 重载来简化 getter/setter 设计 : a dangerous practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14515224/