Protobuf设计:如何避免2D/3D模板化数据类型的代码重复?
优化后的Protobuf结构方案
当然有更简洁的方式避免代码重复,核心是抽离公共字段,用oneof统一封装不同维度的向量类型,具体定义如下:
// 定义向量的统一包装类型,用oneof承载2D/3D向量 message Vector { oneof data { Vector2D vec2d = 1; Vector3D vec3d = 2; } } // 合并公共字段,用统一的Foo消息替代原有的Foo2D/Foo3D message Foo { optional string sha = 1; optional Type type = 2; optional Vector field_1 = 4; optional Vector field_2 = 5; } // 直接使用Foo类型即可,无需再区分2D/3D分支 message AllFooData { repeated Foo foo_data = 1; }
方案说明
- 消除冗余定义:把原Foo2D和Foo3D中重复的
sha、type字段统一放到Foo消息里,不用再维护两个几乎一样的消息结构。 - 类型安全的向量封装:用
oneof定义Vector类型,确保每个Vector实例只会包含vec2d或vec3d中的一个,避免类型混乱。 - 配合type字段逻辑:业务处理时,可通过
Foo.type字段直接推导维度,然后从field_1.data、field_2.data中读取对应的vec2d或vec3d即可,完全符合你提到的“维度可从type字段推导”的前提。
这种方案既减少了代码重复,又保证了结构的清晰性和类型安全性,序列化/反序列化的效率也和原结构基本一致。
内容的提问来源于stack exchange,提问作者A. Fenzry
相关产品推荐
相关产品推荐

