2013-05-02 23 views
0

我们有一个C++解决方案(VC++ 2005),它广泛使用了第三方映射库。我们正在创建包装库,以便我们可以在解决方案中使用替代映射库,而无需为每个映射库重写 - 每个包装库都具有相同的API但封装了不同的第三方映射库。用包装库替换库的使用

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

是否有任何工具或流程可以为这种情况提供建议?

回答

2

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

此外,对于你的包装,你不应该太紧密地使用你所使用的库的API,因为其他库可能不提供类似的方法和属性。相反,根据您使用的基本概念来定义包装API,并且将来可能使用的任何库都必须提供这种或那种方法。这意味着,API不应该与特定的第三方库提供的内容相似,而应该显示您需要的内容。换句话说,API提供了语言的动词和名词,描述问题域的方式想到它,并且包装类将它转换为包装库的语言。
通过这种方式,您将在代码中获得映射库的简洁抽象,但您必须重构它,消除必须使用的曲柄和螺栓才能使第三方库工作,而不是仅仅通过替换class ThirdPartyXclass MyWrapperX

+0

如何定位包装库X的包装器库的特定实现_不包含X的头文件?例如如果我在STL和Win32上编写两个包装库,STL版本将不得不包含stl头文件或者它不会编译? – 2013-05-02 11:11:12

+0

仔细阅读 - 我没有说它不应该包含所有包装的lib头文件*,我说它不应该在它的头文件中包含它们*。当然,你必须将它们包含在源代码中,但将它包含在头文件中意味着你将它们间接包含在项目的其余部分中,从而消除封装类给出的主要好处:封装。 – 2013-05-02 12:59:11