我有一个类,其中包含一些可以从外部源修改的成员:
class CNode
{
protected:
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
};
简化了示例,我的代码中有更多成员。
现在改变的最佳做法是什么
这个班级?
我的代码需要处理所有情况,但内部情况1将是通常的情况。 大多数情况下,它应用于单个CNode,但也可能应用于节点数组。
我知道两种可能的解决方案都不能让我满意:
如果在许多CNode中更改了一个变量
,这将最有效如果在单个CNode中一次更新多个/所有变量,这将最有效。
像这样:
class CProperties
{
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
}
class CNode
{
public:
const CProperties* GetProperties();
void SetProperties(CProperties*);
protected:
CProperties m_Properties;
}
这将是最懒的版本(通过代码创建工作),但对我来说也是最令人讨厌的版本,因为设置单个变量需要先获取当前属性,修改单个变量,然后将完整属性类设置回节点。
特别是在修改一个单变量多个CNodes的情况下,这似乎是一个糟糕的解决方案。
执行时间和(大小)开销在我的情况下大多无关紧要。 (这真是我反对懒惰版本的唯一好论据)
相反,我正在寻找干净,易懂,可用的代码。
我可以用动态方法思考第三种可能的解决方案:
一组方法将对象作为参数,可以包含一个或多个需要修改的值。然后API只有一个set方法,如果CProperties改变,它不需要任何修改。而是在CNode类中需要解析方法。
对于CProperties中的每个更改,仍然需要更新此解析方法,但我相信这也应该通过模板与编译器一起解决。
我的问题是:
我的用例还有其他可能的解决方案吗?
哪种方法最明智?
答案 0 :(得分:0)
您可以添加如何更新的逻辑以及更新到课程中的内容,并仅为其提供信息来源。
了解如何构建属性对象并将逻辑转移到将驻留在CNode中的更新函数。
如果CNode需要外部信息源才能执行更新,请将它们传输到更新功能。
最好传递给更新函数的参数个数小于CNode中的字段数。(理想情况下为零或一个)
CNode只会更新实际修改过的字段。
不需要多重设置功能,更新类的统一方式,裂缝之间没有信息丢失。