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

$Id: step5.html 1.6 2000/02/24 11:35:46 murata Exp $

text by 村田 真

html by 難波 亮丞


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

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

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

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

2. include要素

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

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

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

  <elementRule pred="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/2000/relaxCore">

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

  <elementRule pred="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/2000/relaxCore">

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

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

  <tag name="foo"/>

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

  <tag name="bar"/>

</module>

3. interfaceが空でない場合

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

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

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

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

  <tag name="bar"/>

</module>

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

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

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

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

  <tag name="foo"/>

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

  <tag name="bar"/>

</module>

4. まとめ

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

mura034@attglobal.net

Valid HTML 4.0!