2010-12-14 25 views
1

xerces XMLライブラリのいくつかのクラスを作成しようとしていたので、残りのプロジェクトから隠すことができるようになりました。プロジェクト。XMLライブラリのC++ 'wrapper class'

これはかなり簡単な作業だと思われましたが、ライブラリをいくつかのクラスを作成して残りのプロジェクトから隠すことは全く不可能です。

私は間違ったアプローチをしていますか、私の「ラッパー」アイデアは完全に愚かですか?

私はこのようなもので終わる:私の考えが間違っている

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

+0

@ニムのXMLは、ネットワーク接続を介してクライアントと通信するために使用されます。 XML文字列をxmlの特定の '形式'に維持しています。要求を取得して解答と一緒に入れておくだけです。 –

+0

だから私は、プロジェクト全体の役割はそれほど大きくないと言いたいと思いますが、クライアントの側を変更することはできないので、まだそこにいなければなりません。 –

答えて

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 
    } 
} 

はあなたが表示されます。それなしDOMElementのか、その関数のよう

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

は、プロジェクトに表示されます。

+0

このアプローチの欠点は、潜在的に多くのクラスをラップし、格納しているものに単純に委譲するメソッドを再実装することです。そのため、XmlElementではDOMElementアクセサメソッドを再実装する必要があります。私に時間の無駄です。 xmlのワイヤー形式が破棄され、別のメッセージング形式を使用している場合、 – Nim

+0

私はあなたに同意します。しかし、DOMElementアクセサメソッドを再実装することは、実装を隠すためにラッパーが行うことです。これはまた、トピックの最初に、ライブラリの後ろにあるライブラリを変更する予定がある場合にのみ使用する必要があることを指定した理由です。それをどのように実装するかはあなた次第です(私の例は最高ではないかもしれません、あなたが記述するシステムを使用することができます...)。しかし、ラッパーインターフェースは明確に定義されていなければなりません。 – Phong

1

私のコメントで言及したように、私は少し異なるアプローチをとるだろう。私は自分のコードベースが私が使用している特定のメッセージングフォーマット(xml)に依存することを望んでいません(たとえば、xmlを後で別のものに変更することを決めた場合はどうすればいいでしょうか?)代わりに私はよく定義されたオブジェクトモデルで作業し、 XML文字列への変換を処理するための単純なエンコーダ/デコーダ、逆もまた同様です。このエンコード/デコーダーは、元のワイヤー形式が変更された場合に置き換えるビットになります。

デコーダはソケットから読み込まれたデータを取り込み、適切なオブジェクト(要求を表すオブジェクトがネストされています)を生成し、デコーダは同様のオブジェクトを取得し、そのオブジェクトからXMLを生成します。パフォーマンスが第一の関心事でない場合は、TinyXMLなどのライブラリを使用します.TinyXMLは非常に軽量ですが、これをさらに薄くして軽量化することができます。

+0

+1:私はエンコーダとデコーダを "アダプタ"と呼んでいますが、デコーダの役割はデータを入力してBOMを構築し、それ以外のコードを完全に絶縁することですデコーダインタフェースを有する)。 TinyXMLについて:TiCppはTinyXML上のC++ラッパーであり、素晴らしいC++インターフェイスを提供しています:http://ticpp.googlecode.com/svn/docs/ticpp.html –

関連する問題