2

この質問は、私が尋ねた(そして回答された)以前の質問の拡張です。コードをリファクタリングして、さまざまなリファクタリングされたソリューションをいじったり実験したりしています。

私が思いついた解決策の 1 つ (しかし満足できませんでした..覚えておいてください、私はいくつかの個人的なコーディング スタイルを試しているだけです) は次のコードでした:-

if (data is ITagElement)
{
    if (((ITagElement) data).TagList.IsNullOrEmpty())
    {
        ((ITagElement) data).TagList = new List<Tag>();
    }

    ((ITagElement) data).TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
         V = xmlReader.GetAttribute("v")
    });
}

data親オブジェクトを何度も実装するインターフェイス タイプにキャストしていることに注意してください。コードは機能しますが、これはコードの匂いのように感じます->あまり効率的ではありません。私はこれを改善して唱えることができると思います - そこにいるグルからの考えはありますか?

4

3 に答える 3

11

これはどうですか、キャストを 1 回だけ実行します。

ITagElement someData = data as ITagElement
if (someData != null)
{
   if (someData.TagList.IsNullOrEmpty())
    {
        someData.TagList = new List<Tag>();
    }

    someData.TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
         V = xmlReader.GetAttribute("v")
    });

}
于 2008-12-20T23:57:18.157 に答える
3

as 演算子を使用して is を取得し、同じ op でキャストします。

ITagElement tagElement = data as ITagElement;
if (tagElement == null) return;

if (tagElement.TagList.IsNullOrEmpty()) {
   tagElement.TagList = new List<Tag>();
}

tagElement.TagList.Add(new Tag
{
    K = xmlReader.GetAttribute("k"),
    V = xmlReader.GetAttribute("v")
});
于 2008-12-20T23:59:08.077 に答える
2

そのようにするとより明確になると思います:

if (data is ITagElement)
{
    ITagElement dataAsTagElement = (ITagElement)data;
    if (dataAsTagElement.TagList.IsNullOrEmpty())
    {
        dataAsTagElement.TagList = new List<Tag>();
    }

    dataAsTagElement.TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
        V = xmlReader.GetAttribute("v")
    });
}

ポインターと引き換えにキャストを 3 回回避しているため、これはより良い方法です。また、目にもはるかに簡単です!

于 2008-12-20T23:57:54.100 に答える