全局对象只应为常量
4.11 ID_nonConstGlobalObject
非常量全局对象对外部的读写没有限制,破坏了面向对象的封装理念,不利于维护。
全局对象的初始化顺序和依赖关系也是开发与维护的难点,建议只允许基本类型的常量作为全局对象。
进一步讨论可参见 ID_nonPrivateData、ID_relyOnExternalObject。
示例:
char foo; // Non-compliant
extern char bar; // Non-compliant, worse
const char baz = 'c'; // Compliant
void fun() {
do_something(foo, bar);
}
应将全局对象和相关函数封装成类:
class A {
char foo; // Compliant
char bar; // Compliant
public:
void fun() {
do_something(foo, bar);
}
};
如果变量 foo、bar 确有全局意义,多个模块都需要访问,不妨将其单件化:
A& getGlobal() {
static A obj;
return obj; // The object must be initialized before returning
}
用 getGlobal 函数获取对象,再由其成员函数对数据进行读写,有效实现封装理念,而且可以保证对象在使用之前已被初始化。
配置
onlyConstBasicTypeAllowed: 是否只允许基本类型的常量作为全局对象