我正在处理这些方面的事情:
我有一个非常复杂的类和一个成员,它依赖于一些在类初始化时未设置的东西,或者在旅途中设置。即使没有设置该成员,该类的对象也有意义。它也可以根据对其他成员所做的其他更改进行重置。
现在,假设这个“特殊”成员的设置计算成本很高,所以我会根据要求延迟计算它。
所以:
class Class
{
X x;
Y y;
SpecialClass specialObject;
public:
void setX(const X& newX);
void setY(const Y& newY);
//----
SpecialClass getSpecialObject() /*const*/
{
computeSpecialObject();
return specialObject();
}
private:
void computeSpecialObject()
{
//specialObject depends on x and y
//and is expensive to compute
//this method is a bottleneck
}
};
我不想compute
每次更改时都调用该方法,x
或者y
因为它很昂贵,所以我陷入了两难境地:
- 删除
const
?从逻辑上讲,getter 应该是const
,但它不能。还有一个缺点是它不能在const
对象上调用。 - 我可以做
specialObject
mutable
,但这似乎不是正确的做法。 - 抛弃一贯性?再次,看起来很腥。
- 在获取之前调用
computeSpecialObject
?- 如果有人忘记了怎么办?他们会得到一个过时的结果。
有没有处理这个问题的设计模式?一个好的方法?还是课程设计错了?(我倾向于最后一个,但改变课程并不是一个真正的选择)
注意:我已经做了会员mutable
,想知道是否有更好的解决方案。