设置(属性)类的单个/多个成员的最佳做法

Best practice to set single/multiple members of a (property-) class

本文关键字:成员 最佳 单个 属性 设置      更新时间:2023-10-16

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

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

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

现在改变的最佳实践是什么

  1. 多个(一次)
  2. 所有成员(一次)

这个类的?

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

我知道两种可能的解决方案,它们都不能真正满足我:

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

如果在多个 CNodes 中更改一个变量,这将效果最好

  1. 创建一个包含所有可修改变量的 CProperties 类:
    优点
    父类中的一个 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 只有一个设置方法,如果 CProperties 发生变化,则不需要任何修改。相反,CNode 类中需要解析方法。这种解析方法仍然需要针对 CProperties 中的每个更改进行更新,尽管我相信这也应该可以通过模板使用编译器解决。

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

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

了解如何生成属性对象并将逻辑传输到将驻留在 CNode 中的更新函数中。

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

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

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

无需多个设置函数,统一的类更新方式,没有信息在裂缝之间丢失。