なんか、XMLとマークアップがらみのネタが続いたので、このノリでXMLについてまとめて書いてみようかなっと、か。
僕は、一方で「トンデモなマークアップでも許して抱擁しよう」とか寛容なことを言い、もう一方では「コメントアウトはやめてくれ、そりゃイカン!」とか強硬に偏狭な主張もしています。こりゃ、いったどうなってんの? 単に一貫性が欠けているだけ -- そうとも言えるんですが(一貫性を美徳とは思ってないのは確か)、いちおうの原則は持っているつもりです。
まず最初の原則は、「他人に迷惑をかけないようにしよう」という幼稚園で教わるようなこと(いや、両親が教えるべきだわな)。コメントアウト反対の根拠はこれで、我も我もとコメント内に非表示データを書き込んでいったら混乱は必至。同一文書にいろいろなコメント内情報が混じって入り込んだとき、処理をどうやってディスパッチするか考えてみると、けっこうエライことですよ。
FooMetainfoとBarActionLanguageとBazAnnotationの3仕様がすべてコメントを利用しているとすると、出現したすべてのコメントが、FooMetainfo処理系、BarActionLanguage処理系、BazAnnotation処理系にそれぞれ渡される必要がありますから、100個のコメントがあれば300回の受け渡しが発生します(これ、単純化してます)。
ある文書に、例えば、FooMetainfoは使われてなくても、FooMetainfo処理系はすべてのコメントを無理やり無駄に食わされます(ウー、ゲンナリ)。一方で、3つの処理系がすべて反応しなかったコメントはホントのコメント(人間のみに有意)だと保証できるか、というとそんなことはありません。FooMetainfo、BarActionLanguage、BazAnnotation以外の未知の仕様によるコメントかもしれません。が、そうだと判断することは原理的に不可能です。
「PIならまだマシ」といったのは、例えば処理系がJavaベースだとして、次のような設定でディスパッチを記述できます。
<piProcessors xmlns="http://xmlnamespaces.org/piconfig">
<binding title="FooMetainfo"
targetName="foo-metainfo"
class="org.foometainfo.FooProcessor" />
<binding title="BarActionLanguagee"
targetName="com.bar.bal"
class="com.bar.bal.Interp" />
<binding title="BazAnnotation"
targetName="BazAnnotation"
class="jp.bazannot.annot.Engine" />
</piProcessors>
// PIハンドラはこんな感じ
package org.foometainfo;
// ...public class FooProcessor implements PiHandler {
public void handlePi(PiHandlingContext context,
String targetName, String data)
throws PiHandlingException {
// do something
}
// ...
}
設定にないターゲット名のPIは無視すればいいのですが、未知のPIが出現したという事実をログに残すことも、明示的な警告を出すこともできます。「未知だ」という事実が確実に判定できるのが重要なのです。
もちろん、名前空間によるディスパッチならさらに良いし、それこそが本来の姿です。
話を戻すと、名前空間付きの要素、せめてPIを使っていれば、割と自然な処理方式を利用できるのに、コメントを使うと、やらなくてもいいことをやらざるを得ず、それでも判断はあやふやなまま、となるのです。相当広い範囲に迷惑がかかるでしょう、これは。
(次に続く)