1

以下は RSS リーダー用の C# のコードですが、なぜこのコードが悪いのでしょうか? このクラスは、タイトルでソートされた最新の 5 件の投稿のリストを生成します。C# でコードを分析するために何を使用しますか?

    static Story[] Parse(string content)
    {
        var items = new List<string>();
        int start = 0;
        while (true)
        {

            var nextItemStart = content.IndexOf("<item>", start);
            var nextItemEnd = content.IndexOf("</item>", nextItemStart);
            if (nextItemStart < 0 || nextItemEnd < 0) break;

            String nextItem = content.Substring(nextItemStart, nextItemEnd + 7 - nextItemStart);
            items.Add(nextItem);
            start = nextItemEnd;
        }

        var stories = new List<Story>();
        for (byte i = 0; i < items.Count; i++)
        {
            stories.Add(new Story()
            {
                title = Regex.Match(items[i], "(?<=<title>).*(?=</title>)").Value,
                link = Regex.Match(items[i], "(?<=<link>).*(?=</link>)").Value,
                date = Regex.Match(items[i], "(?<=<pubDate>).*(?=</pubdate>)").Value
            });
        }

        return stories.ToArray();
    }
4

6 に答える 6

4

XmlReader または XmlDocument または LINQ to Xml を使用しないのはなぜですか?

于 2012-09-26T00:56:55.940 に答える
3

XML を解析するためのフレームワークに優れた クラスがあるのに、文字列の解析を使用しているため、これは悪いことです。さらに良いことに、RSS フィードを扱うクラスがあります。

到着予定時刻:

2 番目の質問に以前に回答していなくて申し訳ありません。C# コードの正確性と品質を分析するためのツールは多数あります。おそらくどこかにコンパイルされた膨大なリストがありますが、コードの品質を確保するために私が日常的に使用しているリストのいくつかを以下に示します。

  • StyleCop (コードフォーマット標準)
  • Resharper (慣用的なプログラミング、落とし穴)
  • FxCop (コードの正確性、標準への準拠、慣用的なプログラミング)
  • Pex (ホワイト ボックス テスト)
  • Nitriq (コード品質メトリクス)
  • NUnit (単体テスト)
于 2012-09-26T01:00:13.297 に答える
1

文字列関数と正規表現を使用して XML を解析しないでください。XML は非常に複雑になり、XmlReader のような実際の XML パーサーが処理できる多くの方法でフォーマットされる可能性がありますが、単純な文字列解析コードが壊れてしまいます。

基本的に、車輪 (xml パーサー) を再発明しようとしないでください。車輪が実際にどれほど複雑であるかを理解していない場合は特にそうです。

于 2012-09-26T00:58:58.663 に答える
1

コードにとって最悪のことはパフォーマンスの問題だと思います。正規表現を使用して何度も解析するのではなく、xml 文字列を XDocument (または同様の構造) に解析する必要があります。

于 2012-09-26T00:59:06.170 に答える
1

手始めに、byte代わりにインデクサーとして使用します (表現できるよりも多くのアイテムが含まれてintいる場合はどうなりますか?)。慣用的な C# は使用しません (user1645569 の応答を参照)。また、特定のデータ型の代わりに不必要に使用します(ただし、これはより文体的ですが、私にとっては好まないため、私のメトリックでは理想的ではありません(他のメトリックを指定していません))。itemsbytevar

var「不必要に使用する」ことについて私が言っていることを明確にさせてくださいvar。それ自体は悪いことではありません。ここでの使用法があまり一貫していないことを(ほとんど)示唆しています。たとえば、明示的に として宣言startint、次に として宣言nextItemEndvar(これは に推論されintます)、 に代入nextItemEndすることstartは、(私には) 変数の型を自動的に推論することと明示的に宣言することの間の奇妙な混合のように思えます。の宣言で が使用されなかったのは良いことだと思います (意図が整数なのか浮動小数点数なのかが明確ではvarないため) 。私は使用することを好む傾向がありますstartnextItemStartnextItemEndvarvarより複雑で長いデータ型の場合 ( autoC++ でイテレータに使用する方法と似ていますが、「単純な」データ型ではありません)。

于 2012-09-26T00:59:16.620 に答える
1

を再発明しているという理由だけで、代わりにxml parser使用Linq to xmlしてください。非常にシンプルでクリーンです。 を使用すると、上記のすべてを 3 行のコードで実行できると確信していますLinq to XML。 ..)、それを不安定にし、非一般的にするもの

于 2012-09-26T01:01:53.047 に答える