我们有一个C ++解决方案(VC ++ 2005),它广泛使用第三方映射库。我们正在创建包装器库,以便我们可以在我们的解决方案中使用替代映射库,而无需为每个重写它 - 每个包装器库具有相同的API但包装不同的第三方映射库。
我们正在以迭代的方式执行此操作,并且我想知道如何确保在将类从使用特定的映射lib重构为使用包装器时,所有的使用/引用都会更新。根据定义,许多包装类可以与包装的库类进行互操作,因此我们很容易错过将MapXYZ :: Attribute的一个实例更新为OurMaps :: Attribute,直到我们切换映射库时它才会工作。
是否有可以为这种情况建议的工具或流程?
答案 0 :(得分:2)
首先,如果包装器与包装类可互操作,并不意味着它们是可交换的。因此,为了确保您不会意外地使用原始库的类,只需删除任何引用其标题的#include
。您的编译器会抱怨使用原始类及其成员。注意:你不会将这些heaers包含在你的包装器lib的头文件中,否则抽象就会泄漏并且替换当前的库是不可能的。
此外,对于您的包装器,您不应过于贴近您一直使用的库的API,因为其他库可能不提供类似的方法和属性。相反,根据您使用的基本概念定义包装器API,并且您将来可能使用的任何库都必须以这种或那种方式提供。这意味着,API不应该与某个特定的第三方库提供的内容类似,而应该显示您需要的内容。换句话说,API提供您的语言的动词和名词,以您的方式来描述问题域,并且包装类会将其转换为语言包裹的图书馆
这样你就可以对你的代码中的映射库进行简洁的抽象,尽管你必须重构它,整理你必须用来使第三方lib工作的曲柄和螺栓,而不是仅仅替换{{1} } class ThirdPartyX
。