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

时间:2015-02-26 15:56:50

标签: 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的错误编程实践,但是,给定的场景编码看起来是优化的。有没有更好的方法来解决这里看到的这个唯一标识符问题?非常感谢提前

2 个答案:

答案 0 :(得分:0)

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

要解决上述问题以及上述其他评论,例如:

  • 使control_ID成为WarningMessage的私有静态成员(setActionID当前是WarningMessage的成员)
  • 删除公共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;
}

请注意,这在多线程环境中不起作用,但目前似乎不是您关注的问题

答案 1 :(得分:0)

我会创建2个常量IDMIN = 3499IDMAX = 3500,以避免在实现文件中包含幻数。这些常量应该是类WarningMessage的静态const成员。

我会将control_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;
}