2013-05-02 22 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