簡體   English   中英

包裝第三方庫的建議

[英]Advice on wrapping third party libraries

我已經在一家公司的計算機視覺部門工作了一年,擔任軟件開發人員。 我的主要工作是將第三方軟件集成到框架中,所以我通常最終會編寫包裝器庫,因為很多此類第三方軟件無法按我們希望的方式工作(線程安全,痛苦,* *使用等)。

通常,我只是包裝整個庫,並通過互斥來保護對庫的調用(某種程度上,線程安全是大多數extern庫的主要問題)。 我真的很喜歡這樣做,因為它會使您陷入很多有趣的情況,並且您會看到很多有趣的代碼。 但是我經常認為我做得不好,或者我的實現不是很好。 我覺得我缺乏某種如何正確地做這類事情的設計知識。

基本上,我想知道是否有關於設計正確的“破碎的API之上的API”的良好指南或提示,或者這總是很黑且丑陋。

前幾天,我將在這里引用另一個問題的答案

  1. 您當前的方法是否通過測試?
  2. 夠快嗎?

如果是,請繼續做您正在做的事情。

作為備選

只要確保您的新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變得更易於使用甚至更清潔 如果遇到這種情況,則:

  1. 使用完全參數化的構造函數以確保無效實例不存在
  2. 清理析構函數中的所有資源
  3. 如果有意義, 將其設為私有並且不實現它們,請編寫一個復制構造函數和賦值運算符。

我的目標是確保我呈現/創建/包裝的任何API都可以使用我們現有的編碼風格。 我還嘗試將API彎曲成比當前可能更多的OO樣式。我已經看到了許多我稱為面向對象的C,就像我上面介紹的那樣。 如果您想使它們真正適合C ++,那么就使它們真正成為面向對象的,並利用C ++給您的好處:

  • 小心管理任何狀態變量。
  • 如果像復制這樣的操作沒有意義,請隱藏它們。
  • 如果有可能泄漏資源,請找到某種方法防止它發生(通常使用RAII會有所幫助)。
  • 使用構造函數限制實例的創建,以消除無效實例和其他邊緣情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM