首先创建一个新的API,它可以实现您希望的新API行为。如果碰巧这个新的API与OLDER API具有相同的名称,那么我将名称_NEW附加到新的API名称中。
int DoSomethingInterestingAPI();
变成:
int DoSomethingInterestingAPI_NEW(int take_more_arguments); int DoSomethingInterestingAPI_OLD(); int DoSomethingInterestingAPI(){DoSomethingInterestingAPI_NEW(whatever_default_mimics_the_old_API); 好的-在这个阶段-您所有的回归测试都通过-使用名称DoSomethingInterestingAPI()。
下一步,遍历您的代码,并将对DoSomethingInterestingAPI()的所有调用更改为DoSomethingInterestingAPI_NEW()的相应变体。这包括更新/重写需要更改回归测试的任何部分才能使用新的API。
接下来,将DoSomethingInterestingAPI_OLD()标记为[[deprecated()]]。只要您愿意,就保留不推荐使用的API(直到您安全地更新了可能依赖该API的所有代码)。
使用这种方法,您的回归测试中的任何失败都只是该回归测试中的错误,或者恰恰是您想要的,可以识别代码中的错误。通过显式创建API的_NEW和_OLD版本修改API的分阶段过程,使您可以将新代码和旧代码的一部分同时存在。
这是实践中这种方法的一个好(硬)示例。我有功能BitSubstring()-在这里我使用了让第三个参数是子字符串中的COUNT位的方法。为了与C ++中的其他API和模式保持一致,我想切换为以该函数的参数开头/结尾。
https://github.com/SophistSolutions/Stroika/commit/003dd8707405c43e735ca71116c773b108c217c0
我使用新的API创建了一个函数BitSubstring_NEW,并更新了所有代码以使用该函数(不再给BitSubString打电话)。但是我在实现中留下了数个版本(数月)-并将其标记为已弃用-这样每个人都可以切换到BitSubString_NEW(并且那时将参数从count更改为begin / end样式)。
然后-当该转换完成时,我做了另一个提交,删除了BitSubString()并重命名了BitSubString_NEW-> BitSubString()(并弃用了名称BitSubString_NEW)。