2015-02-26 1 views
1

Система отправляет предупреждающие сообщения xml. Чтобы поместить файл xml вместе, был создан класс, чтобы предупреждение могло быть сгенерировано до его перевода в xml. Каждое сообщение должно иметь уникальный идентификатор. Насколько это уникально? Идентификаторы идут от 3400 до 3500. Если максимум достигнут, идентификатор сбрасывается.Уникальный идентификатор отправленных сообщений в хорошей практике программирования

#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, когда идентификатор сообщения должен быть выставиться, следующий выполняется:

#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 в файле заголовка и за пределами области видимости, однако, данная сценарическая кодировка, подобная этому оптимизированному взгляду. Есть ли лучший способ решить эту проблему с уникальным идентификатором? Большое спасибо заблаговременно

+0

«плохая практика программирования в объявлении переменной control_ID в файле заголовок и вне сферы класса» --- так, как о поместив переменную в область класса? – tenfour

+0

Если у вас есть класс WarningDetector для создания предупреждений, почему бы вам не поместить control_ID внутри этого класса, и вместо того, чтобы иметь setActionID, просто передайте id в конструкторе. new WarningMessage (nextId) –

+0

BTW, в настоящее время у вас есть один 'control_ID' на единицу перевода, включая заголовок:/ – Jarod42

ответ

0

Хорошая практика программирования может включать в себя отдельные обязанности. Например, установка идентификатора действия для текущего сообщения может быть отделена от выбора идентификатора действия для следующего сообщения. Это может привести к согласованному поведению, когда исключения возникают во время создания WarningMessage (если у вас есть возможность исправить причину исключения, вы можете попробовать снова создать MessageMessage и ожидать того же actionId).

Для решения, что и другие комментарии выше вы могли бы, например:

  • делают control_ID частный статический член WarningMessage (setActionID в настоящее время является членом WarningMessage)
  • удалить открытый сеттер 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; 
} 

Заметим, что это не будет работать в многопоточной среде, но это, кажется, не ваша забота на данный момент

+0

Не потерял бы счет id (idOffset будет перезапущен до 0), когда будет создан новый экземпляр WarningMessage? С каждым новым сообщением приходит новый экземпляр WarningMessage. Вы правы, многопоточность не является моей проблемой прямо сейчас. Спасибо вам за помощь. – okaitt

+0

@okaitt no idOffset не будет перезапущен до 0 при создании нового экземпляра. [Переменные статических членов] (http://www.tutorialspoint.com/cplusplus/cpp_static_members.htm) разделяются всеми объектами класса. –

0

Я бы создал 2 константы IDMIN = 3499 и IDMAX = 3500, чтобы избежать наличия магических чисел в файле реализации. Эти константы должны быть статическими константными членами класса WarningMessage.

Я установил бы 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; 
} 
+0

Не потерял бы счет id при создании нового экземпляра WarningMessage? С каждым новым сообщением приходит новый экземпляр WarningMessage. Спасибо за вашу помощь. – okaitt