设置(属性)类的单个/多个成员的最佳做法
Best practice to set single/multiple members of a (property-) class
我有一个类,其中包含一些可以从外部源修改的成员:
class CNode
{
protected:
// these members might be changed by users
std::string m_sName;
CState m_CurrentState;
CColor m_DiffuseColor;
};
该示例已简化,我的代码中有更多的成员。
现在改变的最佳实践是什么
- 单
- 多个(一次)
- 所有成员(一次)
这个类的?
我的代码需要处理所有情况,尽管内部情况 1. 将是通常的情况。大多数情况下,它应用于单个 CNode,但也可能应用于节点数组。
我知道两种可能的解决方案,它们都不能真正满足我:
- 为每个变量设置和获取:
优点:
每个变量都可以独立于其他成员进行修改。
易于为多个CNodes设置相同的值。
魂斗罗:
很多设置和得到;
如果添加了新变量,则还需要添加新的set&get。
如果在多个 CNodes 中更改一个变量,这将效果最好
- 创建一个包含所有可修改变量的 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 只会更新实际修改的字段。
无需多个设置函数,统一的类更新方式,没有信息在裂缝之间丢失。
- 在派生类中使用基类的私有成员变量的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 可以具有不同基成员实现的类的最佳实现
- 删除类成员的动态分配内存的最佳方法是什么
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- std::使用类成员函数创建线程 - 最佳实践
- 使用相同方法但不同成员类型构建类的最佳方法
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- 返回可能在C++中分配在堆栈上的成员时,最佳指针/引用类型是什么
- 成员变量的初始化必须延迟。此类的最佳设计选择是什么?
- 在抽象基类中与抽象类成员合作的最佳方法
- 具有许多成员变量的课程的最佳实践
- 访问成员变量或访问成员函数是最佳选择
- 在C++中将迭代器存储为类成员的最佳实践
- 获取私有实例变量容器成员值的最佳方式
- C++是修改这些对象的向量中所有对象的给定成员的最佳方法
- 复制包含STL成员(如vector)的C++结构的最佳方法是什么
- 最佳实践:访问向量中具有不同成员变量和方法的派生类
- 私有类成员延迟初始化的最佳做法
- 组织专用成员 Vector<Vector 接口的最佳方式<Type>>