2011-01-17 4 views
2

これはJava固有の質問ではなく設計上の質問ですが、私はJava用に設計しています。StAX解析のクラスを設計する

カスタムXMLレスポンスを処理するためのXMLプル解析クラスをいくつか作成していますが、設計時には何か良いものがあるかどうかは考えられません。たぶん誰かがそれのためのデザインパターンを持っているかもしれません。

だから、ここに私のXMLは次のように見えるかもしれものです:だからRequestId(種類のキー)に応じて、Body要素が異なる

<ResponseRoot> 
    <Header> 
    <RequestId /> 
    <OtherHeaderMetaData /> 
    </Header> 
    <Body> 
    ... 
    <!-- Lots of other elements and nested elements --> 
    ... 
    </Body> 
</ResponseRoot> 

。これがプル構文解析であることを考えると、大きなswitch文とif-else-ifブロックがたくさんあるでしょう。

多くの静的メソッドを持つ1つのクラスがXMLストリーム全体を処理する方が効率的でしょうか、より良い設計で各クラスの責任を負うようにしますか?RequestId? 私はBodyをヒットしたときに、適切なサブパーサーを取得するためにファクトリを使用します。その工場では、Classインスタンスのマッピングを使用して、リフレクションを使用して適切なパーサーをインスタンス化することもできます(すべてのパーサーが常に必要なわけではないため)。それとも...、私はあまりにも深く考えています、

いや...使用反射が方法代わりに適切な静的解析をつかむために、私は本当にわずか1ユースクラスであるパー​​サーをインスタンス化する必要はありませんこれは個人的なプロジェクトなので、StAXパーサーの解析クラスをどのように設計するのかが不思議です。

答えて

4

したがって、RequestId(ソートのキー)によってBody要素が異なります。

有効なbody elemtがrequest-IDに依存しないようにXMLを再設計できますが、周囲のレスポンス要素によって完全に決定されますか?次に、文書の正当性(DTDへの適合)は、メッセージ応答の有効性に対応する。

switchステートメントを使用する代わりに、state design patternを使用することを検討してください。つまり、ドキュメントハンドラを有限状態マシンとして実装します。

2

リクエストタイプごとに別々のプロセッサクラスを用意しています。あなたの工場のアプローチは良いと思うが、反射物には気を使わず、反射を使わずにこれらのプロセッサーオブジェクトを作成するだけで、30バイトのヒープスペースは読みやすいコードにとって非常に妥当な価格です。

StAXでは重要なことですが、すべての処理メソッドのドキュメントでは、そのメソッドが入力を期待している状態を記述する必要があります(例:オープニング<body>タグを処理した前後)。処理後に入力を残します。このようにして、時間を節約できます。

1

各カスタムXMLオブジェクトをStAXパーサーに解析するのではなく、StAXパーサーがXMLオブジェクトの中間表現を作成するのはなぜですか?次に、RequestIDを使用してXMLオブジェクトの最終表現を作成するファクトリを作成できます。コードは次のようになります。

IntermediateObject io = StAX.parse(XML); 
FinalObject = Factory.create(io.getRequestID, io); 

このアプローチを使用することの利点は、責任を分けることです。 StAXパーサーはXMLを解析するだけですが、工場はその情報を使用してさらに処理する責任があります。

関連する問題