このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

XML適用/運用の原則(1):他人に迷惑をかけない

なんか、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を使っていれば、割と自然な処理方式を利用できるのに、コメントを使うと、やらなくてもいいことをやらざるを得ず、それでも判断はあやふやなまま、となるのです。相当広い範囲に迷惑がかかるでしょう、これは。

(次に続く)