Thrift标识符的推荐命名约定是什么,以最大化跨语言兼容性?
在Thrift中,有没有推荐的命名规则呢?
举个例子,我们有一个Thrift IDL文件,是由一个通常写C#代码的人写的。用这个文件生成的源代码在C#和Python中都能正常工作。不过,虽然我们也可以从同一个Thrift文件生成Java代码,但在Java中却出现了很多编译错误,原因是IDL的作者给标识符(也就是变量名)起的名字和它们的类型完全一样。例如:
enum DataType {
Text,
Integer
}
struct Metadata {
1: string ColumnName,
2: DataType DataType
}
注意到'数据类型'这个标识符和它的类型名字是一样的,连大小写都一样。用--gen java
这个选项生成的Java代码出现了这样的编译错误:
Cannot make a static reference to the non-static field DataType
我自己不是C#程序员,但我知道在C#中,标识符的名字通常是以大写字母开头的。现在我们得把IDL改成用小写字母来命名标识符(比如说DataType dataType
),然后重新生成所有的客户端代码。如果在Thrift的命名规则上有一些建议,那就太好了,这样我们就不会在其他语言中遇到类似的问题了。
顺便说一下,我试过--gen java:nocamel
,但这个方法并没有解决问题。
1 个回答
2
其实没有什么强制的或者官方推荐的命名规则,除了常见的命名规则和你的编译器给出的提示。虽然已经有一些已知的冲突有了某种解决办法,但仍然有很多可能会发生冲突的情况。你需要找到适合自己的方法。
最简单的办法就是在IDL文件中直接重命名有冲突的字段,或者加个下划线。关于RPC(远程过程调用)和序列化,字段的名字其实并不重要,重要的是字段的ID。因此,重命名一个字段不会影响序列化的数据兼容性,只会影响源代码,但这可以修复。
补充说明:这里有一个很好的例子,是一个仍然存在的命名问题。由于问题的性质,这个问题只在一种特定的语言中出现:Go。如果你使用Thrift支持的其他语言,就不会遇到这个问题。不过,这种情况还是应该解决的。