我继承了一个用C#编写的在线测验应用程序,这些代码行遍布整个地方。
这个代码有多糟糕?
我可能遇到的潜在问题是什么?
我怎样才能改善它?
strTestPasses += "<tr valign=\"top\"><td><b>Subject</b></td><td>" + ((Hashtable)((ArrayList)((Hashtable)MultipleTestPasses[i])["HasMultipleDataSet"])[j])["subject"] + "</td></tr>";
答案 0 :(得分:14)
我也讨厌这些“代码行”。当人们问我'你做过的最大项目是什么'时,我会说'1行代码'。当其他人向我挑战时,“你每天能写多少行代码?”,我回复他们说,'只有一个我的兄弟。但这是一条真正的行'
答案 1 :(得分:8)
要开始重构,我可以建议:
TestPassesBuilder.AppendFormat(
"<tr valign='top'><td><b>Subject</b></td><td>{0}</td></tr>",
MultipleTestPasses[i]["HasMultipleDataSet"][j]["subject"]
);
或
TestPassesBuilder.AppendFormat(
"<tr valign='top'><td><b>{0}</b></td><td>{1}</td></tr>",
"Subject",
MultipleTestPasses[i]["HasMultipleDataSet"][j]["subject"]
);
其中TestPassesBuilder
当然是StringBuilder,而MultipleTestPasses
已被转换为使用适当的泛型集合类型而不是ArrayList / HashTable可憎。第二个选项还允许每行的标题在某个时刻被分解为一个变量。
对于下一步,应将MultipleTestPasses转换为真实对象。由于看起来他正在使用硬编码密钥,因此每个“密钥”实际上都对应于一个类的属性。
答案 2 :(得分:7)
它是否通过了单元测试?
答案 3 :(得分:2)
这不是很好,但我看到的情况更糟。
为了不让任何人陷入昏迷或其他不愉快的情节,我不会发布任何例子。
答案 4 :(得分:2)
同样,作为一个主观问题的主观答案,它并不漂亮。再说一次,如果这是一个小网站,可能更容易以“快速和肮脏”的方式做到这一点然后更合适的事情,例如C#/ ASP - &gt; XML - &gt; XSLT - &gt; HTML(或者其他类似的东西 - 我在这里抓住了一些吸管)
答案 5 :(得分:2)
你知道他们怎么说“......只有母亲才能爱......”
嗯,在这种情况下,只有编译器才会喜欢。
答案 6 :(得分:1)
嗯,主观上,我会说它像罪一样丑陋。
答案 7 :(得分:1)
HTML包裹了eww。
答案 8 :(得分:1)
实际上并没有那么糟糕。显然,程序员并没有想到有人会接管他的项目(缺乏专业经验)但是将这些通用哈希表和arraylists重构为更有意义的东西应该不难。
同样在重构时,将字符串文字与 @ 一起用于html。
我个人并不关心他是否使用任何html模板,如果这是一个小项目。模板通常用于小型项目过度杀伤。
答案 9 :(得分:1)
在不了解代码库的大小和范围的情况下,我发现有两件事让我对这段代码感到困扰。
我更喜欢看到类似的内容:
strTestPassesStringBuilder.Append(newTableRow("Subject", getSubject());
其中和valign选项通过CSS控制。
答案 10 :(得分:1)
((Hashtable)((ArrayList)((Hashtable)MultipleTestPasses[i])["HasMultipleDataSet"])[j])["subject"]
哦......我的眼睛......
答案 11 :(得分:1)
这非常糟糕,因为它包含以下缺陷: