gpt4 book ai didi

c++ - 防止滥用专为运输设计的结构

转载 作者:行者123 更新时间:2023-11-30 01:29:47 25 4
gpt4 key购买 nike

我开发的产品有多个组件,其中大部分是用 C++ 编写的,但有一个是用 C 编写的。我们经常遇到这样的场景,一条信息通过 IPC 流经每个组件。

我们使用结构定义这些消息,以便我们可以将它们打包到消息中并通过消息队列发送它们。这些结构仅为“传输”目的而设计,并且以仅服务于该目的的方式编写。我遇到的问题是:程序员持有该结构并将其用作信息的长期容器。

在我看来这是一个问题,因为:

1) 如果我们改变传输结构,他们的所有代码都会被破坏。这里应该有封装,才不会遇到这种情况。

2) 消息结构非常笨拙,仅设计用于传输信息......该结构似乎不太可能恰好是这些其他组件访问此数据(长期)的最方便形式.

我的问题是:如何以编程方式防止这种误用?我想强制要求这些结构只能用于运输。

编辑:我会尽力在这里提供一个示例:

struct smallElement {
int id;
int basicFoo;
};

struct mediumElement {
int id;
int basicBar;
int numSmallElements;
struct smallElement smallElements[MAX_NUM_SMALL];
};

struct largeElement {
int id;
int basicBaz;
int numMediumElements;
struct mediumElement[MAX_NUM_MEDIUM];
};

结果是人们只是坚持“largeElement”而不是从 largeElement 中提取他们需要的数据并将其放入满足他们需要的类中。

最佳答案

当我定义消息结构时(在 C++ 中,在 C 中无效)我确保:

  1. 消息对象是可复制的
  2. 消息对象只需构建一次
  3. 消息对象构造后不能更改

我不确定消息是否仍然是 pod,但我想从内存的角度来看它是等价的。

实现此目标要做的事情:

  1. 有一个唯一的构造函数来设置每个成员
  2. 将所有成员保密
  3. 有 const 成员访问器

例如你可以这样:

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;

};

现在,用户将能够构建消息,从中读取消息,但不能对其进行长期更改,从而使其无法用作数据容器。然而,他们可以存储一条消息,但以后无法更改它,因此它仅对内存有用。


或者....您可以使用“黑匣子”

  1. 在库中分离消息层(如果尚未分离)。
  2. 客户端代码根本不应暴露给消息结构定义。所以不要提供 header ,或隐藏它们或其他东西。
  3. 现在,提供发送消息的函数,这将(在内部)构建消息并发送它们。这甚至有助于阅读代码。
  4. 接收消息时,提供一种通知客户端代码的方法。但是不要直接提供pessages!!!只需将它们保存在图书馆的某个地方(可能是暂时的,或者使用生命周期规则或其他东西),也许是某种管理器,无论如何,但一定要将它们保存在黑盒子里。只需提供一种消息标识符。
  5. 提供函数以在不公开结构的情况下从消息中获取信息。要实现这一点,您有几种方法。在这种情况下,我会提供聚集在命名空间中的函数。这些函数会要求消息标识符作为第一个参数,并且只会从消息中返回一个数据(如果需要,可以是完整的对象)。

这样,用户就不能将结构用作数据容器,因为他们没有自己的定义。他们只能访问数据。

这有两个问题:明显的性能成本以及编写和更改显然更重。也许使用一些代码生成器会更好。 Google Protobuf 在这个领域充满了好主意。


但最好的方法是让他们明白为什么他们的做事方式迟早会崩溃。

关于c++ - 防止滥用专为运输设计的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5329646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com