Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 良好编程实践中发送消息的唯一标识符_C++_Uniqueidentifier - Fatal编程技术网

C++ 良好编程实践中发送消息的唯一标识符

C++ 良好编程实践中发送消息的唯一标识符,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

系统发送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 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;
}