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 提要。

预计到达时间:

很抱歉之前没有回答您的第二个问题。有很多工具可以分析 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(如果items其中的项目比byte可以表示的多怎么办?)。它不使用惯用的 C#(请参阅 user1645569 的回复)。它也不必要地使用var而不是特定的数据类型(虽然这更具风格,但对我来说我不喜欢,因此根据我的指标它并不理想(而且你没有给出其他指标))。

让我澄清一下我所说的“不必要地使用var”:var就其本身而言还不错,我并不是在暗示这一点。我(主要)建议这里的用法不是很一致。例如,显式声明startint,但随后声明nextItemEndvar(将推断为int)并分配nextItemEndstart(对我而言)似乎是想要自动推断变量的类型和显式声明它之间的一种奇怪的混合。我认为var在 ' 的声明中没有使用它很好start(因为它的意图是整数还是浮点数并不完全清楚),但我(个人)认为声明nextItemStartnextItemEndas没有任何帮助var。我倾向于使用var对于更复杂/更长的数据类型(类似于我auto在 C++ 中用于迭代器的方式,但不适用于“更简单”的数据类型)。

于 2012-09-26T00:59:16.620 回答
1

仅仅因为你正在重新发明一个xml parser,使用Linq to xml它,它非常简单和干净。我相信如果你使用,你可以在三行代码中完成上述所有操作Linq to XML,你的代码使用了很多幻数(例如:7-n ..),使它不稳定和非通用的东西

于 2012-09-26T01:01:53.047 回答