以下是用于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();
}
答案 0 :(得分:4)
为什么不使用XmlReader或XmlDocument或LINQ to Xml?
答案 1 :(得分:3)
这很糟糕,因为当框架中有excellent classes用于解析XML时,它正在使用字符串解析。更好的是,有classes来处理RSS提要。
<强> ETA:强>
很抱歉,之前没有回答你的第二个问题。有许多工具可用于分析C#代码的正确性和质量。可能在某处编译了一个巨大的列表,但是我每天都会使用一些来帮助确保质量代码:
答案 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
是好的(因为那时意图是整数还是浮点数并不完全清楚),但我(个人)不这样做认为有必要将nextItemStart
和nextItemEnd
声明为var
。我倾向于使用var
来表示更复杂/更长的数据类型(类似于我在C ++中使用auto
作为迭代器的方式,但不适用于“更简单”的数据类型)。
答案 5 :(得分:1)
只是因为你正在重新发明xml parser
,而是使用Linq to xml
,它非常简单和干净。我相信如果使用{{{{}},我可以用三行代码执行以上所有操作1}},你的代码使用了大量的幻数(例如:7-n ..),这使得它不稳定且不通用