是否可以放弃简单类的getter和setter?

Max*_*xpm 19 c++ oop encapsulation getter-setter member-variables

我正在制作一个非常简单的类来表示3D空间中的位置.

目前,我只是让用户访问和修改个人X,YZ值直接.换句话说,它们是公共成员变量.

template <typename NumericType = double>
struct Position
{
    NumericType X, Y, Z;

    // Constructors, operators and stuff...
};
Run Code Online (Sandbox Code Playgroud)

这背后的原因是,因为NumericType是一个模板参数,我不能依赖于有一个体面的方法来检查值的理智.(我怎么知道用户不希望用负值表示位置?)因此,添加getter或setter以使接口复杂化是没有意义的,因为简洁直接访问应该受到青睐.

Pos.X = Pos.Y + Pos.Z; // Versus...
Pos.SetX(Pos.GetY() + Pos.GetZ());
Run Code Online (Sandbox Code Playgroud)

这是一个好的例外吗?我的代码的(假设的)未来维护者是否会追捕我并打击我的脸?

And*_*ron 16

背后使用getter和setter的想法是能够比执行其他行为只是设置一个值.建议采用这种做法,因为您可能希望在课堂上进行多种改进.

使用setter的常见原因(可能更多):

  • 验证:并非变量类型允许的所有值对成员都有效:在赋值之前需要验证.
  • 不变量:可能需要调整依赖字段(例如,重新调整数组大小可能需要重新分配,而不仅仅是存储新大小).
  • 钩子:在分配之前/之后需要执行额外的工作,例如触发通知(例如,观察者/侦听者在值上注册).
  • 表示:该字段不以"已发布"的格式存储为getter和setter.该字段甚至可能不存储在对象本身中; 该值可能会转发给其他内部成员或存储在单独的组件中.

如果您认为您的代码永远不会使用或要求任何上述代码,那么按原则编写getter和setter绝对不是一个好习惯.它只会导致代码膨胀.

编辑:与流行的看法相反,使用getter和setter不太可能帮助你改变类的内部表示,除非这些更改很小.特别是个别成员的存在者使得这种变化非常困难.

  • @Neil:监视函数调用应该像监视值更改一样容易.@Andre:使用*Edit*很有意义,封装确实只有在方法表达高级操作时才有效.如果这些方法与底层表示一样微调,它们就不会封装得太多...... (2认同)