Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protocol buffers 如何在protobuf中实现一个真正可选的字段?_Protocol Buffers - Fatal编程技术网

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)

问问在代码审查中禁止它的人?谢谢你的澄清!在我的情况下,经过讨论,我们回到了“禁止”的变体,我绝对推荐给任何有相同要求的人。但你的解决方案是对原始问题的极好回答