Powered by SmartDoc
ENGLISHJAPANESE

STEP 5: 大きすぎるモジュールの分割

$Id: step5.sdoc 1.7 2000/04/14 12:40:02 murata Exp $

大きすぎるモジュールは管理するのが大変です.STEP 5は,モジュールをいくつかのファイルに分割して管理するための機能を説明します.

モジュール分割はなぜ必要か

200の要素型をもつDTDでRELAXで表現すると仮定します.なお,この程度の大きさのDTDはいくつも存在します.RELAXでは,各要素型ごとにelementRuleとtagがそれぞれ必要とします.一つが平均3行としても1200行になります.文書化を積極的に行えば3000行ぐらいの長さになることも考えられます.これは,一つのファイルに格納するにはいささか長すぎます.

DTDのときは,外部パラメタ実体を用いて,大規模なDTDを分割して管理していました.RELAXでも,大規模なモジュールを分割するための機構が必要になります.

include要素

RELAXでは,他のモジュールをinclude要素によって参照することができます.include要素は参照されたモジュールの本体によって置き換えられます.

include要素の使用例を考えてみます.まず,インクルードされる側のモジュールをつぎに示します.

<module
    moduleVersion="1.2"
    relaxCoreVersion="1.0"
    targetNamespace=""
    xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface/>

  <elementRule role="bar" type="emptyString"/>

  <tag name="bar"/>

</module>

このモジュールには,barに関するelementRuletag要素があります.interface要素は空要素です.このモジュールはbar.rlxに格納されているものとします.

次に,このモジュールを参照して取り込む側のモジュールを示します.

<module
    moduleVersion="1.2"
    relaxCoreVersion="1.0"
    targetNamespace=""
    xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface>
    <export label="foo"/>
  </interface>

  <elementRule role="foo">
    <ref label="bar"/>
  </elementRule>

  <tag name="foo"/>

  <include moduleLocation="bar.rlx" />

</module>

このモジュールには,fooに関するelementRuletagが記述されています.モジュールの最後にあるinclude要素は,moduleLocation属性でbar.rlxを指定しています.

include要素は,参照されているモジュールの本体(module要素の内容のうち,interface以降)によって置き換えられます.この例では,つぎのように置き換えられます.

<module
    moduleVersion="1.2"
    relaxCoreVersion="1.0"
    targetNamespace=""
    xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface>
    <export label="foo"/>
  </interface>

  <elementRule role="foo">
    <ref label="bar"/>
  </elementRule>

  <tag name="foo"/>

  <elementRule role="bar" type="emptyString"/>

  <tag name="bar"/>

</module>

interfaceが空でない場合

前節の例では,参照される側のモジュールのinterface要素は空でした.次のように,interface要素に子要素を追加してみます.

<module
    moduleVersion="1.2"
    relaxCoreVersion="1.0"
    targetNamespace=""
    xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface>
    <export label="bar"/>
  </interface>

  <elementRule role="bar" type="emptyString"/>

  <tag name="bar"/>

</module>

この場合には,インクルードされる側のモジュールにあるinterface要素の内容が,インクルードする側のモジュールのinterface要素に追加されます.この例では次のようになります.

<module
    moduleVersion="1.2"
    relaxCoreVersion="1.0"
    targetNamespace=""
    xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface>
    <export label="foo"/>
    <export label="bar"/>
  </interface>

  <elementRule role="foo">
    <ref label="bar"/>
  </elementRule>

  <tag name="foo"/>

  <elementRule role="bar" type="emptyString"/>

  <tag name="bar"/>

</module>

まとめ

STEP 5で,大規模なモジュールも管理できるようになりました.RELAX!