节俭一代变量意外改变
Thrift generation variables unexpectedly change
作为背景,我在 RHEL7 上使用 thrift 版本 0.9.3 生成 C++。
最近向现有的 thrift 文件添加了一个新函数。
当从 thrift 生成 cpp 文件并将新生成的文件与现有的旧文件进行比较时,我注意到
较新的代码更改了部分代码,对我来说,更改没有意义(即没有新的实现,只是变量名称更改为现有代码)。
思考过程可能与新功能有关。
所以为了说服自己这只是因为新功能,我再次生成文件,没有功能(基本上使用以前的
thrift 文件的版本)。同样,更改保持不变。
澄清一下,在现有的 cpp 文件中有一段这样的代码:
uint32_t _size79;
::apache::thrift::protocol::TType _etype82;
xfer += iprot->readListBegin(_etype82, _size79);
(*(this->success)).resize(_size79);
而较新的结果(有或没有新功能)会将变量更改为:
uint32_t _size86;
::apache::thrift::protocol::TType _etype89;
xfer += iprot->readListBegin(_etype89, _size86);
(*(this->success)).resize(_size86);
现在我知道你不应该试图挑剔节俭产生的东西,但是什么可能导致这种情况发生?
我浏览了白皮书和其他一些地方,试图弄清楚为什么会发生这样的随机变化,但没弄明白多少。
我希望能够说,“这没关系,因为这个特定的过程,有时这是意料之中的……”。我觉得这些变量应该保持一致,因为它们来自同一个 thrift 文件,同一个 thrift 编译器版本,尽管生成时间相隔几个月。
谢谢。希望我只是错过了一个概念。
uint32_t _size79;
生成代码中的内部变量是由接受前缀并向其添加数字的算法创建的。数字每次都会增加。这就是技术解释。
不过,你不应该关心它。
请注意,以下内容适用于您作为软件开发人员将在余生中调用或使用的任何类型的功能或API。
纯内部 变量的使用方式对于该例程之外的任何代码段都没有意义。这虽然不是encapsulation in the OOP sense,但多少有点可比性。特定函数的调用代码(或它调用的代码)需要知道的任何内容都在方法签名和任何相关文档中。
I've gone through the white paper, and a few other places to try and figure out why random changes like this would happen, but couldn't figure out much.
换句话说,这是未记录的行为。 internal 实现细节通常没有记录的原因是为了防止任何人依赖它,并可能在它的基础上进行构建。关于封装的整个想法是有意隐藏这些细节。这允许随时更改实现而不影响或破坏它之外的任何代码。
这也是为什么依赖未记录的东西是一把双刃剑的原因:它允许更大的灵活性,但这种力量是以冒与未来版本兼容的风险为代价的,甚至是次要的修补程序更新。
Part of me feels like these variables should have stayed consistent given that they came from the same thrift file, same thrift compiler version, though generated a few months apart.
产生这种感觉的原因是假设您必须知道(并关心)内部发生的事情。这个假设是不正确的。假装这个方法是一个黑盒子:你甚至不会注意到变量名已经改变了。这会改变调用或使用它的代码吗?
作为背景,我在 RHEL7 上使用 thrift 版本 0.9.3 生成 C++。 最近向现有的 thrift 文件添加了一个新函数。 当从 thrift 生成 cpp 文件并将新生成的文件与现有的旧文件进行比较时,我注意到 较新的代码更改了部分代码,对我来说,更改没有意义(即没有新的实现,只是变量名称更改为现有代码)。 思考过程可能与新功能有关。 所以为了说服自己这只是因为新功能,我再次生成文件,没有功能(基本上使用以前的 thrift 文件的版本)。同样,更改保持不变。
澄清一下,在现有的 cpp 文件中有一段这样的代码:
uint32_t _size79;
::apache::thrift::protocol::TType _etype82;
xfer += iprot->readListBegin(_etype82, _size79);
(*(this->success)).resize(_size79);
而较新的结果(有或没有新功能)会将变量更改为:
uint32_t _size86;
::apache::thrift::protocol::TType _etype89;
xfer += iprot->readListBegin(_etype89, _size86);
(*(this->success)).resize(_size86);
现在我知道你不应该试图挑剔节俭产生的东西,但是什么可能导致这种情况发生? 我浏览了白皮书和其他一些地方,试图弄清楚为什么会发生这样的随机变化,但没弄明白多少。 我希望能够说,“这没关系,因为这个特定的过程,有时这是意料之中的……”。我觉得这些变量应该保持一致,因为它们来自同一个 thrift 文件,同一个 thrift 编译器版本,尽管生成时间相隔几个月。
谢谢。希望我只是错过了一个概念。
uint32_t _size79;
生成代码中的内部变量是由接受前缀并向其添加数字的算法创建的。数字每次都会增加。这就是技术解释。
不过,你不应该关心它。
请注意,以下内容适用于您作为软件开发人员将在余生中调用或使用的任何类型的功能或API。
纯内部 变量的使用方式对于该例程之外的任何代码段都没有意义。这虽然不是encapsulation in the OOP sense,但多少有点可比性。特定函数的调用代码(或它调用的代码)需要知道的任何内容都在方法签名和任何相关文档中。
I've gone through the white paper, and a few other places to try and figure out why random changes like this would happen, but couldn't figure out much.
换句话说,这是未记录的行为。 internal 实现细节通常没有记录的原因是为了防止任何人依赖它,并可能在它的基础上进行构建。关于封装的整个想法是有意隐藏这些细节。这允许随时更改实现而不影响或破坏它之外的任何代码。
这也是为什么依赖未记录的东西是一把双刃剑的原因:它允许更大的灵活性,但这种力量是以冒与未来版本兼容的风险为代价的,甚至是次要的修补程序更新。
Part of me feels like these variables should have stayed consistent given that they came from the same thrift file, same thrift compiler version, though generated a few months apart.
产生这种感觉的原因是假设您必须知道(并关心)内部发生的事情。这个假设是不正确的。假装这个方法是一个黑盒子:你甚至不会注意到变量名已经改变了。这会改变调用或使用它的代码吗?