为了最大限度地提高跨语言兼容性,推荐的Thrift标识符命名约定是什么?

本文关键字:Thrift 标识符 命名约定 是什么 最大限度 高跨 兼容性 语言 | 更新日期: 2023-09-27 17:53:57

有没有推荐的标识符命名约定?

例如,我们有一个通常是c#程序员编写的Thrift IDL。由此生成的源代码可以在c#和Python中工作。然而,尽管Java代码可以从同一个Thrift文件生成,但是到处都有Java编译器错误,IDL的作者给出了与其类型完全相同的标识符名称。例如:

enum DataType {
    Text,
    Integer
}
struct Metadata {
    1: string ColumnName,
    2: DataType DataType
}

注意'DataType'标识符与其类型具有相同的名称,包括大小写。生成的Java代码(使用--gen java Thrift编译器选项)有如下编译器错误:

Cannot make a static reference to the non-static field DataType

我自己不是c#程序员,但我理解以大写字母开始标识符名称在c#中是相当普遍的做法。就目前情况而言,我们将不得不更改IDL以使用小写的标识符名称(例如,DataType dataType)并重新生成所有客户端;但是如果有一些关于Thrift标识符命名约定的建议,那么我们就不会在其他语言中遇到类似的问题了。

顺便说一句,我确实尝试了--gen java:nocamel,但这并没有解决问题。

为了最大限度地提高跨语言兼容性,推荐的Thrift标识符命名约定是什么?

除了标识符和编译器告诉您的常规规则外,没有强制或官方推荐的命名约定。尽管许多已知的冲突已经应用了某种解决方法,但是仍然存在很多冲突的可能性。你必须找出什么对你有用。

最好的选择是在IDL文件中重命名冲突字段,或者添加下划线。对于RPC和序列化,字段名无关紧要,只有字段ID才重要。因此,重命名字段不会破坏对-á-vis序列化数据的兼容性,只会破坏源代码,这是一个可修复的事情。


编辑:这是一个很好的命名问题的例子,仍然是开放的。由于问题的性质,它只表现为一种非常特定的语言:Go。只要您坚持使用Thrift支持的任何其他语言,就永远不会遇到使用该IDL的麻烦。然而,像这样的事情应该修复。