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 是公用成员的话, 是否存在任何的不同.
非平凡的语义可能有:
维持类的不变式.
在内部数据类型和接口数据类型之间进行的转换.
建议#
检查那些仅仅只是访问成员, 而没有特殊行为的 get
和 set
函数.