c++ - 良好编程习惯中已发送消息的唯一标识符

标签 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 TRAFFIC_FREE = 2;
//(...)
class WarningMessage{
 public:
  //setters
  void setActionID();

  //getters
  //(...)
 private:
  unsigned int actionID;    //to be controlled by control_ID
 };
#endif // WARNINGPARAMVEHICLE_H

而在cpp文件中,当需要设置一条消息的id时,执行如下:

#include "project/include/warningmessage.h"

//setters
void WarningParamVehicle::setActionID(){
 if(control_ID == 3500){
  control_ID = 3399;
 }
 control_ID++;
 actionID = control_ID;
}

另一个重要的细节是,此类消息的内存空间只给出一次。每次必须发送另一条消息时,实例将被删除并重新创建:

void WarningDetector::createWarning(){
 delete currentWarningMessage;  // delete previous warning instance
 currentWarningMessage = new WarningMessage();
 (...)
}

最后,currentWarningMessage 在警告检测器中被声明为一个指针:

WarningMessage* currentWarningMessage;

我注意到在头文件中和类作用域外声明变量 control_ID 的不良编程习惯,但是,考虑到像这样的场景编码看起来已优化。有没有更好的方法来解决这里看到的这个唯一标识符问题?提前致谢

最佳答案

良好的编程实践可以包括单一职责。例如,为当前消息设置 action id 可以与决定下一条消息的 action id 分离。这可以在构造 WarningMessage 期间发生异常时实现一致的行为(如果您有机会修复异常的原因,您可能想再次尝试创建 WarningMessage 并期望相同的 actionId)。

为了解决这个问题和上面的其他评论,您可以例如:

  • 将 control_ID 设为 WarningMessage 的私有(private)静态成员(setActionID 当前是 WarningMessage 的成员)
  • 移除公共(public) setter setActionID 并改为在初始化列表中初始化 actionID
  • 管理 control_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

在cpp文件中:

#include "project/include/warningmessage.h"

unsigned WarningMessage::idOffset = 0;

WarningMessage::WarningMessage()
: actionId(ID_START + idOffset) /* ... */
{
    // increment idOffset only when you are sure that it is safe
    ++idOffset;
    idOffset %= ID_COUNT;
}

请注意,这不会在多线程环境中工作,但目前您似乎不关心

关于c++ - 良好编程习惯中已发送消息的唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28746978/

相关文章:

ios - 是否可以在受控环境中从浏览器获取 iOS 设备的唯一标识符?

php - 重复功能

java - 自动 Java 到 C++ 的转换

c++ - 不能取消引用值初始化的迭代器

c++ - printf 没有打印正确的值

Android MediaDrm 唯一 ID

java - 如何在 Android 中重置 AtomicInteger 唯一 ID?

python - 如何在 Python 中生成一个人类友好的唯一 ID?

c++ - QTextEdit : typing in HTML/richttext

c++ - 如何从不同对象的文本文件中读取单独的一行?