如何处理初始化类的大量属性
How do I handle a large number of properties that initialize a class?
我有一个类需要大量属性进行初始化:
Hand hand = new Hand();
hand->skinColor(Color(0.5, 0.5, 0.2));
hand->indexFingerLength(0.5);
hand->middleFingerLength(0.6);
hand->ringFingerLength(0.55);
...
hand->init(); // Builds the hand model
这些属性只能在调用init()之前进行修改,init()使用这些属性来构建类。问题是,在调用init()后,这些属性仍然可以被修改,但没有效果,这个接口可能会误导用户认为它们会产生效果。
除了将所有属性移动到init()的参数列表中之外,还有更好的方法来重构它吗?
struct structHandParms
{
param1;
param2;
param3;
...
};
structHandParms stParams;
Hand hand = new Hand(stParams)
您可以添加一个传递给构造函数的"Hand_Init"结构:
Hand_Init hand_init;
hand_init.skinColor = Color(0.5, 0.5, 0.2);
hand_init.indexFingerLength = 0.5;
hand_init.middleFingerLength = 0.6;
hand_init.ringFingerLength = 0.55;
Hand hand = new Hand(hand_init);
这样一来,一旦构造函数调用完成,手就被初始化了,就不会有一堆可能导致混乱的匿名参数。
如果要创建多个Hand
,那么可以使用类似于Builder Pattern的东西。
// set properties
HandBuilder hb;
hb.skinColor(Color(0.5, 0.5, 0.2));
hb.indexFingerLength(0.5);
hb.middleFingerLength(0.6);
hb.ringFingerLength(0.55);
// create object
Hand hand = hb.buildHand();
这完全要求在构造函数中包含逻辑,而不是后面跟着init的单独方法。然后,很明显(并由编译器强制执行)以后不能更改它们。如果有很多参数,请将它们全部分组到一个结构中,该结构将被填充并传递到构造函数中,而不是25个单独的参数。
"对init()的调用,它使用它们来构建类"真的构建了一个类,还是初始化了这个类的实例?
为什么不在ctor中进行整个初始化,并将所需的值作为参数传递?
我认为这是为您的项目维护文档和用户手册的一个很好的理由,或者您可以更改为向类发送描述符。然后,创建描述符,用配置填充它,并将所有信息一次性发送给构造函数。
您可以通过抛出异常来解决后init()修改的问题。这将防止用户调用其中一个设置函数并期望它执行某些操作。
作为替代方案,您可以创建一个HandParameter类/结构。该对象将负责收集有关Hand对象所需的所有数据。接下来,您可以使Hand对象的init()函数将HandParameter作为其唯一的参数。
struct HandParam
{
// Whatever settings you need
};
class Hand
{
bool initialized;
// other private data
public:
Hand();
Hand( const HandParam& params ); // Calls the init() funciton with params
void init( const HandParam& params ); // sets up hand and sets initialized to true
// Whatever else you need in your class
};
祝你好运!
相关文章:
- 类的C++属性似乎已重新初始化
- 我的子类的属性是延迟初始化的
- 如何在不知道属性具有哪些构造函数的情况下初始化属性?
- boost::spirit指针属性是用nullptr初始化的吗?
- C++ 中常量属性的初始化构造函数错误
- 在构造函数 c++ 中初始化属性时出现问题
- 初始化类C++私有属性(值/引用/静态)
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- 提升捆绑属性:是否需要初始化每个边的所有属性?
- 当我初始化了指针属性 allready 时,如何将 QGraphicsItem 向下投射到创建的类?
- 使初始化变量可供多个属性初始化方法访问
- 如何在C++中初始化孙子的祖父母(const)属性?
- 如果第二个属性未支撑,则将与支撑初始化器配对缩小转换
- 组合框初始化错误:无法读取未定义的属性'constructor'
- 正在使用std::string初始化istream属性
- QObject 自定义属性何时从样式表中指定的值初始化
- 是否可以在初始化列表中使用基类属性
- 在c++中查找对象的未初始化属性
- C++字符串上的静态属性初始化错误