2010-12-14 24 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