【问题标题】:Redundant Data Members冗余数据成员
【发布时间】:2020-08-13 20:02:50
【问题描述】:

我有一个存储 SquareMatrix 的 A 类。

class A{
private:
    SquareMatrix mat;
};

该类经常使用 mat.size() (一个常数时间操作)来使用矩阵的大小。 mat.size() 确实是 A 大小的另一种度量。遵循良好的编码习惯,A 是否也应该存储 mat.size() 的副本?

class A{
private:
    SquareMatrix mat;
    int size;
};

【问题讨论】:

  • 鉴于这个小而不完整的例子,我个人认为添加它没有任何好处。您在代码库中看到这样做有什么好处吗?在看到有或没有好处之后,您还会添加它吗?
  • “良好的编码习惯”?也许你的意思是为垫子的大小创建一个访问器/属性方法,例如int GetSize() const {return mat.size();},但这仅假设 A 的 GetSize() 表示私有垫的大小。如果 GetSize() 不明确,GetMatSize() 可能是一个更好的名称。
  • 还有一个问题(除了should I)- 你可以吗?我的意思是,SquareMatrix 的大小可以在不通知您的情况下更改吗?此问题类似于缓存失效。另外,如果 SquareMatrix 存储了它的大小(不需要每次都重新计算),我宁愿在需要时获取它。

标签: c++ datamember


【解决方案1】:

如果 "mat.size() 真的是 A 大小的另一种度量,则在此示例中存储表示 A 大小的 数据成员 不是一个好主意.

这里的主要问题是:A::size 应该如何跟踪对SquareMatrix::size() 的更改?这个值可能会在很多地方发生变化,保持它们同步会很棘手,而且即使你成功了也很难维护。

相反,为A 提供一个成员函数,它只返回mat.size() 的结果,如下所示:

class A{
  private:
    SquareMatrix mat;
  public:    
    int size() const { return mat.size(); }  // mat.size() IS A's size :)
};

【讨论】: