Когда я определяю структуры сообщений (в C ++, недопустим в C), я удостоверяюсь, что:
- объект сообщения копируемый
- объект сообщения долженбыть построенным только один раз
- объект сообщения не может быть изменен после создания
Я не уверен, будут ли сообщения по-прежнему оставаться модулямино я предполагаю, что это эквивалентно с точки зрения памяти.
Что нужно сделать для достижения этой цели:
- Есть один уникальный конструктор, который настраивает каждого члена
- все члены приватные
- имеют константные элементы доступа
Например, у вас может быть это:
struct Message
{
int id;
long data;
Info info;
};
Тогда у вас должно быть это:
class Message // struct or whatever, just make sure public/private are correctly set
{
public:
Message( int id, long data, long info ) : m_id( id ), m_data( data ), m_info( info ) {}
int id() const { return m_id; }
long data() const { return m_data; }
Info info() const { return m_info; }
private:
int m_id;
long m_data;
Info m_info;
};
Теперь пользователи смогут создавать сообщение, читать из него, но не изменять его в дальнейшем, что делает его непригодным для использования в качестве контейнера данных.Однако они могут хранить одно сообщение, но не смогут изменить его позже, поэтому оно будет полезно только для памяти.
ИЛИ .... Вы можете использовать «черный ящик» .
- Разделите слой сообщений в библиотеке, если это еще не сделано.
- Код клиента вообще не должен подвергаться определениям структуры сообщений.Поэтому не предоставляйте заголовки, не скрывайте их или что-то в этом роде.
- Теперь предоставьте функции для отправки сообщений, которые будут (внутри) создавать сообщения и отправлять их.Это даже поможет при чтении кода.
- При получении сообщений укажите способ уведомления клиентского кода.Но не предоставляйте сообщения прямо !!!Просто держите их где-нибудь (может быть, временно или используя правила жизни или что-то в этом роде) внутри вашей библиотеки, может быть, в виде менеджера, что угодно, но держите их ВНУТРИ ЧЕРНОГО Ящика.Просто предоставьте своего рода идентификатор сообщения.
- Предоставьте функции для получения информации из сообщений без раскрытия структуры.Для этого у вас есть несколько способов.Я бы в этом случае предоставил бы функции, собранные в пространстве имен.Эти функции запрашивают идентификатор сообщения в качестве первого параметра и возвращают только одно сообщение из сообщения (которое может быть полным объектом в случае необходимости).
Таким образом, пользователи просто не могут использовать структуры какконтейнеры данных, потому что у них нет своих определений.они могут получить доступ к данным.
С этим связаны две проблемы: очевидные затраты на производительность, и их написание и изменение явно тяжелее.Может быть, лучше использовать генератор кода.Google Protobuf полон хороших идей в этой области.
Но лучшим способом было бы заставить их понять, почему их образ действий рано или поздно нарушится.