もう LINQ to XML はいらない(虚実編)

今度は、比較演算子をオーバーライドします。

まず、どんなことがやりたいかというと、

<members>
    <person name='masuda'>masuda tomoaki</person>
    <person name='yamada'>yamada taro</person>
</members>

こんな風な XML があったときに、name 属性が “yamada” の要素をとりたいとします。

この場合のコードを

EXElement el = doc / "members" / "person" % "name" == "yamada";

と書きたい訳ですね。LINQ の文法で言えば、where 句があって、ってことになるのですが、そんな面倒なことを EXDoc ではやりませんッ!!! と言いますか、このあたりがコード上のシンタックスシュガーな訳なのです。

% 演算子を使って属性の値が取れるので、これを == 演算子で比較します。
普通は、bool 値で true/false で返すのですが、それでは意味がないのですね。どうせならば、マッチする要素を取って来てほしい。

なので、== 演算子の戻り値を、bool 型じゃなくて、EXElements 型にしてしまいますw
なんか、後で破綻しそうな気もしますが、別に構いません。C# の文法に則ったまま、ちょっと不思議な言語を作っている気分なので。

そんな訳で、== 演算子を多重定義します。

public static EXElements operator ==(EXAttrs ats, string val)
{
    EXElements items = new EXElements();
    foreach (EXAttr at in ats)
    {
        if (at.Value == val)
        {
            items.Add(at._exElement);
        }
    }
    return items;
}
public static EXElements operator !=(EXAttrs ats, string val)
{
    EXElements items = new EXElements();
    foreach (EXAttr at in ats)
    {
        if (at.Value != val)
        {
            items.Add(at._exElement);
        }
    }
    return items;
}
public override bool Equals(object obj)
{
    return base.Equals(obj);
}
public override int GetHashCode()
{
    return base.GetHashCode();
}

どうやら、== 演算子を多重定義すると自動的に、

・!= 演算子
・Equals メソッド
・GetHashCode メソッド

もオーバーライドする必要があるので、適当に入れておきます。

こうすることで、

EXElement el = doc / "members" / "person" % "name" == "yamada";

このコードが、思った通りに動くようになります。

そう、これって UIDD(User Interface Driven Development)と言ってもいいかもとか、思いました。あるいは、You & I Driven Development とか。

一応 wikipedia にもあるみたい。ちょっと違いますが。
http://ja.wikipedia.org/wiki/UIDD

カテゴリー: 開発, C# パーマリンク