[英]Advice on wrapping third party libraries
我已經在一家公司的計算機視覺部門工作了一年,擔任軟件開發人員。 我的主要工作是將第三方軟件集成到框架中,所以我通常最終會編寫包裝器庫,因為很多此類第三方軟件無法按我們希望的方式工作(線程安全,痛苦,* *使用等)。
通常,我只是包裝整個庫,並通過互斥來保護對庫的調用(某種程度上,線程安全是大多數extern庫的主要問題)。 我真的很喜歡這樣做,因為它會使您陷入很多有趣的情況,並且您會看到很多有趣的代碼。 但是我經常認為我做得不好,或者我的實現不是很好。 我覺得我缺乏某種如何正確地做這類事情的設計知識。
基本上,我想知道是否有關於設計正確的“破碎的API之上的API”的良好指南或提示,或者這總是很黑且丑陋。
前幾天,我將在這里引用另一個問題的答案 :
如果是,請繼續做您正在做的事情。
作為備選
只要確保您的新API既包含預期的功能,又包含原始功能的常規或偶然功能即可。 還要確保它呈現“適合目的”的重新表示。 看看FOSS項目中C庫的C ++包裝,例如GTK / GTK for C ++(僅包裝前者)。
如果API損壞,請對其進行修復並提交補丁...介入第三方(我假設可以訪問源意味着他們不介意此事)...您可以重寫其中的一些內容API是“包裝友好的”,並建議它們合並一些更改。 如果有問題,請先解決。
沒什么大不了的,只需用B包裹A並確保B做到了A的預期或用途。
我可以添加到艾登的回復中的唯一一件事是,您還應該考慮使用RAII技術替換需要顯式初始化和終止的代碼。 當我面對提供有關API的外觀時,我似乎總是碰到一個看起來像這樣的類:
struct ADVERTISER {
/* a bunch of members here */
};
void adv_Initialize(ADVERTISER *adv, /* a bunch of arguments */);
void adv_DoStuff(ADVERTISER *adv);
void adv_Terminate(ADVERTISER *adv);
我已經看到它以下列方式包裝在C ++類中:
namespace wrapper {
class Advertiser {
public:
Advertiser(): inited_(false) {}
void initialize(/* a bunch of arguments */) {
terminate();
adv_Initialize(&adv_, ...);
inited_ = true;
}
void doStuff() {
validate();
adv_DoStuff(&adv_);
}
void terminate() {
if (inited_) {
adv_Terminate(&adv_);
inited_ = false;
}
}
protected:
void validate() {
if (!inited_) {
throw std::runtime_error("instance is not valid");
}
}
private:
ADVERTISER adv_;
bool inited_;
};
}
問題在於Advertiser
類實際上並沒有使API變得更易於使用甚至更清潔 。 如果遇到這種情況,則:
我的目標是確保我呈現/創建/包裝的任何API都可以使用我們現有的編碼風格。 我還嘗試將API彎曲成比當前可能更多的OO樣式。我已經看到了許多我稱為面向對象的C,就像我上面介紹的那樣。 如果您想使它們真正適合C ++,那么就使它們真正成為面向對象的,並利用C ++給您的好處:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.