为什么需要和可选的协议缓冲区3中删除

我最近使用gRPCproto3 ,我注意到, requiredoptional已被删除在新的语法。

谁会好心解释为什么必须/可选在proto3中被删除? 这样的约束对于定义的健壮性似乎是必要的。

语法proto2:

 message SearchRequest { required string query = 1; optional int32 page_number = 2; optional int32 result_per_page = 3; } 

语法proto3:

 syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } 

required的有用性一直是许多辩论和火焰战争的核心。 双方都有大型的营地。 一个营地喜欢保证价值的存在,并愿意忍受它的限制,但是另一个营地感到required危险或无益,因为它不能安全地添加或移除。

让我更详细地解释为什么required使用required字段。 如果你已经使用了proto,你不能添加一个必须的字段,因为旧的应用程序不会提供这个字段,一般的应用程序不能很好地处理这个失败。 你可以确保所有旧的应用程序都是先升级的,但是很容易犯这个错误,如果你在任何数据存储中存储原型(甚至是短暂的,比如memcached)都没有帮助。 删除必填字段时也适用同样的情况。

许多必要的领域“显然”需要,直到他们不是。 假设你有一个Get方法的id字段。 这显然是必需的。 除此之外,您可能需要将id从int更改为string,或将int32更改为int64。 这需要添加一个新的muchBetterId字段,现在你剩下的旧id字段必须指定,但最终被完全忽略。

当这两个问题结合起来的时候,有益的required领域的数量就会变得有限,营地会争论它是否还有价值。 所required的反对者并不一定反对这个想法,而是反对其目前的forms。 一些人build议开发一个更富有performance力的validation库,可以检查所required更高级的东西,比如name.length > 10 ,同时也确保有一个更好的故障模型。

整体而言,Proto3似乎偏爱简单,并且required移除更简单。 但是也许更令人信服的是,当proto3与其他function结合使用时,对于proto3的移除是非常有意义的,例如删除原始字段和删除覆盖默认值。

我不是一个protobuf的开发者,在这方面绝对没有权威性,但是我仍然希望这个解释是有用的。