C.131: 避免平凡的 getters 和 setters

C.131: 避免平凡的 getters 和 setters#

警告

为了便于读者理解, 将内容尽量适配到了教学大纲所用的 C++98, 因而存在对原文的曲解和言不达意, 有能力请尽量阅读原文.

点此查看原文

原因#

平凡的 getters 或 setters 没有任何语义上的价值; 那些数据成员本可以直接作为公用成员.

示例#

 1class Point {  // 糟糕: 啰嗦的
 2public:
 3  Point(int xx, int yy) : x(xx), y(yy) {}
 4  int get_x() const {
 5    return x;
 6  }
 7  void set_x(int xx) {
 8    x = xx;
 9  }
10  int get_y() const {
11    return y;
12  }
13  void set_y(int yy) {
14    y = yy;
15  }
16  // 没有任何特殊行为的成员函数
17
18private:
19  int x;
20  int y;
21};

考虑将这样的类定义为 struct ——即, 不含有特殊行为的数据组合 (不含有不变式), 所有数据是公用, 没有成员函数.

1struct Point {
2 public:
3  int x;
4  int y;
5};

注意#

该准则的关键是 getter/setter 的语义是否是平凡的 (trivial).

如果不清楚什么是 "平凡的", 考虑如果 getter/setter 是公用成员的话, 是否存在任何的不同.

非平凡的语义可能有:

  • 维持类的不变式.

  • 在内部数据类型和接口数据类型之间进行的转换.

建议#

检查那些仅仅只是访问成员, 而没有特殊行为的 getset 函数.