我有一个类,其中包含一些可以从外部源修改的成员:
class CNode
{
protected:
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
};
该示例已简化,我的代码中有更多成员。
现在改变的最佳做法是什么
- 单身的
- 多个(一次)
- 所有成员(一次)
这个班的?
我的代码需要处理所有情况,尽管内部情况 1. 将是通常情况。大多数情况下,它应用于单个 CNode,但也可能应用于节点数组。
我知道两种可能的解决方案都不能真正让我满意:
- 为每个变量设置和获取:
Pro:
每个变量都可以独立于其他成员进行修改。
轻松为多个 CNode 设置相同的值。
魂斗罗:
很多设置&gets;
如果添加了新变量,则还需要添加新的 set&get。
如果在许多 CNode 中更改一个变量,这将最有效
- 创建一个包含所有可修改变量的 CProperties 类:
Pro:
父类中的一个 set&get - 可以添加/删除属性,而无需修改 set&get。
这也减少了我的 API 中处理用户输入的方法数量。
相反:
设置单个变量需要获取当前的 CProperties,因此其他值不会被修改。
如果在单个 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 中的单个变量的情况下,这似乎是一个糟糕的解决方案。
在我的情况下,执行时间和(大小)开销大多无关紧要。(这确实是我反对惰性版本的唯一好论据)
相反,我正在寻找干净、可理解、可用的代码。
我可以考虑采用动态方法的第三种可能的解决方案:
一个 set 方法有一个对象作为参数,该对象可能包含一个或多个需要修改的值。然后,API 只有一个 set 方法,如果 CProperties 更改,则不需要任何修改。相反,CNode 类中需要一个解析方法。这种解析方法仍然需要针对 CProperties 中的每次更改进行更新,尽管我相信这也应该可以通过模板通过编译器解决。
我的问题是:
我的用例还有其他可能的解决方案吗?
哪种方法最明智?