用包装器库替换库的使用

Replacing use of a library with a wrapper library

本文关键字:替换 包装      更新时间:2023-10-16

我们有一个c++解决方案(vc++ 2005),它广泛使用了第三方映射库。我们正在创建包装器库,这样我们就可以在我们的解决方案中使用替代的映射库,而不必为每个解决方案重写——每个包装器库具有相同的API,但封装了不同的第三方映射库。

我们以迭代的方式做这件事,我想知道我们如何确保当我们重构类时,从使用特定的映射库到使用包装器,所有的使用/引用都被更新了。根据定义,许多包装器类可以与包装的库类互操作,因此我们很容易错过将MapXYZ::Attribute的一个实例更新为OurMaps::Attribute,直到我们切换映射库,它才会正常工作。

对于这样的场景,是否有什么工具或过程可以被建议?

首先,如果包装器与被包装的类是可互操作的,这并不意味着它们是可交换的。因此,为了确保您不会意外使用原始库的类,只需删除引用其头文件的任何#include。你的编译器会抱怨任何原始类及其成员的使用。注意:你不能在包装器库的头文件中包含这些头文件,否则抽象将会泄漏,替换当前的库将是不可能的。

此外,对于您的包装器,您不应该过于依赖于您正在使用的库的API,因为其他库可能不会提供类似的方法和属性。相反,应该根据您使用的基本概念定义包装器API,并且您将来可能使用的任何库都必须以某种方式提供这些概念。这意味着,API不应该像某个特定的第三方库所提供的那样,而应该显示您所需要的。换句话说,API提供了您的语言的动词和名词,以思考问题的方式描述问题域,包装器类将其翻译成包装库的语言。这样,你将在你的代码中有一个清晰的映射库的抽象,尽管你将不得不重构它,消除你不得不使用的使第三方库工作的曲轴和bolts,而不是仅仅用class MyWrapperX替换class ThirdPartyX