我对@TomalakGeretkal投了一份关于合同的好记录; 我还没有接受答案,因为我的问题是如何以编程方式检查equals函数.
我有一个POD结构和一个相等运算符,一个(非常)一小部分系统,有> 100名工程师.
随着时间的推移,我希望修改结构(成员添加/删除/重新排序),我想编写一个测试来验证相等操作是否正在测试结构的每个成员(例如,随着结构的变化保持最新).
正如Tomalak指出的那样 - 评论和"按合同"通常是执行此操作的最佳/唯一方式; 但是在我的情况下,我期待问题,并希望探索是否有任何方法可以主动捕获(至少很多)修改.
我没有得到满意的答案 - 这是我想到的最好的答案:
-new up two instances struct (x, y), fill each with identical non-zero data.
-check x==y
-modify x "byte by byte"
-take ptr to be (unsigned char*)&x
-iterator over ptr (for sizeof(x))
-increment the current byte
-check !(x==y)
-decrement the current byte
-check x==y
Run Code Online (Sandbox Code Playgroud)
如果相等运算符捕获了每个字节,则测试通过(注意:对此有一个警告 - 并非所有字节都在x的编译器表示中使用,因此测试必须'跳过'这些字节 - 例如硬编码忽略字节)
我提议的测试存在重大问题:(至少)'不关心'字节,以及增加x中类型的一个字节的事实可能不会导致该存储器位置处的变量的有效值.
更好的解决方案?
(这应该没关系,但我使用VS2008,rtti关闭,googletest套件)
虽然很容易通过像这样的自我检查来使代码"傻瓜式",但我的经验是,保持自我检查本身是万无一失的,这是一个傻瓜的差事.
保持简单并本地化任何更改的效果.在结构定义中写一条注释,清楚表明如果结构是,则必须更新相等运算符; 那么,如果失败了,那只是程序员的错.
我知道这对你来说似乎不是最佳的,因为它在将来会留下用户错误的可能性,但实际上你无法解决这个问题(至少没有让你的代码变得非常复杂),而且通常它是最实用的麻烦.
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |