2008-09-02 107 views
3

在C++中,沒有事實上的標準日誌記錄工具。根據我的經驗,店鋪推出自己的產品。但是,當嘗試創建可重用的軟件組件時,會產生一些問題。如果系統中的所有內容都依賴於日誌記錄組件,那麼這會使軟件的可重用性降低,基本上迫使任何下游項目都將日誌框架與他們真正想要的組件結合在一起。C++日誌框架會犧牲可重用性嗎?

IOC(依賴注入)並不真正幫助解決問題,因爲您的組件需要依賴於日誌抽象。記錄組件本身可以添加對文件I/O的依賴關係,觸發機制以及其他可能不需要的依賴關係。

是否向您的專有日誌記錄框架添加依賴項會犧牲組件的可重用性?

回答

5

是的。但是依賴注入將有助於這種情況。

您可以創建一個抽象日誌記錄基類,併爲要使用的日誌記錄框架創建實現。你的組件只依賴於抽象基類。並且根據需要將實現和它們的依賴關係一起注入。

+0

+1,我自己在這個確切的情況下,我的項目的主要實現有一個抽象的日誌框架,記錄我想要的附加信息......但它使用的庫也有一個(不同的)日誌框架,但幸運的是,幸運的是,他們也期望一個封裝框架的對象被傳入...所以我建立一個對象,按照我當前的日誌框架實現它,然後離開我去! – Arafangion 2010-12-03 12:55:06

1

是的,Mendelt是對的。我們在我們的產品中正是這樣做的。一切都依賴於ILogger抽象接口,但它不依賴於其他任何東西。通常,可執行文件或高級DLL將構建一個實際的Logger接口並注入它。

0

如果您正在尋找構建不會重新編譯的庫,但想提供一個日誌記錄界面,那麼可能一個好方法是允許(庫的)用戶提供回調。

在初始化您的庫的日誌記錄時,他們需要指定回調,然後膠水代碼由他們決定,以使其與任何他們所擁有的一樣。

如果您可以使回調的簽名看起來像一個標準功能,他們可能總是可以使用它們,但如果他們實際上沒有記錄器,它將爲他們提供一個簡單的默認選項。

此外,調用者可能多次從庫中獲取實例化組件,並且對於資源爭用或線程問題,希望爲每個提供不同的記錄器回調。