2010-12-14 40 views
1

所以我一直在試圖圍繞xerces XML庫創建一些類,以便從其餘的項目中'隱藏'它的基礎xml庫保持獨立於我的其餘部分項目。用於XML庫的C++'包裝類'

這應該是一個相當簡單的任務,但是通過編寫一些類來隱藏某個庫的其餘部分似乎完全不可能。

我得到了錯誤的方法,還是我的'包裝'的想法完全愚蠢?

我結束了這樣的事情:

DOMElement* root(); //in my 'wrapper' class, however this DOMElement is part of the xerces library, at this point my 'wrapper' is broken. Now I have to use the xerces library everywhere I want to use this function. 

哪裏是我的思維出了問題?

+0

你在用XML做什麼?我想問的原因是這樣的,而不是包裝XML庫並將包裝類暴露給您的代碼,爲什麼不實現一個更簡單的對象模型來存儲您在XML中存儲的內容並公開它 - 然後有一個乾淨的接口可以保持/從XML中提取該對象模型? – Nim 2010-12-14 08:43:01

+0

@Nim,XML用於通過網絡連接與客戶端進行通信。它將XML字符串保留爲xml的某種「格式」,我只需要在獲取請求時將其分開,並將其與答案放在一起。 – 2010-12-14 08:44:55

+0

所以我會說它在整個項目中的角色並不是很大,但它仍然必須在那裏,因爲我無法改變客戶端的東西。 – 2010-12-14 08:45:39

回答

1

我會建議在第一階段避免包裝。只要確保圖層及其邊框清晰,即網絡層負責序列化/反序列化XML,並從那裏只使用內部類型。如果你這樣做,並且在稍後階段,你需要用任何其他庫替換xerces,只需要替換序列化層即可。也就是說,不是包裝每個XML對象,而是包裝整個操作:serialize/deserialize

1

如果您有計劃更改或有可能更改正在使用的庫,那麼爲庫編寫自己的抽象接口並不是一個愚蠢的想法。

你不應該依賴你的庫對象來實現你的包裝接口。實現您自己的結構和您自己的功能界面。當你想要改變xml的實現方式時(例如:更改庫),它將減輕很多工作量。實施

一個例子:

class XmlElement 
{ 
    private: 
    DOMElement element; // point to the element of your library 

    public: 
    // Here you define how its public interface. 
    // There should be enough method/parameter to interact 
    // with any xml interface you will use in the future 
    XmlElement getSubElement(param) 
    { 
     // Create the Xmlelement 
     // Set the DOMElement wanted 
     // return it 
    } 
} 

在程序中您將看到:

void function() 
{ 
    XmlElement root(); 
    root.getSubElement("value"); // for example 
} 

就像沒有一個DOMElement或它們的功能出現在項目中。

+0

這種方法的缺點是你可能最終包裝很多類並重新實現許多簡單地委託你存儲的方法 - 所以對於你的XmlElement,現在你必須重新實現DOMElement存取器方法 - 似乎是浪費時間給我..特別。如果下線,xml線格式將被丟棄,並且您使用不同的消息格式! – Nim 2010-12-14 09:04:42

+0

我同意你的意見。但是,重新實現DOMElement訪問器方法是封裝者爲了隱藏其實現而應該做的事情。這也是爲什麼我在這個主題的開頭部分指出,只有在他打算改變背後的圖書館時才應該使用它。你如何實現它取決於你(我的例子可能不是最好的,它可以使用你描述的系統......)。但是包裝界面必須明確定義。 – Phong 2010-12-14 10:21:43

1

正如我在我的評論中提到的,我會採取稍微不同的方法。我不希望我的代碼庫依賴於我正在使用的特定消息傳遞格式(xml)(例如,如果您決定稍後將xml更改爲其他內容?),而是使用定義良好的對象模型並擁有一個簡單的編碼器/解碼器來處理轉換爲XML字符串,反之亦然。如果底層線路格式發生變化,那麼這個編碼/解碼器將成爲我將要替換的那個位。

解碼器將從套接字中讀取數據並生成一個合適的對象(用嵌套對象來表示請求),解碼器將採用一個類似的對象並從中生成XML。如果性能不是主要問題,我會使用像TinyXML這樣的庫,它非常輕便 - 你可以將它剝離得更細,並且使其更加輕便...

+0

+1:我工作時我們稱之爲編碼器和解碼器「適配器」,解碼器的作用是在輸入中獲取一些數據並建立一個BOM,如果編寫得很好,它會完全隔離其餘的代碼(我們通常有一個解碼器接口)。關於TinyXML:TiCpp是TinyXML上的C++包裝器,並且提供了一個很好的C++接口:http://ticpp.googlecode.com/svn/docs/ticpp.html – 2010-12-14 09:39:28