blog.tmp.tokyo

No Promises Await at Journey's End

旧世界の黒歴史 Flex の XML の扱い方が「神」だった件

突然ですが本日はプログラミングの技術的かつ専門的かつ割とどうでもいい話です。

職業が SE すなわちシステムエンジニアなどと名乗っておりますが、基本的にプログラマでありたいと思って常々意味のないプログラミングをしては悦に入るのが楽しいです。そんな自称プログラマの私が一番嫌いなのが XML です。最近はそれほど騒がなくなった気もしますが、一時期はこの世の中の全ての事象は XML で表現すべし、とでも言いたげに何でもかんでも XML でデータ構造を保持していました。

<root>
    <a></a>
    <b></b>
</root>

こんなもの考えついたのは誰だよ。余計なこと思いつきやがって。とにかく XML が嫌なのはアクセスしにくい。データ定義なら、

a=あ
b=い

でいいじゃん。さらに意識高くなると、

<root>
    <a id="01" name="名前1" value="あ" />
    <b id="02" name="名前2" value="い" />
</root>

とかやり始めます。.../> のあたりがちょっと意識高い系。で、プログラムでこの XML にアクセスする(つまり読み込んでデータとして取得する)ことが結構面倒なのです。実は今から 10 年ほど前の西暦 2006 年に Java で XML を扱うための機構である JAXB に出会いました。運命の出会いです。革命です。JAXB は XML スキーマとして .xsd のファイルを作っておいて xjc コマンドで XML にアクセスするための Java のプログラムが静的に出力されるものです。

<schema>
     <element name="root">
        <complexType>
            <sequence>
                <element ref="a" minOccurs="1" maxOccurs="1" />
                <element ref="b" minOccurs="1" maxOccurs="1" />
            </sequence>
        </complexType>
    </element>

    <element name="a" type="string">
        <attribute name="id" type="string" />
        <attribute name="name" type="string" />
        <attribute name="value" type="string" />
    </element>

    <element name="b" type="string">
        <attribute name="id" type="string" />
        <attribute name="name" type="string" />
        <attribute name="value" type="string" />
    </element>
</schema>

こんな感じで XML スキーマを書きます。上の例、細かいところは端折ってます。あくまでイメージです。これを xjc でコンパイルすると Java のソースが出てくるのです。

Root root = new Root();
A a = root.getA();
B b = root.getB();

ってな感じで簡単に XML が読めるんです。美しいです。何が美しいかって XML の奇怪な構造を Java のオブジェクト指向に合わせたプログラミングに置き換えて扱えるようにしている点が美しいです。JAXB を考えた人は天才だ!と 2006 年に思ったわけです。

ところが、2016 年。再び衝撃が!

Flex という今はもうただのお荷物としか言いようがない Flash のプログラミングをするための言語のお仕事があって非常に苦しんでいるのですが、これでたまたま XML を作らなきゃいけなくなったのです。JAXB 使いたいなぁと思いつつも Flex じゃダメかと思って調べていたらなんと Flex すごいよ!という急展開。

var xml:XML =
    <root>
        <a>あ</a>
        <b>い</b>
    </root>

と定義すると、

var a:String = xml.a;
var b:String = xml.b;

だけで読めるんです。さらにさらに、

xml.c = "う";

とすれば、

<root>
    <a></a>
    <b></b>
    <c></c>
</root>

という感じに更新されるという神仕様。非常に素晴らしいです。これ 10 年前に知っていたら Flex の布教活動に人生を捧げたかもしれません。もはや iOS にも Android にも相手にされなくなった Flash なのでこのまま静かにお見送りするだけですが。とにかくこれを知って楽しくて仕事で書いてるプログラムを作るのに時間を忘れて 23 時を過ぎていた、というのが本日のお話です。

それではまた。