设置(属性)类

时间:2016-01-20 12:21:35

标签: c++ api class member-access

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

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. 为每个变量设置和获取:

      每个变量都可以独立于其他成员进行修改 易于为多个CNode设置相同的值 的魂斗罗
      很多设置和获取;
      如果添加了一个新变量,则还需要添加一个新的set& get。
    2. 如果在许多CNode中更改了一个变量

      ,这将最有效
      1. 创建一个包含所有可修改变量的CProperties类:

        一组和一组进入父类 - 可以添加/删除属性而无需修改set& get。
        这也减少了我处理用户输入的API中的方法数量 的魂斗罗
        设置单个变量需要获取当前的CProperties,因此其他值不会被修改。
      2. 如果在单个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中的每个更改,仍然需要更新此解析方法,但我相信这也应该通过模板与编译器一起解决。

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

1 个答案:

答案 0 :(得分:0)

您可以添加如何更新的逻辑以及更新到课程中的内容,并仅为其提供信息来源。

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

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

最好传递给更新函数的参数个数小于CNode中的字段数。(理想情况下为零或一个)

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

不需要多重设置功能,更新类的统一方式,裂缝之间没有信息丢失。