2011-07-08 4 views
1

2つの終端要素と1つの再帰的にネスト可能な要素を持つ簡単なXMLライクな文書形式を想定します。目的は、Java型システムを使用して文字列を作成し、 (構文的に有効な)文書を、Javaを使用してできる限りきれいに定義する必要があります。私は、クラスライブラリに隠すことができる基本クラスを想定しています。次に、個々のドキュメントの定義を可能な限り直感的ですっきりとさせるためです。 -CFGと一致する呼び出しパターンを定義するJavaイディオム

無視すると、一瞬、再帰的に入れ子式要素は、このコードは、1つに潜在的に実行可能なアプローチを表し: - 基本クラスとしてStaticDocumentを使用

public class StaticDocument { 
    private StringBuilder doc; 
    protected StaticDocument() {} 
    protected void nonNestedA() { doc.append("<A/>"); } 
    protected void nonNestedB() { doc.append("<B/>"); } 
    public String toString() { return doc.toString(); } 
} 

、それを記述するためにのみJavaを使用してドキュメントを定義することが可能であるが、それらの抽象的な構造。シーケンシャルAの組成とBの要素を持つ文書例: -

public class ExampleDocument extends StaticDocument 
{ 
    public ExampleDocument() 
    { 
    nonNestedA(); 
    nonNestedB(); 
    nonNestedA(); 
    } 
} 

物事はもう少し複雑な再帰的にネスト可能な要素を包含するように、このアプローチを拡張しようとすると....でC++私は、保護を使用した可能性があります取得Z要素を定義するStaticDocumentの内部クラスを作成し、次にExampleDocument内の囲むブロックを使用して、すべてがRAIIイディオム/パターンを使用してaと一致するようにしました。 C#では、私はIDisposableインターフェースを利用することができ、同様の目的で 'using'を使用することができます。もう一つの可能​​性は、引数をne​​stedZメソッドに渡して、その引数にZ要素で囲まれたドキュメントを生成するために実行するものをカプセル化することです...しかし、これはやや面倒です - 特にJava(6)ネームラムダ式。

[別名:XML用のJaxBのようなツールについて知っています... XMLファイルをjarファイルに埋め込むこともできますが、ここでの質問はより複雑な目的を達成することを目的としています。構造体]

だから最後に質問:このような問題に取り組むための最善の方法はJavaコミュニティの間で合意がありますか?目的は、文書の構築中に外来の中間オブジェクトを最小限にすること、および文書の構築をコンパクトで「自然な」もの(対応するXML文書に一致すると容易に認識できる)の両方でできるようにすることである。

私はいくつかの専門家の意見を聞くことに興味があるでしょう...そして/または関連記事へのポインタ。

答えて

0

ドメインオブジェクトを取得し、XStreamを使用してXMLにシリアル化するのはどうですか?

+0

XMLは単にここに投稿するための素敵な質問を構成するためのデバイスです... StaticDocumentの関数はExampleDocumentのイディオムの問題を示すためにここでXMLを生成します。 – aSteve

+0

「概念的な」ドメインオブジェクトはありますが、定義されたドメインオブジェクトから始めるわけではありません。オブジェクトの複雑なネストされた構造をシリアル化してガベージコレクションに残すだけでは面倒です。私は他の言語で共通のイディオムを使用してオーバーヘッドを持つことはありません。 – aSteve

2

builder design patternを使用して、希望の構造を表すfluent interfaceのネスト可能なビルダーを作成できます。

This examplesは、それらを使用してテストデータオブジェクトを作成します。しかしそれはあなたのシナリオにも当てはまります。

+0

私はビルダーパターンと流暢なインターフェースの両方に精通しています(そして私は両方とも経験したことがあります)。しかし、ネスティングのすべてのレベルに新しい「ビルダー」を導入するのは面倒だと感じているので、「入れ子式ビルダー」の考え方(私は明らかにうまくいくでしょう)には納得できません。私はそれが答えであることをうれしく思っていますが、それは「最良の」解決策ですか? – aSteve

+0

ビルダーは、完全にビルドされたオブジェクトではなく、他のビルダーになることができます。次に、すべてのネストされたビルダーを再帰的に構築する最後の 'build'を1回だけ呼び出すことができます。これはより美味しくなります。 –

関連する問題