16 December 2022

C++ 核心指南目录

C.131: Avoid trivial getters and setters

理由

繁琐细枝末节的 getter 和 setter 不增加语义价值;数据要么就直接 public 就好了。

例子

class Point {   // Bad: verbose
    int x;
    int y;
public:
    Point(int xx, int yy) : x{xx}, y{yy} { }
    int get_x() const { return x; }
    void set_x(int xx) { x = xx; }
    int get_y() const { return y; }
    void set_y(int yy) { y = yy; }
    // no behavioral member functions
};

考虑将这个类改成 struct,这样,就成了没有行为的一组变量,所有数据都公开,没有成员函数。

struct Point {
    int x {0};
    int y {0};
};

注意,我们可以在成员变量上添加默认初始值。C.49 在构造函数中进行初始化操作,不要进行赋值。

注意

此规则的关键是getter/setter的语义是否重要。虽然很难定义是否重要,但是可以考虑如果将getter/setter改成公开的数据是否导致任何语法上的差异。不重要的语义就是如果转换内部类型和接口类型,依然能保持类的不变式,那就是语义不重要。

强化

  • 标注有多个 get 和 set 成员函数只是访问成员数据,而不增加语义的类。