CppCoreGuidelines C.133 避免使用 protected 数据
18 December 2022
C.133: Avoid protected
data
理由
protected
数据是复杂和错误的源泉。 protected
数据把类的不变式约束弄得更复杂。 protected
数据违反了“不要把数据放在基类”的指导方针,往往会导致需要处理虚继承关系。
例子
class Shape { public: // ... interface functions ... protected: // data for use in derived classes: Color fill_color; Color edge_color; Style st; };
这样,就要求每个 Shape
的继承类都要能正确处理 protected
的数据。尽管这种做法很流行,但是会导致维护困难。在大的类层级结构中,维护使用
protected
数据的一致性很困难,因为在大量的类中隐藏着大量的代码要修改。能够接触这些数据的类也是开放的:任何人都可以继承一个新类,去操作这些
protected
数据。我们往往对所有的类进行检查,所以修改这些类变得很困难。没有任何不变式约束这些 protected
数据,更像是一组全局变量。 protected
数据事实上成了很大一片代码的全局变量。
注意
protected
数据经常看起来能够通过继承提供很多优化。然而,事实上,你经常得到的是无原则的修改和错误。请使用 private
私有数据,并强化不变式约束。另一个更好的改进方法,就是使用接口,不要添加数据。
注意
protected
成员函数没问题。
强化
- 标注使用了
protected
数据的类