拒做PB Boy!教你巧用 Protobuf 反射来优化代码( 五 )


新增一个字段或者变更某个字段的校验规则,只需要修改 Proto,不需要修改代码,从而防止因变更代码导致错误 。
3.3 基于 PB 反射的前端页面自动生成方案在我们常见的运营系统中,经常会涉及到各种各样的表单页面 。在前后端交互方面,当需要增加字段或者变更字段的校验规则时,需要面临如下问题:

  • 前端:针对新字段编写 html 代码,同时需要修改前端页面;
  • 后台:针对每个字段做接收,并进行校验 。
每增加或变更一个字段,我们都需要在前端和后台进行修改,工作量大,同时频繁变更容易导致错误 。有什么方法可以解决这些问题吗?答案是使用 PB 的反射能力 。
通过获取 Message 中每个字段的描述然后返回给前端,前端根据字段描述来展示页面,并且对字段进行校验 。同时通过这种方式,前后端可以共享一份表单校验规则 。
在使用上述方案之后,当我们需要增加字段或者变更字段的校验规则时,只需要在 Proto 中修改字段,大大节省了工作量,同时避免了因发布带来的风险问题 。
3.4 通用存储系统在运营系统中,前端输入字段,传入到后台,后台校验字段之后,一般还需要把数据存储到数据库中 。
对于某些运营系统来说,其希望能够快速接入一些数据,传统开发常常会面临如下问题:
  • 如何在不增加或变更表结构的基础上,如何快速接入数据?
  • 如何零开发实现频繁添加字段、新增渠道等需求?
  • 如何兼容不同业务、不同数据协议(比如 PB 中的不同 message)?
答案是使用 PB 的反射,使得有结构的数据转换为非结构的数据,然后存储到非关系型数据库(在微信支付侧一般存入到 table kv)中 。
以 3.2 节中的 Proto 为例,举例如下,学生类中定义了两个字段,name 和 email 字段,原始信息为:
Student oStudent;oStudent.set_name("xiaowei");oStudent.set_email("test@tencent.com");通过 PB 的反射,可以转化为平铺的结构:
[{"id":"1","value":"xiaowei"},{"id":"2","value":"test@tencent.com"}]转化为平铺结构后,可以快速存入到数据库中 。如果现在学生信息里需要增加一个字段 address,则不需要修改表结构,从而完成存储动作 。利用 PB 反射,可以完成有结构数据和无结构数据之间的转换,达到存储和业务解耦的特性 。
四、总结本文首先给出了 PB 的反射函数,然后再结合自己平时负责的工作,给出了 PB 的进阶使用 。通过对 PB 的进阶使用,可以大大提高开发和维护的效率,同时提升代码的优雅度 。有需要更进一步研究 PB 的,可以阅读其源代码,不得不说,通过阅读优秀代码能够极大的促进编程能力 。
需要注意的是 PB 反射需要依赖大量计算资源,在密集使用 PB 的场景下,需要注意 CPU 的使用情况 。




推荐阅读