C++ 良好编程实践中发送消息的唯一标识符
系统发送xml警告消息。为了将xml文件放在一起,创建了一个类,以便在将其转换为xml之前生成警告。每封邮件都必须有一个唯一的ID。 有多独特?ID从3400到3500。如果达到最大值,则重置IDC++ 良好编程实践中发送消息的唯一标识符,c++,uniqueidentifier,C++,Uniqueidentifier,系统发送xml警告消息。为了将xml文件放在一起,创建了一个类,以便在将其转换为xml之前生成警告。每封邮件都必须有一个唯一的ID。 有多独特?ID从3400到3500。如果达到最大值,则重置ID #ifndef WARNINGMESSAGE_H #define WARNINGMESSAGE_H #include <ctime> static unsigned int control_ID = 3399; //Effect Codes: const unsigned int TRA
#ifndef WARNINGMESSAGE_H
#define WARNINGMESSAGE_H
#include <ctime>
static unsigned int control_ID = 3399;
//Effect Codes:
const unsigned int TRAFFIC_FREE = 2;
//(...)
class WarningMessage{
public:
//setters
void setActionID();
//getters
//(...)
private:
unsigned int actionID; //to be controlled by control_ID
};
#endif // WARNINGPARAMVEHICLE_H
另一个重要的细节是,这个类消息的内存空间只给出一次。每次必须发送另一条消息时,实例都会被删除并重新创建:
void WarningDetector::createWarning(){
delete currentWarningMessage; // delete previous warning instance
currentWarningMessage = new WarningMessage();
(...)
}
最后,currentWarningMessage在警告检测器中声明为指针:
WarningMessage* currentWarningMessage;
我可以注意到在头文件和类范围之外声明变量control_ID的糟糕编程实践,然而,给定这样的场景编码看起来是优化的。有没有更好的方法来解决此唯一标识符问题?提前多谢好的编程实践可能包括单一责任。例如,设置当前消息的操作id可以与决定下一条消息的操作id分离。这可以在构建WarningMessage期间发生异常时启用一致的行为(如果有机会修复异常的原因,您可能希望再次尝试创建WarningMessage并期望相同的actionId) 为了解决上述问题和其他问题,您可以:
- 使control_ID成为WarningMessage的私有静态成员(setActionID当前是WarningMessage的成员)
- 删除公共setter setActionID并在初始化列表中初始化actionID
- 管理控件ID,构造函数中的最后一件事(以防出现异常)
#ifndef WARNINGMESSAGE_H
#define WARNINGMESSAGE_H
#include <ctime>
//Effect Codes:
const unsigned int TRAFFIC_FREE = 2;
//(...)
class WarningMessage{
public:
WarningMessage();
//remove public setters if your use case doesn't require them
//getters
//(...)
private:
// deconstructing control_ID
static const unsigned ID_COUNT = 100;
static const unsigned ID_START = 3400;
static unsigned idOffset = 0;
const unsigned int actionID; //to be controlled by control_ID
};
#endif // WARNINGPARAMVEHICLE_H
请注意,这在多线程环境中不起作用,但您目前似乎并不关心这一点,我将创建两个常量,以避免在实现文件中出现幻数。这些常量应该是类
WarningMessage
的静态常量成员
我会将control\u ID
设置为方法WarningParamVehicle::setActionID
中的静态变量(它不是WarningMessage::setActionID
?)。然后它将给出:
class WarningMessage{
public:
static const int IDMIN = 3499;
static const int IDMAX = 3500;
//setters
void setActionID();
...
在随后的实施中:
void WarningParamVehicle::setActionID(){
static int control_ID = WarningMessage::IDMIN;
if(control_ID == IDMAX){
control_ID = IDMIN;
}
control_ID++;
actionID = control_ID;
}
“在头文件中声明变量control_ID而在类作用域之外的糟糕编程实践”-那么,把变量放在类作用域中如何?如果你有一个WarningDetector类来创建警告,为什么不把control_ID放在该类中,而不是放一个setActionID,只需在构造函数中传递id。新警告消息(nextId)顺便说一句,目前,每个翻译单元都有一个
控件ID
,包括标题:/@tenfour如果我没有错,在创建WarningMessage的新实例时,将变量放入类作用域将使我无法计数。@JoãoAugusto事实上,到目前为止,您的答案似乎是我的最佳选择。创建WarningMessage的新实例时,我不会无法计数id吗?现在,每一条新消息都附带一个新的WarningMessage实例。谢谢你的帮助。当创建WarningMessage的新实例时,我会不会记不清id(idOffset将重新启动为0)?现在,每一条新消息都附带一个新的WarningMessage实例。你说得对,多线程不是我现在关心的问题。谢谢您的帮助。@okaitt no idOffset在创建新实例时不会重新启动为0。由类中的所有对象共享。
class WarningMessage{
public:
static const int IDMIN = 3499;
static const int IDMAX = 3500;
//setters
void setActionID();
...
void WarningParamVehicle::setActionID(){
static int control_ID = WarningMessage::IDMIN;
if(control_ID == IDMAX){
control_ID = IDMIN;
}
control_ID++;
actionID = control_ID;
}