【问题标题】:How do I count modified lines of code?如何计算修改的代码行数?
【发布时间】:2013-11-03 16:09:34
【问题描述】:

我有一个程序计算两个程序的代码行数(不包括 cmets、大括号、空格等),然后比较它们。它将一个程序的所有行放在一个列表中,将另一个程序的行放在另一个列表中。然后它会删除两者之间相同的所有行。一个 List 是添加到程序 1 以获取程序 2 的所有行,另一个 List 是从程序 1 中删除的所有行以获取程序 2。

现在我需要一种方法来检测程序 1 中的多少行代码已被修改以获取程序 2。我找到了 Levenshtein 距离的算法,它似乎可以工作。我只需要将距离与字符串的长度进行比较即可获得百分比变化,并且我需要为阈值提供一个合适的值。

但是我的问题是:我怎么知道要比较哪两个字符串来比较 Levenshtein 距离?我最好的猜测是有一个嵌套的 for 循环,并为另一个程序中的每一行循环一次程序,以将每一行与其他每一行进行比较,以寻找满足我的差异阈值的距离。但是,这似乎非常低效。有没有其他方法可以做到这一点?

我应该添加这是针对软件工程课程的。这在技术上是家庭作业,但我们可以使用我们需要的任何资源。虽然我只是在寻找一种算法,但我会告诉你我正在使用 C#。

【问题讨论】:

  • 你的答案不就是两个列表的总和吗?清单 1 中剩余的内容已删除,清单 2 中剩余的内容已添加。我错过了什么吗?我不知道,定义“代码行”。
  • 一行代码是任何带有分号(并且不是注释)的行,以及其他一些行,如方法头和包含保留字(如 for、while、try 等)的行。修改后的行是程序 2 中与程序 1 中的行非常相似但不相同的行。

标签: c# levenshtein-distance lines-of-code


【解决方案1】:

如果您允许随机排列行,您如何计算更改?即使您比较所有行并找到完全匹配,也不是所有打乱的行都可能产生相同的功能。

如果你比较

var random = new Random();
for (int i = 0; i < 9; i++) {
  int randomNumber = random.Next(1, 50);
} 

for (int i = 0; i < 9; i++) {
  var random = new Random();
  int randomNumber = random.Next(1, 50);
} 

您有四行未更改 行代码,但第二个版本可能会产生不同的结果。代码中肯定有变化,但如果您允许改组,则逐行比较不会检测到它。

这是禁止改组的一个很好的理由,实际上将第一个代码中的第 1 行标记为已删除,将第二个代码中的第 2 行标记为添加,即使删除的行和添加的行完全相同。

一旦你决定了线条不能被洗牌,我想你可以很容易地弄清楚如何匹配你的线条进行比较。

要逐步浏览这两个来源并比较您可能想要查找平衡线算法的线(例如http://www.isqa.unomaha.edu/haworth/isqa3300/fs006.htm

【讨论】:

    【解决方案2】:

    如果您建议将代码行打乱(可以更改它们的顺序),那么您需要将第一个程序的所有行与第二个程序的所有行进行比较,不包括未更改的行。

    您可以简化您的任务,建议行不能被打乱。它们只能插入、删除或更改。根据我的经验,大多数比较文本文件的程序都是这样工作的

    【讨论】:

    • 我没有想过将其限制为仅非随机播放的行。我必须决定这是否是我想要的。感谢您的回答和建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2018-01-05
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多