良好编程习惯中已发送消息的唯一标识符
Unique Identifier for sent messages in good programming practice
系统发送 xml 警告消息。为了将 xml 文件放在一起,创建了一个 class,以便在将其转换为 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;
}
另一个重要的细节,space 内存中此 class 消息仅给出一次。每次必须发送另一条消息时,实例将被删除并重新创建:
void WarningDetector::createWarning(){
delete currentWarningMessage; // delete previous warning instance
currentWarningMessage = new WarningMessage();
(...)
}
最后,currentWarningMessage 在警告检测器中声明为指针:
WarningMessage* currentWarningMessage;
我注意到在头文件中和 class 范围之外声明变量 control_ID 的错误编程习惯,但是,考虑到像这样的场景编码看起来已优化。有没有更好的方法来解决这里看到的这个唯一标识符问题?非常感谢
良好的编程习惯可以包括单一职责。例如,为当前消息设置 action id 可以与决定下一条消息的 action id 分离。这可以在构造 WarningMessage 期间发生异常时实现一致的行为(如果您有机会修复异常的原因,您可能想再次尝试创建 WarningMessage 并期望相同的 actionId)。
要解决这个问题和上面的其他评论,您可以例如:
- 使 control_ID 成为 WarningMessage 的私有静态成员(setActionID 当前是 WarningMessage 的成员)
- 删除 public setter setActionID 并改为在初始化列表中初始化 actionID
- 管理control_ID,构造函数中的最后一件事(以防万一)
在header中:
#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;
}
请注意,这不会在 multi-threaded 环境中工作,但这似乎不是您目前关心的问题
我会创建 2 个常量 IDMIN = 3499
和 IDMAX = 3500
以避免在实现文件中出现幻数。这些常量应该是 class WarningMessage
.
的静态常量成员
我会在方法 WarningParamVehicle::setActionID
中将 control_ID
设置为静态变量(不是 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;
}
系统发送 xml 警告消息。为了将 xml 文件放在一起,创建了一个 class,以便在将其转换为 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;
}
另一个重要的细节,space 内存中此 class 消息仅给出一次。每次必须发送另一条消息时,实例将被删除并重新创建:
void WarningDetector::createWarning(){
delete currentWarningMessage; // delete previous warning instance
currentWarningMessage = new WarningMessage();
(...)
}
最后,currentWarningMessage 在警告检测器中声明为指针:
WarningMessage* currentWarningMessage;
我注意到在头文件中和 class 范围之外声明变量 control_ID 的错误编程习惯,但是,考虑到像这样的场景编码看起来已优化。有没有更好的方法来解决这里看到的这个唯一标识符问题?非常感谢
良好的编程习惯可以包括单一职责。例如,为当前消息设置 action id 可以与决定下一条消息的 action id 分离。这可以在构造 WarningMessage 期间发生异常时实现一致的行为(如果您有机会修复异常的原因,您可能想再次尝试创建 WarningMessage 并期望相同的 actionId)。
要解决这个问题和上面的其他评论,您可以例如:
- 使 control_ID 成为 WarningMessage 的私有静态成员(setActionID 当前是 WarningMessage 的成员)
- 删除 public setter setActionID 并改为在初始化列表中初始化 actionID
- 管理control_ID,构造函数中的最后一件事(以防万一)
在header中:
#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;
}
请注意,这不会在 multi-threaded 环境中工作,但这似乎不是您目前关心的问题
我会创建 2 个常量 IDMIN = 3499
和 IDMAX = 3500
以避免在实现文件中出现幻数。这些常量应该是 class WarningMessage
.
我会在方法 WarningParamVehicle::setActionID
中将 control_ID
设置为静态变量(不是 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;
}