Protocol buffers 如何在protobuf中实现一个真正可选的字段?
我有一个原型,描述了一个可能每月、每年或在特定日期发生的事件。其基本结构是:Protocol buffers 如何在protobuf中实现一个真正可选的字段?,protocol-buffers,Protocol Buffers,我有一个原型,描述了一个可能每月、每年或在特定日期发生的事件。其基本结构是: enum PeriodType { MONTHLY = 1; YEARLY = 2; SPECIFIC_DATE = 3; } message Event { PeriodType period_type = 1; ... } 但是应该有一种方法来指定发生的日期。因此,我制作了以下原型: message Event { PeriodType period_type = 1; Date p
enum PeriodType {
MONTHLY = 1;
YEARLY = 2;
SPECIFIC_DATE = 3;
}
message Event {
PeriodType period_type = 1;
...
}
但是应该有一种方法来指定发生的日期。因此,我制作了以下原型:
message Event {
PeriodType period_type = 1;
Date period_specific_date = 2;
...
}
该解决方案在我们的内部代码审查期间被禁止。原因是“proto不应包含仅在另一个字段中有特定值时使用的字段”。我需要以某种方式重写它,这样当event
具有period\u type==MONTHLY
时,就不可能调用event.getPeriodSpecificDate()
。我该怎么做
一个可能的解决方案是这样做:
message Event {
message Period {
PeriodType period_type = 1;
}
message PeriodWithDate {
Period period = 1;
Date period_specific_date = 2;
}
oneof period {
Period period_without_date = 1;
PeriodWithDate period_with_date = 2;
}
...
}
但这并不能真正解决问题,看起来是一种可怕的过度杀伤力。还有其他方法吗?如果给定了日期,则实际上不需要PeriodType。 所以你可以这样做:
enum RegularPeriod
{
MONTHLY = 1;
YEARLY = 2;
}
oneof period
{
RegularPeriod regular = 1;
Date specific_date = 2;
}
该解决方案在我们的内部代码审查期间被禁止。原因是“proto不应包含仅在另一个字段中有特定值时使用的字段”
告诉你的评论者我是Protocol Buffers v2的作者,我认为这个规则是不现实的。虽然强制执行类型系统中的所有内容是很有诱惑力的,但实际上Protobuf类型系统的表现力远远不够,无法制定这种硬规则。事实上,在实际使用中,通常会有带有文档化约束的字段,比如“只有字段X的值为Y时,该字段才应该存在”,这很正常
话虽如此,@jpa的回答在这个特殊的案例中是合理的。它有一个折衷办法:现在代码中会有多个级别的分支,这可能很难看,如果协议变得更复杂,可能会变得更难看。但它确实能够表达类型系统中的所有约束
(不要接受我的回答,接受@jpa)问问在代码审查中禁止它的人?谢谢你的澄清!在我的情况下,经过讨论,我们回到了“禁止”的变体,我绝对推荐给任何有相同要求的人。但你的解决方案是对原始问题的极好回答