1

我有一个类,其中包含一些可以从外部源修改的成员:

class CNode
{
protected:
    // these members might be changed by users   
    std::string m_sName;
    CState m_CurrentState;
    CColor m_DiffuseColor; 
};

该示例已简化,我的代码中有更多成员。

现在改变的最佳做法是什么

  1. 单身的
  2. 多个(一次)
  3. 所有成员(一次)

这个班的?

我的代码需要处理所有情况,尽管内部情况 1. 将是通常情况。大多数情况下,它应用于单个 CNode,但也可能应用于节点数组。

我知道两种可能的解决方案都不能真正让我满意:

  1. 为每个变量设置和获取:
    Pro
    每个变量都可以独立于其他成员进行修改。
    轻松为多个 CNode 设置相同的值。
    魂斗罗
    很多设置&gets;
    如果添加了新变量,则还需要添加新的 set&get。

如果在许多 CNode 中更改一个变量,这将最有效

  1. 创建一个包含所有可修改变量的 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 中的每次更改进行更新,尽管我相信这也应该可以通过模板通过编译器解决。

我的问题是:
我的用例还有其他可能的解决方案吗?
哪种方法最明智?

4

1 回答 1

0

您可以将如何更新和更新什么的逻辑添加到类中,并且只为其提供信息源。

看看你如何构建属性对象并将逻辑转移到将驻留在 CNode 中的更新函数中。

如果 CNode 需要外部信息源来执行更新,则将它们传输到更新功能。

优选地,传递给更新函数的参数数量将小于 CNode 中的字段数量。(理想情况下为零或一)

CNode 只会更新实际修改过的字段。

不需要多个集合函数,更新类的方式统一,裂缝之间不会丢失信息。

于 2016-01-20T12:50:45.953 回答