这段代码有多糟糕?

时间:2009-02-25 23:42:17

标签: c# coding-style

我继承了一个用C#编写的在线测验应用程序,这些代码行遍布整个地方。

这个代码有多糟糕?

我可能遇到的潜在问题是什么?

我怎样才能改善它?

代码:

strTestPasses += "<tr valign=\"top\"><td><b>Subject</b></td><td>" + ((Hashtable)((ArrayList)((Hashtable)MultipleTestPasses[i])["HasMultipleDataSet"])[j])["subject"] + "</td></tr>";

12 个答案:

答案 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)

在不了解代码库的大小和范围的情况下,我发现有两件事让我对这段代码感到困扰。

  1. HTML布局未与内容分开。
  2. 主题应从描述性命名函数返回。
  3. 我更喜欢看到类似的内容:

    strTestPassesStringBuilder.Append(newTableRow("Subject", getSubject());
    

    其中和valign选项通过CSS控制。

答案 10 :(得分:1)

((Hashtable)((ArrayList)((Hashtable)MultipleTestPasses[i])["HasMultipleDataSet"])[j])["subject"]

哦......我的眼睛......

答案 11 :(得分:1)

这非常糟糕,因为它包含以下缺陷:

  • 字符串连接,而StringBuilder或View模板可以更好
  • 在非UI层(可能)中查看信息(例如HTML)
  • Ambiguos业务逻辑(“HasMultipleDataSets”)
  • 无类型数据集(列索引值为字符串)
  • 单行代码太多