当前位置: 首页 > 面试题库 >

超越循环复杂性的代码复杂性分析工具[关闭]

陈泰宁
2023-03-14
问题内容

虽然圈复杂度是一个值得衡量的指标,但我倾向于发现它并不是识别难以维护的代码的有效工具。特别是,我倾向于发现它只是突出显示了某些类型的代码(例如解析器),并且错过了困难的递归,线程和耦合问题以及许多已定义的反模式。

还有哪些其他工具可用来识别有问题的Java代码?

注意,我们已经使用了PMD和FindBugs,我认为它们对于方法级问题的识别非常有用。


问题答案:

我的经验是,查看代码可维护性时最重要的指标是:

  • 循环复杂性,用于识别可能难以理解/修改的大量代码。
  • 嵌套深度,以查找相似的点(嵌套深度高时,CC值自然会很高,但不一定相反,因此对两者进行评分很重要)。
  • 扇入/扇出,以更好地了解方法/类之间的关系以及各个方法的实际重要性。

在检查其他人编写的代码时,包含动态技术通常很有用。只需通过探查器/代码覆盖率工具运行常见使用场景即可发现:

  • 实际执行的代码很多(探查器对此非常有用,只需忽略计时信息,而是查看命中数)。
  • 代码覆盖范围非常适合查找(几乎)无效代码。为了防止您花费时间来重构无论如何很少执行的代码。

诸如任何分析器,代码覆盖率和度量工具之类的常见可疑对象通常将帮助您获取进行这些评估所需的数据。



 类似资料:
  • 如果我有下面的for循环: 我知道外环将迭代次,而内环将为每th从外环迭代一次。 因此,为了确定时间复杂度,我们有一些类似于 不确定如何继续并得到一个封闭形式的时间复杂度。

  • 我想知道下面代码的时间复杂度是O(n^3)还是O(n^2)

  • 我被赋予以下任务: 给出了-2个列表。第一个列表的大小为N1,第二个列表的尺寸为N2。每个列表的元素不相同。编写一段代码,用第一个和第二个列表中的元素创建一个新列表。此列表也不应有相同的元素。还要估计代码的复杂性。 我编写了以下代码: 并假设 getNewList 方法的执行时间与 N1*N2 成正比。在回复中,我收到以下内容,没有任何解释 - “你错了,这段代码的复杂性不是 N1*N2”。 那么

  • 这段代码的时间复杂度是多少?外循环运行n次,但我不确定内循环。如果内环对于i的每个值一直运行到n,它能是O(n^2)吗?

  • 我需要计算C#方法的圈复杂度,并需要根据FXcop 12.0中的CC值定义规则。 我发现像Code Metrics这样的工具提供了计算CC值的功能,但我不知道如何在代码中使用它。基本上,我的要求是通过声纳报告的CC值。 如果有人为此编写了自定义规则或任何想法,请帮助

  • 算法的时间复杂度定义为其运行所需的时间量,作为输入长度的函数。 如果我在C中有一个简单的for循环函数,它针对给定的输入n运行,那么:n的长度是log n(表示它所需的位数)。由于输入为对数n,循环运行n次,因此代码在其输入长度(2^(对数n)=n))中以指数形式运行多次 这个for循环就是一个例子。 但我们永远不会听到任何人说,这样的for-loop程序在其输入(存储n所需的位)中是指数的。为什