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

时间:2017-11-14 14:28:51

标签: c++ casting dynamic-cast

我从我的服务器发送数据。

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

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

所有这一切都运行良好但现在我需要使用消息并做它需要做的事情(发送答案,写入数据库等)。 最好的方法是什么?现在,我检查消息的类型并获取每个传输的对象。但我不知道他们是什么类(没有明确)。

我是否应该动态投射所有内容(花费不多)?我是否应该对数据进行处理,希望数据始终保持相同的顺序。或者我应该将对象存储为地图(使用名称或枚举作为键)然后正确地投射它?

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

1 个答案:

答案 0 :(得分:4)

我同意彼得。

我可能会使用"嗅探器"返回enum class JType映射JSON到相关消息类型的函数。

然后在switch / case块中使用该JType枚举来调用相应的工厂函数,该函数将返回std :: unique_ptr。

无法解析会抛出异常,而不是返回带有nullptr的unique_ptr。

  • 每个关联的班级类型都有一个工厂。
  • 你有一个嗅探器函数可以确定JSON代表什么类型,返回一个枚举。
  • 快乐路径为JType e = sniff(message);if (e == JType::Foo) std::unique_ptr<Foo_t> foo = FooFactory(message);
  • 只有在消息的例外情况下,工厂才会抛出异常,而且工厂不同意消息中的内容。

没有base_class对象的列表,但枚举类JType将具有到类的1:1映射。

将JSON视为状态信息&#34;脱水&#34;,并且工厂功能&#34;补水&#34;将状态数据转换为新对象。工厂函数可以是作为类的一部分的静态类函数,也可以是独立函数。

层次结构用于多态,这不是那种情况。