我想摆脱动态铸造。最好的选择是什么?

I would like to get rid of dynamic casting. What is the best alternative?

我向服务器发送数据或从服务器发送数据。

我创建一条消息,设置类型(枚举)和需要传输的对象。

邮件作为压缩的 JSON 字符串发送。 当我收到它时,我解析消息,实例化对象并开始填充它。当我需要实例化传输的数据时,我使用一个映射,其中包含 class 的名称作为键和指向构造函数的指针作为值。

所有这些工作正常,但现在我需要使用消息并执行需要用它完成的操作(发送答复、写入数据库等)。 最好的方法是什么?现在,我检查消息的类型并获取每个传输的对象。但我不知道 class 它们是什么(没有明确说明)。

我应该动态投射所有东西吗(花很多钱却不多)?我是否应该希望数据始终保持相同的顺序来处理数据?或者我应该将对象存储为映射(以名称或枚举作为键)然后正确地转换它?

我知道尽可能不要进行动态转换。但是在这里我想知道,从一开始就进行切换并创建正确的对象并将其提供给 JSON 是否值得?现在整个消息都是动态重建的,没有任何问题,我的消息管理器会处理,我应该改变吗?

我同意彼得的观点。

我可能会使用 "sniffer" 函数 returned 一个 enum class JType 将 JSON 映射到消息的关联类型。

然后在 switch/case 块中使用该 JType 枚举来调用适当的工厂函数,该函数将 return 一个 std::unique_ptr.

解析失败会引发异常,而不是 return 带有 nullptr 的 unique_ptr。

  • 每个关联的 class 类型都有一个工厂。
  • 你会有一个嗅探器函数来确定 JSON 代表什么类型,return枚举。
  • 幸福的道路是 JType e = sniff(message);if (e == JType::Foo) std::unique_ptr<Foo_t> foo = FooFactory(message);
  • 工厂抛出异常只会发生在消息的异常情况下,并且工厂不同意消息中应该包含什么。

没有 base_class 对象的列表,但是枚举 class JType 会有一个 1:1 映射到 classes。

将 JSON 视为状态信息 "dehydrated",工厂函数 "rehydrate" 将状态数据转换为新对象。工厂函数可以是作为 class 一部分的静态 class 函数,也可以是独立函数。

层次结构是为了多态性,这不是那种情况。