为什么这段代码不好?

时间:2012-09-26 00:53:50

标签: c#

以下是用于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();
    }

6 个答案:

答案 0 :(得分:4)

为什么不使用XmlReader或XmlDocument或LINQ to Xml?

答案 1 :(得分:3)

这很糟糕,因为当框架中有excellent classes用于解析XML时,它正在使用字符串解析。更好的是,有classes来处理RSS提要。

<强> ETA:

很抱歉,之前没有回答你的第二个问题。有许多工具可用于分析C#代码的正确性和质量。可能在某处编译了一个巨大的列表,但是我每天都会使用一些来帮助确保质量代码:

  • StyleCop(代码格式标准)
  • Resharper(惯用编程,抓住了)
  • FxCop(代码正确性,标准依从性,惯用语编程)
  • Pex(白盒测试)
  • Nitriq(代码质量指标)
  • NUnit(单元测试)

答案 2 :(得分:1)

您不应该使用字符串函数和正则表达式解析XML。 XML可以变得非常复杂,并且可以通过XmlReader等真正的XML解析器处理多种方式进行格式化,但会破坏简单的字符串解析代码。

基本上:不要尝试重新发明轮子(xml解析器),特别是当你没有意识到轮子实际上有多复杂时。

答案 3 :(得分:1)

我认为代码最糟糕的是性能问题。您应该将xml字符串解析为XDocument(或类似结构),而不是使用regex再次解析它。

答案 4 :(得分:1)

首先,它使用byte作为索引器而不是int(如果items中的项目多于byte可以表示的话,该怎么办?)。它不使用惯用的C#(参见user1645569的回复)。它也不必要地使用var而不是特定的数据类型(虽然它更具风格,但对我来说我不喜欢,因此根据我的指标它并不理想(并且你没有给出其他指标)。

让我澄清一下我所说的“不必要地使用var”:var本身并不坏,我并不是在暗示。我(大多数)建议这里的用法不是很一致。例如,明确将start声明为int,然后将nextItemEnd声明为var(将推断为int)并指定nextItemEnd start似乎(对我来说)想要自动推导变量类型并明确声明它之间的奇怪混合。我认为在var的声明中没有使用start是好的(因为那时意图是整数还是浮点数并不完全清楚),但我(个人)不这样做认为有必要将nextItemStartnextItemEnd声明为var。我倾向于使用var来表示更复杂/更长的数据类型(类似于我在C ++中使用auto作为迭代器的方式,但不适用于“更简单”的数据类型)。

答案 5 :(得分:1)

只是因为你正在重新发明xml parser,而是使用Linq to xml,它非常简单和干净。我相信如果使用{{{{}},我可以用三行代码执行以上所有操作1}},你的代码使用了大量的幻数(例如:7-n ..),这使得它不稳定且不通用