web-dev-qa-db-ja.com

クラス数の減少と明示性

XML構造を操作および操作して他の情報を生成するアプリケーションを支援するために、XML構造に厳密に従うクラス構造を作成しました。

したがって、XMLは次のとおりです。

<document>
  <group attr1="thing">
    <title>Some group of things</title>

    <information>
      <content />
    </information>

    <detail attr2="flame">
      <title>Some detail</title>

      <content />
    </detail>

    <subgroup attr1="invisible">
      <title>A subgroup</title>

      <information>
        <content />
      </information>

      <detail attr2="mister">
        <content />
      </detail>
    </subgroup>

    ...
  </group>

  <group>
    <title>...</title>

    <information>
        <content />
    </information>

    <reference ref="elsewhere" />

    ...
  </group>

  ...
</document>

<reference>要素は、別のグループ/サブグループ内の一致する<detail>から取得する特殊なケースです。

ノードの標準インターフェースをほぼ特定しました。

interface iNode {
    getTitle();
    getAttr();
    getInformation();
    getNodes();
}

次に、次の4つのクラスに実装し、ファクトリを使用して、ドキュメントを解析するときに特定のXML DOM Node)を表すために使用するクラスを決定します。

class NodeGroup implements iNode {
    getTitle()        : return <title>
    getAttr()         : return @attr1
    getInformation()  : return <information>
    getNodes() : return <detail> | <subgroup> | <reference>    
}

class NodeSubGroup implements iNode {
    getTitle()        : return <title>
    getAttr()         : return @attr1
    getInformation()  : return <information>
    getNodes() : return <detail> | <subgroup> | <reference>    
}

class NodeDetail implements iNode {
    getTitle()        : return <title>
    getAttr()         : return @attr2
    getInformation()  : return child::*[not <title>]
    getNodes() : return none
}

class NodeReference implements iNode {
    getTitle()        : return (NodeDetail:getTitle())
    getAttr()         : return (NodeDetail:getAttr())
    getInformation()  : return (NodeDetail:getInformation())
    getNodes() : return none
}

これで、NodeGroupとNodeSubGroupの実装が同じであることは明らかです。したがって、共通の実装でスーパークラスを作成できると思いました。 NodeDetailでさえ、同じ方法でgetTitle()を実装するため(そして他の3つのメソッドをオーバーライドするため)、そのスーパークラスを拡張できます。

これで、5つのクラスと3つの実装ができました(NodeGroupとNodeSubGroupは、何もオーバーライドしない単なるシンサブクラスであるため)。

私の質問は-これを3つのクラスにカットし、ファクトリに<group><subgroup>のスーパークラスをインスタンス化させるか、5つのクラスすべてを保持して、スーパークラスを抽象化して、明示的なものがあるかどうかです-クラスとXMLノードタイプの間の1つの関係?


申し訳ありませんが、実装の面で行き詰まらないようにするために、ここでクラスの例を単純化しすぎた可能性があります。私は、5つのノードタイプに対して5つのクラスを用意する必要があるかどうかに焦点を当てようとしています。特に、2つのノードタイプがそれらを使用する必要がある限り同じ動作を示す場合はそうです。 Wordインタラクションを使用することも(私のアプリケーションのコンテキストでは意味がありますが)、悪い選択でした。

これらの各クラスは、オブジェクトが表すノードのドキュメントから必要な関連情報を取得する方法をXMLパーサーに指示します。これらのクラスの一部は、パーサーが取得する情報も操作します。

2
HorusKol

クラスに 複合パターン を使用できるように見えます。 enter image description here

上の図では、CompositeNodeGroupの同義語です。 XMLコンテンツでSubgroupsが表示されている場合にも使用できます。

2
R Sahu